naia_serde/impls/
boxed.rs

1use crate::{
2    bit_reader::BitReader,
3    bit_writer::BitWrite,
4    error::SerdeErr,
5    serde::{ConstBitLength, Serde},
6    UnsignedVariableInteger,
7};
8
9impl<T: Serde> Serde for Box<T> {
10    fn ser(&self, writer: &mut dyn BitWrite) {
11        (**self).ser(writer)
12    }
13
14    fn de(reader: &mut BitReader) -> Result<Box<T>, SerdeErr> {
15        Ok(Box::new(Serde::de(reader)?))
16    }
17
18    fn bit_length(&self) -> u32 {
19        (**self).bit_length()
20    }
21}
22
23impl<T: ConstBitLength> ConstBitLength for Box<T> {
24    fn const_bit_length() -> u32 {
25        return T::const_bit_length();
26    }
27}
28
29impl Serde for Box<[u8]> {
30    fn ser(&self, writer: &mut dyn BitWrite) {
31        let length = UnsignedVariableInteger::<9>::new(self.len() as u64);
32        length.ser(writer);
33        let bytes: &[u8] = self;
34        for byte in bytes {
35            writer.write_byte(*byte);
36        }
37    }
38
39    fn de(reader: &mut BitReader) -> Result<Box<[u8]>, SerdeErr> {
40        let length_int = UnsignedVariableInteger::<9>::de(reader)?;
41        let length_usize = length_int.get() as usize;
42        let mut bytes: Vec<u8> = Vec::with_capacity(length_usize);
43        for _ in 0..length_usize {
44            bytes.push(reader.read_byte()?);
45        }
46
47        Ok(bytes.into_boxed_slice())
48    }
49
50    fn bit_length(&self) -> u32 {
51        let mut output = 0;
52        let length = UnsignedVariableInteger::<9>::new(self.len() as u64);
53        output += length.bit_length();
54        output += (self.len() as u32) * 8;
55        output
56    }
57}
58
59// Tests
60
61#[cfg(test)]
62mod tests {
63    use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
64
65    #[test]
66    fn read_write() {
67        // Write
68        let mut writer = BitWriter::new();
69
70        let in_1 = Box::new(123);
71        let in_2 = Box::new(true);
72
73        in_1.ser(&mut writer);
74        in_2.ser(&mut writer);
75
76        let buffer = writer.to_bytes();
77
78        //Read
79        let mut reader = BitReader::new(&buffer);
80
81        let out_1 = Box::<u8>::de(&mut reader).unwrap();
82        let out_2 = Box::<bool>::de(&mut reader).unwrap();
83
84        assert_eq!(in_1, out_1);
85        assert_eq!(in_2, out_2);
86    }
87}