naia_serde/impls/
boxed.rs1use 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#[cfg(test)]
62mod tests {
63 use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
64
65 #[test]
66 fn read_write() {
67 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 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}