@@ -180,9 +180,9 @@ const U32_SIZE: usize = 4;
180180const U64_SIZE : usize = 8 ;
181181
182182/// Encoded size of a network port
183- pub const PORT_ENCODED_SIZE : usize = 2 ; // u16
183+ pub const PORT_ENCODED_SIZE : usize = 2 ; // ports are unsigned 16-bit integers ( u16)
184184/// Encoded size of an ipv4 address
185- pub const IPV4_ADDR_ENCODED_SIZE : usize = U32_SIZE ;
185+ pub const IPV4_ADDR_ENCODED_SIZE : usize = 4 ;
186186/// Encoded size of an ipv6 address
187187pub const IPV6_ADDR_ENCODED_SIZE : usize = 16 ;
188188/// Encoded size for a [`SocketAddrV4`], an ipv4 address plus port.
@@ -254,7 +254,7 @@ pub trait CompactEncoding<Decode: ?Sized = Self> {
254254}
255255
256256/// Implement this for type `T` to have `CompactEncoding` implemented for `Vec<T>`
257- pub trait VecEncodable : CompactEncoding {
257+ pub trait VecEncodable < Decode = Self > : CompactEncoding < Decode > {
258258 /// Calculate the resulting size in bytes of `vec`
259259 fn vec_encoded_size ( vec : & [ Self ] ) -> Result < usize , EncodingError >
260260 where
@@ -263,15 +263,15 @@ pub trait VecEncodable: CompactEncoding {
263263 /// Encode `vec` to `buffer`
264264 fn vec_encode < ' a > ( vec : & [ Self ] , buffer : & ' a mut [ u8 ] ) -> Result < & ' a mut [ u8 ] , EncodingError >
265265 where
266- Self : Sized ,
266+ Self : Sized + CompactEncoding ,
267267 {
268268 encode_vec ( vec, buffer)
269269 }
270270
271- /// Decode [`Vec<Self >`] from buffer
272- fn vec_decode ( buffer : & [ u8 ] ) -> Result < ( Vec < Self > , & [ u8 ] ) , EncodingError >
271+ /// Decode [`Vec<Decode >`] from buffer
272+ fn vec_decode ( buffer : & [ u8 ] ) -> Result < ( Vec < Decode > , & [ u8 ] ) , EncodingError >
273273 where
274- Self : Sized ,
274+ Decode : Sized + CompactEncoding ,
275275 {
276276 decode_vec ( buffer)
277277 }
@@ -955,6 +955,22 @@ impl CompactEncoding for Vec<u8> {
955955 decode_buffer_vec ( buffer)
956956 }
957957}
958+ impl CompactEncoding < Vec < u8 > > for & [ u8 ] {
959+ fn encoded_size ( & self ) -> Result < usize , EncodingError > {
960+ Ok ( encoded_size_usize ( self . len ( ) ) + self . len ( ) )
961+ }
962+
963+ fn encode < ' a > ( & self , buffer : & ' a mut [ u8 ] ) -> Result < & ' a mut [ u8 ] , EncodingError > {
964+ encode_buffer ( self , buffer)
965+ }
966+
967+ fn decode ( buffer : & [ u8 ] ) -> Result < ( Vec < u8 > , & [ u8 ] ) , EncodingError >
968+ where
969+ Self : Sized ,
970+ {
971+ decode_buffer_vec ( buffer)
972+ }
973+ }
958974
959975impl CompactEncoding for Ipv4Addr {
960976 fn encoded_size ( & self ) -> std:: result:: Result < usize , EncodingError > {
@@ -1063,6 +1079,31 @@ impl<T: VecEncodable> CompactEncoding for Vec<T> {
10631079 }
10641080}
10651081
1082+ impl < T , D > CompactEncoding < Vec < D > > for & [ T ]
1083+ where
1084+ T : VecEncodable < D > + CompactEncoding < D > ,
1085+ D : CompactEncoding ,
1086+ {
1087+ fn encoded_size ( & self ) -> Result < usize , EncodingError > {
1088+ T :: vec_encoded_size ( self )
1089+ }
1090+
1091+ fn encode < ' a > ( & self , buffer : & ' a mut [ u8 ] ) -> Result < & ' a mut [ u8 ] , EncodingError > {
1092+ let mut rest = encode_usize_var ( & self . len ( ) , buffer) ?;
1093+ for x in * self {
1094+ rest = x. encode ( rest) ?;
1095+ }
1096+ Ok ( rest)
1097+ }
1098+
1099+ fn decode ( buffer : & [ u8 ] ) -> Result < ( Vec < D > , & [ u8 ] ) , EncodingError >
1100+ where
1101+ D : Sized ,
1102+ {
1103+ decode_vec ( buffer)
1104+ }
1105+ }
1106+
10661107/// Get the encoded size for a Vec with elements which have a fixed size encoding.
10671108pub fn vec_encoded_size_for_fixed_sized_elements < T : CompactEncoding > (
10681109 vec : & [ T ] ,
@@ -1255,6 +1296,19 @@ impl VecEncodable for Vec<u8> {
12551296 }
12561297}
12571298
1299+ impl VecEncodable < Vec < u8 > > for & [ u8 ] {
1300+ fn vec_encoded_size ( vec : & [ Self ] ) -> Result < usize , EncodingError >
1301+ where
1302+ Self : Sized ,
1303+ {
1304+ let mut out = encoded_size_usize ( vec. len ( ) ) ;
1305+ for v in vec {
1306+ out += v. encoded_size ( ) ?;
1307+ }
1308+ Ok ( out)
1309+ }
1310+ }
1311+
12581312#[ cfg( test) ]
12591313mod test {
12601314 use super :: * ;
@@ -1289,8 +1343,21 @@ mod test {
12891343 Ok ( ( ) )
12901344 }
12911345 #[ test]
1292- fn enc_dec_vec_vec ( ) -> Result < ( ) , EncodingError > {
1346+ fn enc_dec_vec_vec_u8 ( ) -> Result < ( ) , EncodingError > {
12931347 let input = vec ! [ b"hello" . to_vec( ) , b"goodbye" . to_vec( ) ] ;
1348+ let buf = input. as_slice ( ) . to_encoded_bytes ( ) ?;
1349+ let ( result, rest) : ( Vec < Vec < u8 > > , & [ u8 ] ) = Vec :: < Vec < u8 > > :: decode ( & buf) ?;
1350+ assert_eq ! ( result. len( ) , input. len( ) ) ;
1351+ for ( i, v) in result. iter ( ) . enumerate ( ) {
1352+ assert_eq ! ( v, & input[ i] ) ;
1353+ }
1354+ assert ! ( rest. is_empty( ) ) ;
1355+ Ok ( ( ) )
1356+ }
1357+
1358+ #[ test]
1359+ fn enc_dec_slice_slice_u8 ( ) -> Result < ( ) , EncodingError > {
1360+ let input: & [ & [ u8 ] ] = & [ b"hello" . as_slice ( ) , b"goodbye" . as_slice ( ) ] ;
12941361 let buf = input. to_encoded_bytes ( ) ?;
12951362 let ( result, rest) : ( Vec < Vec < u8 > > , & [ u8 ] ) = Vec :: < Vec < u8 > > :: decode ( & buf) ?;
12961363 assert_eq ! ( result. len( ) , input. len( ) ) ;
0 commit comments