@@ -9,16 +9,30 @@ use alloc::vec::Vec;
99use bytes:: { Buf , BufMut } ;
1010
1111impl < T : Write > Write for Vec < T > {
12+ #[ inline]
13+ fn write ( & self , buf : & mut impl BufMut ) {
14+ self . as_slice ( ) . write ( buf)
15+ }
16+ }
17+
18+ impl < T : EncodeSize > EncodeSize for Vec < T > {
19+ #[ inline]
20+ fn encode_size ( & self ) -> usize {
21+ self . as_slice ( ) . encode_size ( )
22+ }
23+ }
24+
25+ impl < T : Write > Write for & [ T ] {
1226 #[ inline]
1327 fn write ( & self , buf : & mut impl BufMut ) {
1428 self . len ( ) . write ( buf) ;
15- for item in self {
29+ for item in self . iter ( ) {
1630 item. write ( buf) ;
1731 }
1832 }
1933}
2034
21- impl < T : EncodeSize > EncodeSize for Vec < T > {
35+ impl < T : EncodeSize > EncodeSize for & [ T ] {
2236 #[ inline]
2337 fn encode_size ( & self ) -> usize {
2438 self . len ( ) . encode_size ( ) + self . iter ( ) . map ( EncodeSize :: encode_size) . sum :: < usize > ( )
@@ -72,6 +86,33 @@ mod tests {
7286 }
7387 }
7488
89+ #[ test]
90+ fn test_slice ( ) {
91+ let slice_values: [ & [ u8 ] ; 3 ] =
92+ [ [ ] . as_slice ( ) , [ 1u8 ] . as_slice ( ) , [ 1u8 , 2u8 , 3u8 ] . as_slice ( ) ] ;
93+ for value in slice_values {
94+ let encoded = value. encode ( ) ;
95+ assert_eq ! ( encoded. len( ) , core:: mem:: size_of_val( value) + 1 ) ;
96+
97+ // Valid decoding
98+ let len = value. len ( ) ;
99+ let decoded = Vec :: < u8 > :: decode_range ( encoded, len..=len) . unwrap ( ) ;
100+ assert_eq ! ( value, decoded) ;
101+
102+ // Failure for too long
103+ assert ! ( matches!(
104+ Vec :: <u8 >:: decode_range( value. encode( ) , 0 ..len) ,
105+ Err ( Error :: InvalidLength ( _) )
106+ ) ) ;
107+
108+ // Failure for too short
109+ assert ! ( matches!(
110+ Vec :: <u8 >:: decode_range( value. encode( ) , len + 1 ..) ,
111+ Err ( Error :: InvalidLength ( _) )
112+ ) ) ;
113+ }
114+ }
115+
75116 #[ test]
76117 fn test_conformity ( ) {
77118 assert_eq ! ( Vec :: <u8 >:: new( ) . encode( ) , & [ 0x00 ] [ ..] ) ;
0 commit comments