@@ -65,43 +65,32 @@ impl<const N: usize> Encoder for ArrayEncoder<N> {
6565pub struct SliceEncoder < ' e , T : Encodable > {
6666 /// The list of references to the objects we are encoding.
6767 sl : & ' e [ T ] ,
68- /// The length prefix.
69- compact_size : Option < ArrayVec < u8 , SIZE > > ,
7068 /// Encoder for the current object being encoded.
7169 cur_enc : Option < T :: Encoder < ' e > > ,
7270}
7371
7472impl < ' e , T : Encodable > SliceEncoder < ' e , T > {
75- /// Constructs an encoder which encodes the slice with a length prefix.
76- pub fn with_length_prefix ( sl : & ' e [ T ] ) -> Self {
77- let len = sl. len ( ) ;
78- let compact_size = Some ( compact_size:: encode ( len) ) ;
79-
73+ /// Constructs an encoder which encodes the slice _without_ adding the length prefix.
74+ ///
75+ /// To encode with a length prefix consider using the `Encoder2`.
76+ ///
77+ /// E.g, `Encoder2<CompactSizeEncoder, SliceEncoder<'e, Foo>>`.
78+ pub fn without_length_prefix ( sl : & ' e [ T ] ) -> Self {
8079 // In this `map` call we cannot remove the closure. Seems to be a bug in the compiler.
8180 // Perhaps https://github.com/rust-lang/rust/issues/102540 which is 3 years old with
8281 // no replies or even an acknowledgement. We will not bother filing our own issue.
83- Self { sl, compact_size , cur_enc : sl. first ( ) . map ( |x| T :: encoder ( x) ) }
82+ Self { sl, cur_enc : sl. first ( ) . map ( |x| T :: encoder ( x) ) }
8483 }
8584}
8685
8786impl < T : Encodable > Encoder for SliceEncoder < ' _ , T > {
8887 fn current_chunk ( & self ) -> Option < & [ u8 ] > {
89- if let Some ( compact_size) = self . compact_size . as_ref ( ) {
90- return Some ( compact_size) ;
91- }
92-
9388 // `advance` sets `cur_enc` to `None` once the slice encoder is completely exhausted.
9489 // `current_chunk` is required to return `None` if called after the encoder is exhausted.
9590 self . cur_enc . as_ref ( ) . and_then ( T :: Encoder :: current_chunk)
9691 }
9792
9893 fn advance ( & mut self ) -> bool {
99- // Handle compact_size first, regardless of whether we have elements.
100- if self . compact_size . is_some ( ) {
101- self . compact_size = None ;
102- return self . cur_enc . is_some ( ) ;
103- }
104-
10594 let Some ( cur) = self . cur_enc . as_mut ( ) else {
10695 return false ;
10796 } ;
@@ -329,12 +318,10 @@ mod tests {
329318
330319 #[ test]
331320 fn encode_slice_with_elements ( ) {
332- // Should have length prefix chunk, then element chunks, then exhausted.
321+ // Should have the element chunks, then exhausted.
333322 let slice = & [ TestArray ( [ 0x34 , 0x12 , 0x00 , 0x00 ] ) , TestArray ( [ 0x78 , 0x56 , 0x00 , 0x00 ] ) ] ;
334- let mut encoder = SliceEncoder :: with_length_prefix ( slice) ;
323+ let mut encoder = SliceEncoder :: without_length_prefix ( slice) ;
335324
336- assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 2u8 ] [ ..] ) ) ;
337- assert ! ( encoder. advance( ) ) ;
338325 assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x34 , 0x12 , 0x00 , 0x00 ] [ ..] ) ) ;
339326 assert ! ( encoder. advance( ) ) ;
340327 assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x78 , 0x56 , 0x00 , 0x00 ] [ ..] ) ) ;
@@ -344,23 +331,20 @@ mod tests {
344331
345332 #[ test]
346333 fn encode_empty_slice ( ) {
347- // Should have only length prefix chunk (0), then exhausted.
334+ // Should immediately be exhausted.
348335 let slice: & [ TestArray < 4 > ] = & [ ] ;
349- let mut encoder = SliceEncoder :: with_length_prefix ( slice) ;
336+ let mut encoder = SliceEncoder :: without_length_prefix ( slice) ;
350337
351- assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0u8 ] [ ..] ) ) ;
352338 assert ! ( !encoder. advance( ) ) ;
353339 assert_eq ! ( encoder. current_chunk( ) , None ) ;
354340 }
355341
356342 #[ test]
357343 fn encode_slice_with_zero_sized_arrays ( ) {
358- // Should have length prefix chunk, then empty array chunks, then exhausted.
344+ // Should have empty array chunks, then exhausted.
359345 let slice = & [ TestArray ( [ ] ) , TestArray ( [ ] ) ] ;
360- let mut encoder = SliceEncoder :: with_length_prefix ( slice) ;
346+ let mut encoder = SliceEncoder :: without_length_prefix ( slice) ;
361347
362- assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 2u8 ] [ ..] ) ) ;
363- assert ! ( encoder. advance( ) ) ;
364348 assert_eq ! ( encoder. current_chunk( ) , Some ( & [ ] [ ..] ) ) ;
365349 assert ! ( encoder. advance( ) ) ;
366350 assert_eq ! ( encoder. current_chunk( ) , Some ( & [ ] [ ..] ) ) ;
@@ -492,14 +476,12 @@ mod tests {
492476
493477 #[ test]
494478 fn encode_slice_with_array_composition ( ) {
495- // Should encode slice with prefix and elements, then array, then exhausted.
479+ // Should encode slice elements, then array, then exhausted.
496480 let slice = & [ TestArray ( [ 0x10 , 0x11 ] ) , TestArray ( [ 0x12 , 0x13 ] ) ] ;
497- let slice_enc = SliceEncoder :: with_length_prefix ( slice) ;
481+ let slice_enc = SliceEncoder :: without_length_prefix ( slice) ;
498482 let array_enc = TestArray ( [ 0x20 , 0x21 ] ) . encoder ( ) ;
499483 let mut encoder = Encoder2 :: new ( slice_enc, array_enc) ;
500484
501- assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 2u8 ] [ ..] ) ) ;
502- assert ! ( encoder. advance( ) ) ;
503485 assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x10 , 0x11 ] [ ..] ) ) ;
504486 assert ! ( encoder. advance( ) ) ;
505487 assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x12 , 0x13 ] [ ..] ) ) ;
@@ -511,16 +493,14 @@ mod tests {
511493
512494 #[ test]
513495 fn encode_array_with_slice_composition ( ) {
514- // Should encode header array, then slice with prefix and elements, then exhausted.
496+ // Should encode header array, then slice elements, then exhausted.
515497 let header = TestArray ( [ 0xFF , 0xFE ] ) . encoder ( ) ;
516498 let slice = & [ TestArray ( [ 0x01 ] ) , TestArray ( [ 0x02 ] ) , TestArray ( [ 0x03 ] ) ] ;
517- let slice_enc = SliceEncoder :: with_length_prefix ( slice) ;
499+ let slice_enc = SliceEncoder :: without_length_prefix ( slice) ;
518500 let mut encoder = Encoder2 :: new ( header, slice_enc) ;
519501
520502 assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xFF , 0xFE ] [ ..] ) ) ;
521503 assert ! ( encoder. advance( ) ) ;
522- assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 3u8 ] [ ..] ) ) ;
523- assert ! ( encoder. advance( ) ) ;
524504 assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x01 ] [ ..] ) ) ;
525505 assert ! ( encoder. advance( ) ) ;
526506 assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x02 ] [ ..] ) ) ;
@@ -532,25 +512,23 @@ mod tests {
532512
533513 #[ test]
534514 fn encode_multiple_slices_composition ( ) {
535- // Should encode three slices in sequence with prefixes and elements , then exhausted.
515+ // Should encode three slices in sequence, then exhausted.
536516 let slice1 = & [ TestArray ( [ 0xA1 ] ) , TestArray ( [ 0xA2 ] ) ] ;
537517 let slice2: & [ TestArray < 1 > ] = & [ ] ;
538518 let slice3 = & [ TestArray ( [ 0xC1 ] ) , TestArray ( [ 0xC2 ] ) , TestArray ( [ 0xC3 ] ) ] ;
539519
540- let enc1 = SliceEncoder :: with_length_prefix ( slice1) ;
541- let enc2 = SliceEncoder :: with_length_prefix ( slice2) ;
542- let enc3 = SliceEncoder :: with_length_prefix ( slice3) ;
520+ let enc1 = SliceEncoder :: without_length_prefix ( slice1) ;
521+ let enc2 = SliceEncoder :: without_length_prefix ( slice2) ;
522+ let enc3 = SliceEncoder :: without_length_prefix ( slice3) ;
543523 let mut encoder = Encoder3 :: new ( enc1, enc2, enc3) ;
544524
545- assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 2u8 ] [ ..] ) ) ;
546- assert ! ( encoder. advance( ) ) ;
547525 assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xA1 ] [ ..] ) ) ;
548526 assert ! ( encoder. advance( ) ) ;
549527 assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xA2 ] [ ..] ) ) ;
528+
529+ // Skip the empty slice
550530 assert ! ( encoder. advance( ) ) ;
551- assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0u8 ] [ ..] ) ) ;
552- assert ! ( encoder. advance( ) ) ;
553- assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 3u8 ] [ ..] ) ) ;
531+
554532 assert ! ( encoder. advance( ) ) ;
555533 assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xC1 ] [ ..] ) ) ;
556534 assert ! ( encoder. advance( ) ) ;
@@ -566,14 +544,12 @@ mod tests {
566544 // Should encode header, slice with elements, and footer with prefix, then exhausted.
567545 let header = TestBytes ( & [ 0xDE , 0xAD ] ) . encoder ( ) ;
568546 let data_slice = & [ TestArray ( [ 0x01 , 0x02 ] ) , TestArray ( [ 0x03 , 0x04 ] ) ] ;
569- let slice_enc = SliceEncoder :: with_length_prefix ( data_slice) ;
547+ let slice_enc = SliceEncoder :: without_length_prefix ( data_slice) ;
570548 let footer = TestBytes ( & [ 0xBE , 0xEF ] ) . encoder ( ) ;
571549 let mut encoder = Encoder3 :: new ( header, slice_enc, footer) ;
572550
573551 assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0xDE , 0xAD ] [ ..] ) ) ;
574552 assert ! ( encoder. advance( ) ) ;
575- assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 2u8 ] [ ..] ) ) ;
576- assert ! ( encoder. advance( ) ) ;
577553 assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x01 , 0x02 ] [ ..] ) ) ;
578554 assert ! ( encoder. advance( ) ) ;
579555 assert_eq ! ( encoder. current_chunk( ) , Some ( & [ 0x03 , 0x04 ] [ ..] ) ) ;
0 commit comments