Skip to content

Commit 9dd9e2d

Browse files
authored
[codec] Impl Encode for &[T: Encode] (#1513)
1 parent 1741d0a commit 9dd9e2d

1 file changed

Lines changed: 43 additions & 2 deletions

File tree

codec/src/types/vec.rs

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,30 @@ use alloc::vec::Vec;
99
use bytes::{Buf, BufMut};
1010

1111
impl<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

Comments
 (0)