Skip to main content

bincake_core/
sized_vec.rs

1//! Defines wrapper types for vectors with sizes of various encodings.
2//!
3//! These types implement the `Serialize` trait, allowing them to be serialized to and deserialized
4//! to a byte buffer with the appropriate size prefix.
5//!
6//! They also dereference to `Vec<T>` for ease of use.
7
8use pastey::paste;
9use taped::Tape;
10
11use crate::{DecodeError, EncodeError, Read, Serialize, Write};
12
13/// Initializes a vector with an 8-bit size.
14#[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/// Initializes a vector with a 16-bit size.
22#[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/// Initializes a vector with a 32-bit size.
30#[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/// Initializes a vector with a 64-bit size.
38#[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/// Initializes a vector with a 128-bit size.
46#[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
53/// Implements Serialize for vecs with sizes of various encodings.
54macro_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);