@@ -413,79 +413,6 @@ macro_rules! map_first {
413413 ( mapped, two)
414414 } } ;
415415}
416-
417- /// The number of bytes required to encode this number. Note this is always variable width.
418- pub fn usize_encoded_size ( val : usize ) -> usize {
419- if val < U16_SIGNIFIER . into ( ) {
420- 1
421- } else if val <= 0xffff {
422- 3
423- } else if val <= 0xffffffff {
424- 5
425- } else {
426- 9
427- }
428- }
429-
430- /// The number of bytes required to encode this number.
431- /// We only need this for u64 because all other uints can be converted to usize reliably.
432- pub fn encoded_size_var_u64 ( val : u64 ) -> usize {
433- if val < U16_SIGNIFIER . into ( ) {
434- 1
435- } else if val <= 0xffff {
436- 3
437- } else if val <= 0xffffffff {
438- 5
439- } else {
440- 9
441- }
442- }
443-
444- /// Write `uint` to the start of `buffer` and return the remaining part of `buffer`.
445- pub fn encoded_bytes_var_u64 ( uint : u64 , buffer : & mut [ u8 ] ) -> Result < & mut [ u8 ] , EncodingError > {
446- if uint < U16_SIGNIFIER . into ( ) {
447- encode_u8 ( uint as u8 , buffer)
448- } else if uint <= 0xffff {
449- let rest = write_array ( & [ U16_SIGNIFIER ] , buffer) ?;
450- encode_u16 ( uint as u16 , rest)
451- } else if uint <= 0xffffffff {
452- let rest = write_array ( & [ U32_SIGNIFIER ] , buffer) ?;
453- encode_u32 ( uint as u32 , rest)
454- } else {
455- let rest = write_array ( & [ U64_SIGNIFIER ] , buffer) ?;
456- encode_u64 ( uint, rest)
457- }
458- }
459-
460- /// Decode a `usize` from `buffer` and return the remaining bytes.
461- /// This will fail, when we are decoding a `usize` on a usize = u32 machine for data that was originally encoded on a `usize = u64` machine whenever the value is over `u32::MAX`.
462- pub fn decode_usize ( buffer : & [ u8 ] ) -> Result < ( usize , & [ u8 ] ) , EncodingError > {
463- let [ first, rest @ ..] = buffer else {
464- return Err ( EncodingError :: out_of_bounds (
465- "Colud not decode usize, empty buffer" ,
466- ) ) ;
467- } ;
468- let first = * first;
469- if first < U16_SIGNIFIER {
470- Ok ( ( first. into ( ) , rest) )
471- } else if first == U16_SIGNIFIER {
472- let ( out, rest) = decode_u16 ( buffer) ?;
473- return Ok ( ( out. into ( ) , rest) ) ;
474- } else if first == U32_SIGNIFIER {
475- let ( out, rest) = decode_u32 ( buffer) ?;
476- let out: usize = out
477- . try_into ( )
478- . map_err ( |_e| EncodingError :: overflow ( "u32 is bigger than usize" ) ) ?;
479- return Ok ( ( out, rest) ) ;
480- } else {
481- let ( out, rest) = decode_u64 ( buffer) ?;
482- let out: usize = out
483- . try_into ( )
484- . map_err ( |_e| EncodingError :: overflow ( "u64 is bigger than usize" ) ) ?;
485- return Ok ( ( out, rest) ) ;
486- }
487- }
488-
489416/// Split a slice in two at `mid`. Returns encoding error when `mid` is out of bounds.
490417pub fn get_slices_checked ( buffer : & [ u8 ] , mid : usize ) -> Result < ( & [ u8 ] , & [ u8 ] ) , EncodingError > {
491418 buffer. split_at_checked ( mid) . ok_or_else ( || {
@@ -563,7 +490,7 @@ pub fn write_slice<'a>(source: &[u8], buffer: &'a mut [u8]) -> Result<&'a mut [u
563490}
564491
565492fn encoded_size_str ( value : & str ) -> Result < usize , EncodingError > {
566- Ok ( usize_encoded_size ( value. len ( ) ) + value. len ( ) )
493+ Ok ( encoded_size_usize ( value. len ( ) ) + value. len ( ) )
567494}
568495
569496/// Helper to convert a vec to an array, and fail with an encoding error when needed
@@ -577,6 +504,78 @@ pub fn bytes_fixed_from_vec<const N: usize>(value: &[u8]) -> Result<[u8; N], Enc
577504 } )
578505}
579506
507+ /// The number of bytes required to encode this number. Note this is always variable width.
508+ pub fn encoded_size_usize ( val : usize ) -> usize {
509+ if val < U16_SIGNIFIER . into ( ) {
510+ 1
511+ } else if val <= 0xffff {
512+ 3
513+ } else if val <= 0xffffffff {
514+ 5
515+ } else {
516+ 9
517+ }
518+ }
519+
520+ /// The number of bytes required to encode this number.
521+ /// We only need this for u64 because all other uints can be converted to usize reliably.
522+ pub fn encoded_size_var_u64 ( val : u64 ) -> usize {
523+ if val < U16_SIGNIFIER . into ( ) {
524+ 1
525+ } else if val <= 0xffff {
526+ 3
527+ } else if val <= 0xffffffff {
528+ 5
529+ } else {
530+ 9
531+ }
532+ }
533+
534+ /// Write `uint` to the start of `buffer` and return the remaining part of `buffer`.
535+ pub fn encoded_bytes_var_u64 ( uint : u64 , buffer : & mut [ u8 ] ) -> Result < & mut [ u8 ] , EncodingError > {
536+ if uint < U16_SIGNIFIER . into ( ) {
537+ encode_u8 ( uint as u8 , buffer)
538+ } else if uint <= 0xffff {
539+ let rest = write_array ( & [ U16_SIGNIFIER ] , buffer) ?;
540+ encode_u16 ( uint as u16 , rest)
541+ } else if uint <= 0xffffffff {
542+ let rest = write_array ( & [ U32_SIGNIFIER ] , buffer) ?;
543+ encode_u32 ( uint as u32 , rest)
544+ } else {
545+ let rest = write_array ( & [ U64_SIGNIFIER ] , buffer) ?;
546+ encode_u64 ( uint, rest)
547+ }
548+ }
549+
550+ /// Decode a `usize` from `buffer` and return the remaining bytes.
551+ /// This will fail, when we are decoding a `usize` on a usize = u32 machine for data that was originally encoded on a `usize = u64` machine whenever the value is over `u32::MAX`.
552+ pub fn decode_usize ( buffer : & [ u8 ] ) -> Result < ( usize , & [ u8 ] ) , EncodingError > {
553+ let [ first, rest @ ..] = buffer else {
554+ return Err ( EncodingError :: out_of_bounds (
555+ "Colud not decode usize, empty buffer" ,
556+ ) ) ;
557+ } ;
558+ let first = * first;
559+ if first < U16_SIGNIFIER {
560+ Ok ( ( first. into ( ) , rest) )
561+ } else if first == U16_SIGNIFIER {
562+ let ( out, rest) = decode_u16 ( buffer) ?;
563+ return Ok ( ( out. into ( ) , rest) ) ;
564+ } else if first == U32_SIGNIFIER {
565+ let ( out, rest) = decode_u32 ( buffer) ?;
566+ let out: usize = out
567+ . try_into ( )
568+ . map_err ( |_e| EncodingError :: overflow ( "u32 is bigger than usize" ) ) ?;
569+ return Ok ( ( out, rest) ) ;
570+ } else {
571+ let ( out, rest) = decode_u64 ( buffer) ?;
572+ let out: usize = out
573+ . try_into ( )
574+ . map_err ( |_e| EncodingError :: overflow ( "u64 is bigger than usize" ) ) ?;
575+ return Ok ( ( out, rest) ) ;
576+ }
577+ }
578+
580579/// Encoded a fixed sized array to a buffer
581580pub fn encode_bytes_fixed < ' a , const N : usize > (
582581 value : & [ u8 ; N ] ,
@@ -593,23 +592,6 @@ pub fn decode_bytes_fixed<const N: usize>(
593592 //write_array(value, buffer)
594593}
595594
596- impl < const N : usize > CompactEncoding for [ u8 ; N ] {
597- fn encoded_size ( & self ) -> Result < usize , EncodingError > {
598- Ok ( N )
599- }
600-
601- fn encode < ' a > ( & self , buffer : & ' a mut [ u8 ] ) -> Result < & ' a mut [ u8 ] , EncodingError > {
602- write_array ( self , buffer)
603- }
604-
605- fn decode ( buffer : & [ u8 ] ) -> Result < ( Self , & [ u8 ] ) , EncodingError >
606- where
607- Self : Sized ,
608- {
609- take_array ( buffer)
610- }
611- }
612-
613595fn decode_u16 ( buffer : & [ u8 ] ) -> Result < ( u16 , & [ u8 ] ) , EncodingError > {
614596 let ( data, rest) = take_array :: < 2 > ( buffer) ?;
615597 Ok ( ( u16:: from_le_bytes ( data) , rest) )
@@ -725,6 +707,23 @@ fn encode_buffer<'a>(value: &[u8], buffer: &'a mut [u8]) -> Result<&'a mut [u8],
725707 write_slice ( value, rest)
726708}
727709
710+ impl < const N : usize > CompactEncoding for [ u8 ; N ] {
711+ fn encoded_size ( & self ) -> Result < usize , EncodingError > {
712+ Ok ( N )
713+ }
714+
715+ fn encode < ' a > ( & self , buffer : & ' a mut [ u8 ] ) -> Result < & ' a mut [ u8 ] , EncodingError > {
716+ write_array ( self , buffer)
717+ }
718+
719+ fn decode ( buffer : & [ u8 ] ) -> Result < ( Self , & [ u8 ] ) , EncodingError >
720+ where
721+ Self : Sized ,
722+ {
723+ take_array ( buffer)
724+ }
725+ }
726+
728727impl CompactEncoding for u8 {
729728 fn encoded_size ( & self ) -> Result < usize , EncodingError > {
730729 Ok ( 1 )
@@ -763,7 +762,7 @@ impl CompactEncoding for u16 {
763762// NB: we want u32 encoded and decoded as variable sized uint
764763impl CompactEncoding for u32 {
765764 fn encoded_size ( & self ) -> Result < usize , EncodingError > {
766- Ok ( usize_encoded_size ( * self as usize ) )
765+ Ok ( encoded_size_usize ( * self as usize ) )
767766 }
768767
769768 fn encode < ' a > ( & self , buffer : & ' a mut [ u8 ] ) -> Result < & ' a mut [ u8 ] , EncodingError > {
@@ -827,7 +826,7 @@ impl CompactEncoding<String> for str {
827826
828827impl CompactEncoding for Vec < String > {
829828 fn encoded_size ( & self ) -> Result < usize , EncodingError > {
830- let mut out = usize_encoded_size ( self . len ( ) ) ;
829+ let mut out = encoded_size_usize ( self . len ( ) ) ;
831830 for s in self {
832831 out += s. encoded_size ( ) ?;
833832 }
@@ -859,7 +858,7 @@ impl CompactEncoding for Vec<String> {
859858
860859impl CompactEncoding for Vec < u8 > {
861860 fn encoded_size ( & self ) -> Result < usize , EncodingError > {
862- Ok ( usize_encoded_size ( self . len ( ) ) + self . len ( ) )
861+ Ok ( encoded_size_usize ( self . len ( ) ) + self . len ( ) )
863862 }
864863
865864 fn encode < ' a > ( & self , buffer : & ' a mut [ u8 ] ) -> Result < & ' a mut [ u8 ] , EncodingError > {
@@ -977,7 +976,7 @@ impl VecEncodable for u32 {
977976 where
978977 Self : Sized ,
979978 {
980- Ok ( usize_encoded_size ( vec. len ( ) ) + ( vec. len ( ) * 4 ) )
979+ Ok ( encoded_size_usize ( vec. len ( ) ) + ( vec. len ( ) * 4 ) )
981980 }
982981 /// Encode `vec` to `buffer`
983982 fn vec_encode < ' a > ( vec : & [ Self ] , buffer : & ' a mut [ u8 ] ) -> Result < & ' a mut [ u8 ] , EncodingError >
@@ -1013,7 +1012,7 @@ impl<const N: usize> VecEncodable for [u8; N] {
10131012 where
10141013 Self : Sized ,
10151014 {
1016- Ok ( usize_encoded_size ( vec. len ( ) ) + ( vec. len ( ) * N ) )
1015+ Ok ( encoded_size_usize ( vec. len ( ) ) + ( vec. len ( ) * N ) )
10171016 }
10181017}
10191018
@@ -1022,7 +1021,7 @@ impl BoxArrayEncodable for u8 {
10221021 where
10231022 Self : Sized ,
10241023 {
1025- Ok ( usize_encoded_size ( boxed. len ( ) ) + boxed. len ( ) )
1024+ Ok ( encoded_size_usize ( boxed. len ( ) ) + boxed. len ( ) )
10261025 }
10271026
10281027 fn box_encode < ' a > (
@@ -1077,7 +1076,7 @@ mod test {
10771076 }
10781077 macro_rules! check_usize_var_enc_dec {
10791078 ( $size: expr, $value: expr) => {
1080- let mut buffer = vec![ 0 ; usize_encoded_size ( $value) ] ;
1079+ let mut buffer = vec![ 0 ; encoded_size_usize ( $value) ] ;
10811080 assert_eq!( buffer. len( ) , $size) ;
10821081 let remaining = encode_usize_var( & $value, & mut buffer) ?;
10831082 assert!( remaining. is_empty( ) ) ;
0 commit comments