commonware_codec/types/
vec.rs1use crate::{EncodeSize, Error, RangeCfg, Read, Write};
7#[cfg(not(feature = "std"))]
8use alloc::vec::Vec;
9use bytes::{Buf, BufMut};
10
11impl<T: Write> Write for Vec<T> {
12 #[inline]
13 fn write(&self, buf: &mut impl BufMut) {
14 self.len().write(buf);
15 for item in self {
16 item.write(buf);
17 }
18 }
19}
20
21impl<T: EncodeSize> EncodeSize for Vec<T> {
22 #[inline]
23 fn encode_size(&self) -> usize {
24 self.len().encode_size() + self.iter().map(EncodeSize::encode_size).sum::<usize>()
25 }
26}
27
28impl<T: Read> Read for Vec<T> {
29 type Cfg = (RangeCfg, T::Cfg);
30
31 #[inline]
32 fn read_cfg(buf: &mut impl Buf, (range, cfg): &Self::Cfg) -> Result<Self, Error> {
33 let len = usize::read_cfg(buf, range)?;
34 let mut vec = Vec::with_capacity(len);
35 for _ in 0..len {
36 vec.push(T::read_cfg(buf, cfg)?);
37 }
38 Ok(vec)
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use super::*;
45 use crate::{DecodeRangeExt, Encode};
46 #[cfg(not(feature = "std"))]
47 use alloc::vec;
48
49 #[test]
50 fn test_vec() {
51 let vec_values = [vec![], vec![1u8], vec![1u8, 2u8, 3u8]];
52 for value in vec_values {
53 let encoded = value.encode();
54 assert_eq!(encoded.len(), value.len() * core::mem::size_of::<u8>() + 1);
55
56 let len = value.len();
58 let decoded = Vec::<u8>::decode_range(encoded, len..=len).unwrap();
59 assert_eq!(value, decoded);
60
61 assert!(matches!(
63 Vec::<u8>::decode_range(value.encode(), 0..len),
64 Err(Error::InvalidLength(_))
65 ));
66
67 assert!(matches!(
69 Vec::<u8>::decode_range(value.encode(), len + 1..),
70 Err(Error::InvalidLength(_))
71 ));
72 }
73 }
74
75 #[test]
76 fn test_conformity() {
77 assert_eq!(Vec::<u8>::new().encode(), &[0x00][..]);
78 assert_eq!(
79 vec![0x01u8, 0x02u8, 0x03u8].encode(),
80 &[0x03, 0x01, 0x02, 0x03][..]
81 );
82
83 let v_u16: Vec<u16> = vec![0x1234, 0xABCD];
84 assert_eq!(v_u16.encode(), &[0x02, 0x12, 0x34, 0xAB, 0xCD][..]);
85
86 let v_bool: Vec<bool> = vec![true, false, true];
87 assert_eq!(v_bool.encode(), &[0x03, 0x01, 0x00, 0x01][..]);
88
89 let v_empty_u32: Vec<u32> = Vec::new();
90 assert_eq!(v_empty_u32.encode(), &[0x00][..]);
91
92 let v_long_u8: Vec<u8> = vec![0xCC; 200]; let mut expected_long_u8 = vec![0xC8, 0x01];
95 expected_long_u8.extend_from_slice(&[0xCC; 200]);
96 assert_eq!(v_long_u8.encode(), expected_long_u8.as_slice());
97 }
98}