@@ -265,52 +265,41 @@ impl Drop for FileEncoder {
265
265
}
266
266
}
267
267
268
- macro_rules! file_encoder_write_leb128 {
269
- ( $enc: expr, $value: expr, $int_ty: ty, $fun: ident) => { {
270
- const MAX_ENCODED_LEN : usize = $crate:: leb128:: max_leb128_len:: <$int_ty>( ) ;
268
+ macro_rules! write_leb128 {
269
+ ( $this_fn: ident, $int_ty: ty, $write_leb_fn: ident) => {
270
+ #[ inline]
271
+ fn $this_fn( & mut self , v: $int_ty) {
272
+ const MAX_ENCODED_LEN : usize = $crate:: leb128:: max_leb128_len:: <$int_ty>( ) ;
271
273
272
- // We ensure this during `FileEncoder` construction.
273
- debug_assert!( $enc . capacity( ) >= MAX_ENCODED_LEN ) ;
274
+ // We ensure this during `FileEncoder` construction.
275
+ debug_assert!( self . capacity( ) >= MAX_ENCODED_LEN ) ;
274
276
275
- let mut buffered = $enc . buffered;
277
+ let mut buffered = self . buffered;
276
278
277
- // This can't overflow. See assertion in `FileEncoder::with_capacity`.
278
- if std:: intrinsics:: unlikely( buffered + MAX_ENCODED_LEN > $enc . capacity( ) ) {
279
- $enc . flush( ) ;
280
- buffered = 0 ;
281
- }
279
+ // This can't overflow. See assertion in `FileEncoder::with_capacity`.
280
+ if std:: intrinsics:: unlikely( buffered + MAX_ENCODED_LEN > self . capacity( ) ) {
281
+ self . flush( ) ;
282
+ buffered = 0 ;
283
+ }
282
284
283
- // SAFETY: The above check and flush ensures that there is enough
284
- // room to write the encoded value to the buffer.
285
- let buf = unsafe {
286
- & mut * ( $enc. buf. as_mut_ptr( ) . add( buffered) as * mut [ MaybeUninit <u8 >; MAX_ENCODED_LEN ] )
287
- } ;
285
+ // SAFETY: The above check and flush ensures that there is enough
286
+ // room to write the encoded value to the buffer.
287
+ let buf = unsafe {
288
+ & mut * ( self . buf. as_mut_ptr( ) . add( buffered)
289
+ as * mut [ MaybeUninit <u8 >; MAX_ENCODED_LEN ] )
290
+ } ;
288
291
289
- let encoded = leb128:: $fun( buf, $value) ;
290
- $enc. buffered = buffered + encoded. len( ) ;
291
- } } ;
292
+ let encoded = leb128:: $write_leb_fn( buf, v) ;
293
+ self . buffered = buffered + encoded. len( ) ;
294
+ }
295
+ } ;
292
296
}
293
297
294
298
impl Encoder for FileEncoder {
295
- #[ inline]
296
- fn emit_usize ( & mut self , v : usize ) {
297
- file_encoder_write_leb128 ! ( self , v, usize , write_usize_leb128)
298
- }
299
-
300
- #[ inline]
301
- fn emit_u128 ( & mut self , v : u128 ) {
302
- file_encoder_write_leb128 ! ( self , v, u128 , write_u128_leb128)
303
- }
304
-
305
- #[ inline]
306
- fn emit_u64 ( & mut self , v : u64 ) {
307
- file_encoder_write_leb128 ! ( self , v, u64 , write_u64_leb128)
308
- }
309
-
310
- #[ inline]
311
- fn emit_u32 ( & mut self , v : u32 ) {
312
- file_encoder_write_leb128 ! ( self , v, u32 , write_u32_leb128)
313
- }
299
+ write_leb128 ! ( emit_usize, usize , write_usize_leb128) ;
300
+ write_leb128 ! ( emit_u128, u128 , write_u128_leb128) ;
301
+ write_leb128 ! ( emit_u64, u64 , write_u64_leb128) ;
302
+ write_leb128 ! ( emit_u32, u32 , write_u32_leb128) ;
314
303
315
304
#[ inline]
316
305
fn emit_u16 ( & mut self , v : u16 ) {
@@ -322,25 +311,10 @@ impl Encoder for FileEncoder {
322
311
self . write_one ( v) ;
323
312
}
324
313
325
- #[ inline]
326
- fn emit_isize ( & mut self , v : isize ) {
327
- file_encoder_write_leb128 ! ( self , v, isize , write_isize_leb128)
328
- }
329
-
330
- #[ inline]
331
- fn emit_i128 ( & mut self , v : i128 ) {
332
- file_encoder_write_leb128 ! ( self , v, i128 , write_i128_leb128)
333
- }
334
-
335
- #[ inline]
336
- fn emit_i64 ( & mut self , v : i64 ) {
337
- file_encoder_write_leb128 ! ( self , v, i64 , write_i64_leb128)
338
- }
339
-
340
- #[ inline]
341
- fn emit_i32 ( & mut self , v : i32 ) {
342
- file_encoder_write_leb128 ! ( self , v, i32 , write_i32_leb128)
343
- }
314
+ write_leb128 ! ( emit_isize, isize , write_isize_leb128) ;
315
+ write_leb128 ! ( emit_i128, i128 , write_i128_leb128) ;
316
+ write_leb128 ! ( emit_i64, i64 , write_i64_leb128) ;
317
+ write_leb128 ! ( emit_i32, i32 , write_i32_leb128) ;
344
318
345
319
#[ inline]
346
320
fn emit_i16 ( & mut self , v : i16 ) {
@@ -437,30 +411,19 @@ impl<'a> MemDecoder<'a> {
437
411
}
438
412
439
413
macro_rules! read_leb128 {
440
- ( $dec: expr, $fun: ident) => { { leb128:: $fun( $dec) } } ;
414
+ ( $this_fn: ident, $int_ty: ty, $read_leb_fn: ident) => {
415
+ #[ inline]
416
+ fn $this_fn( & mut self ) -> $int_ty {
417
+ leb128:: $read_leb_fn( self )
418
+ }
419
+ } ;
441
420
}
442
421
443
422
impl < ' a > Decoder for MemDecoder < ' a > {
444
- #[ inline]
445
- fn position ( & self ) -> usize {
446
- // SAFETY: This type guarantees start <= current
447
- unsafe { self . current . sub_ptr ( self . start ) }
448
- }
449
-
450
- #[ inline]
451
- fn read_u128 ( & mut self ) -> u128 {
452
- read_leb128 ! ( self , read_u128_leb128)
453
- }
454
-
455
- #[ inline]
456
- fn read_u64 ( & mut self ) -> u64 {
457
- read_leb128 ! ( self , read_u64_leb128)
458
- }
459
-
460
- #[ inline]
461
- fn read_u32 ( & mut self ) -> u32 {
462
- read_leb128 ! ( self , read_u32_leb128)
463
- }
423
+ read_leb128 ! ( read_usize, usize , read_usize_leb128) ;
424
+ read_leb128 ! ( read_u128, u128 , read_u128_leb128) ;
425
+ read_leb128 ! ( read_u64, u64 , read_u64_leb128) ;
426
+ read_leb128 ! ( read_u32, u32 , read_u32_leb128) ;
464
427
465
428
#[ inline]
466
429
fn read_u16 ( & mut self ) -> u16 {
@@ -480,36 +443,16 @@ impl<'a> Decoder for MemDecoder<'a> {
480
443
}
481
444
}
482
445
483
- #[ inline]
484
- fn read_usize ( & mut self ) -> usize {
485
- read_leb128 ! ( self , read_usize_leb128)
486
- }
487
-
488
- #[ inline]
489
- fn read_i128 ( & mut self ) -> i128 {
490
- read_leb128 ! ( self , read_i128_leb128)
491
- }
492
-
493
- #[ inline]
494
- fn read_i64 ( & mut self ) -> i64 {
495
- read_leb128 ! ( self , read_i64_leb128)
496
- }
497
-
498
- #[ inline]
499
- fn read_i32 ( & mut self ) -> i32 {
500
- read_leb128 ! ( self , read_i32_leb128)
501
- }
446
+ read_leb128 ! ( read_isize, isize , read_isize_leb128) ;
447
+ read_leb128 ! ( read_i128, i128 , read_i128_leb128) ;
448
+ read_leb128 ! ( read_i64, i64 , read_i64_leb128) ;
449
+ read_leb128 ! ( read_i32, i32 , read_i32_leb128) ;
502
450
503
451
#[ inline]
504
452
fn read_i16 ( & mut self ) -> i16 {
505
453
i16:: from_le_bytes ( self . read_array ( ) )
506
454
}
507
455
508
- #[ inline]
509
- fn read_isize ( & mut self ) -> isize {
510
- read_leb128 ! ( self , read_isize_leb128)
511
- }
512
-
513
456
#[ inline]
514
457
fn read_raw_bytes ( & mut self , bytes : usize ) -> & ' a [ u8 ] {
515
458
if bytes > self . remaining ( ) {
@@ -532,6 +475,12 @@ impl<'a> Decoder for MemDecoder<'a> {
532
475
// Since we just checked current == end, the current pointer must be inbounds.
533
476
unsafe { * self . current }
534
477
}
478
+
479
+ #[ inline]
480
+ fn position ( & self ) -> usize {
481
+ // SAFETY: This type guarantees start <= current
482
+ unsafe { self . current . sub_ptr ( self . start ) }
483
+ }
535
484
}
536
485
537
486
// Specializations for contiguous byte sequences follow. The default implementations for slices
0 commit comments