bincake_core/
sized_vec.rs1use pastey::paste;
9use taped::Tape;
10
11use crate::{DecodeError, EncodeError, Read, Serialize, Write};
12
13#[macro_export]
15macro_rules! vec8 {
16 () => { $crate::Vec8::from(vec![]) };
17 ($($x:expr),+ $(,)?) => { $crate::Vec8::from(vec![$($x),+]) };
18 ($x:expr; $n:expr) => { $crate::Vec8::from(vec![$x; $n]) };
19}
20
21#[macro_export]
23macro_rules! vec16 {
24 () => { $crate::Vec16::from(vec![]) };
25 ($($x:expr),+ $(,)?) => { $crate::Vec16::from(vec![$($x),+]) };
26 ($x:expr; $n:expr) => { $crate::Vec16::from(vec![$x; $n]) };
27}
28
29#[macro_export]
31macro_rules! vec32 {
32 () => { $crate::Vec32::from(vec![]) };
33 ($($x:expr),+ $(,)?) => { $crate::Vec32::from(vec![$($x),+]) };
34 ($x:expr; $n:expr) => { $crate::Vec32::from(vec![$x; $n]) };
35}
36
37#[macro_export]
39macro_rules! vec64 {
40 () => { $crate::Vec64::from(vec![]) };
41 ($($x:expr),+ $(,)?) => { $crate::Vec64::from(vec![$($x),+]) };
42 ($x:expr; $n:expr) => { $crate::Vec64::from(vec![$x; $n]) };
43}
44
45#[macro_export]
47macro_rules! vec128 {
48 () => { $crate::Vec128::from(vec![]) };
49 ($($x:expr),+ $(,)?) => { $crate::Vec128::from(vec![$($x),+]) };
50 ($x:expr; $n:expr) => { $crate::Vec128::from(vec![$x; $n]) };
51}
52
53macro_rules! impl_vec_n {
55 ($($width:literal),* $(,)?) => { paste! { $(
56 #[derive(Debug, Clone, PartialEq, Eq)]
57 pub struct [<Vec $width>]<T>(Vec<T>);
58
59 impl<T> From<Vec<T>> for [<Vec $width>]<T> {
60 fn from(v: Vec<T>) -> Self {
61 Self(v)
62 }
63 }
64
65 impl<T> From<[<Vec $width>]<T>> for Vec<T> {
66 fn from(v: [<Vec $width>]<T>) -> Self {
67 v.0
68 }
69 }
70
71 impl<T: Serialize> Serialize for [<Vec $width>]<T> {
72 fn encode(&self, dest: &mut Vec<u8>) -> Result<(), EncodeError> {
73 let len = self.len();
74 let prefix = [<u $width>]::try_from(len).map_err(|_| EncodeError::LengthExceedsPrefix {
75 prefix_size: $width,
76 len,
77 })?;
78 prefix.encode(dest)?;
79 for d in self.iter() {
80 dest.write(d)?;
81 }
82 Ok(())
83 }
84
85 fn decode(src: &mut Tape<'_, u8>) -> Result<Self, DecodeError> {
86 let len = src.read::<[<u $width>]>()? as usize;
87 let mut data = Vec::with_capacity(len);
88 for _ in 0..len {
89 data.push(src.read::<T>()?);
90 }
91 Ok(Self(data))
92 }
93 }
94
95 impl<T> std::ops::Deref for [<Vec $width>]<T> {
96 type Target = Vec<T>;
97
98 fn deref(&self) -> &Self::Target {
99 &self.0
100 }
101 }
102
103 impl<T> std::ops::DerefMut for [<Vec $width>]<T> {
104 fn deref_mut(&mut self) -> &mut Self::Target {
105 &mut self.0
106 }
107 }
108 )*}};
109}
110
111impl_vec_n!(8, 16, 32, 64, 128);