naia_serde/impls/
vector.rs

1use std::collections::VecDeque;
2
3use crate::{
4    bit_reader::BitReader, bit_writer::BitWrite, error::SerdeErr, serde::Serde,
5    UnsignedVariableInteger,
6};
7
8impl<T: Serde> Serde for Vec<T> {
9    fn ser(&self, writer: &mut dyn BitWrite) {
10        let length = UnsignedVariableInteger::<5>::new(self.len() as u64);
11        length.ser(writer);
12        for item in self {
13            item.ser(writer);
14        }
15    }
16
17    fn de(reader: &mut BitReader) -> Result<Self, SerdeErr> {
18        let length_int = UnsignedVariableInteger::<5>::de(reader)?;
19        let length_usize = length_int.get() as usize;
20        let mut output: Vec<T> = Vec::with_capacity(length_usize);
21        for _ in 0..length_usize {
22            output.push(T::de(reader)?)
23        }
24        Ok(output)
25    }
26
27    fn bit_length(&self) -> u32 {
28        let mut output = 0;
29        let length = UnsignedVariableInteger::<5>::new(self.len() as u64);
30        output += length.bit_length();
31        for item in self {
32            output += item.bit_length();
33        }
34        output
35    }
36}
37
38impl<T: Serde> Serde for VecDeque<T> {
39    fn ser(&self, writer: &mut dyn BitWrite) {
40        let length = UnsignedVariableInteger::<5>::new(self.len() as u64);
41        length.ser(writer);
42        for item in self {
43            item.ser(writer);
44        }
45    }
46
47    fn de(reader: &mut BitReader) -> Result<Self, SerdeErr> {
48        let length_int = UnsignedVariableInteger::<5>::de(reader)?;
49        let length_usize = length_int.get() as usize;
50        let mut output: VecDeque<T> = VecDeque::with_capacity(length_usize);
51        for _ in 0..length_usize {
52            output.push_back(T::de(reader)?)
53        }
54        Ok(output)
55    }
56
57    fn bit_length(&self) -> u32 {
58        let mut output = 0;
59        let length = UnsignedVariableInteger::<5>::new(self.len() as u64);
60        output += length.bit_length();
61        for item in self {
62            output += item.bit_length();
63        }
64        output
65    }
66}
67
68// Tests
69
70#[cfg(test)]
71mod tests {
72    use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
73    use std::collections::VecDeque;
74
75    #[test]
76    fn read_write_vec() {
77        // Write
78        let mut writer = BitWriter::new();
79
80        let in_1 = vec![5, 3, 2, 7];
81        let in_2 = vec![false, false, true, false, true, true, false, true];
82
83        in_1.ser(&mut writer);
84        in_2.ser(&mut writer);
85
86        let buffer = writer.to_bytes();
87
88        // Read
89        let mut reader = BitReader::new(&buffer);
90
91        let out_1: Vec<i32> = Serde::de(&mut reader).unwrap();
92        let out_2: Vec<bool> = Serde::de(&mut reader).unwrap();
93
94        assert_eq!(in_1, out_1);
95        assert_eq!(in_2, out_2);
96    }
97
98    #[test]
99    fn read_write_vec_deque() {
100        // Write
101        let mut writer = BitWriter::new();
102
103        let mut in_1 = VecDeque::<i32>::new();
104        in_1.push_back(5);
105        in_1.push_back(2);
106        in_1.push_back(-7);
107        in_1.push_back(331);
108        in_1.push_back(-527);
109        let mut in_2 = VecDeque::<bool>::new();
110        in_2.push_back(true);
111        in_2.push_back(false);
112        in_2.push_back(false);
113        in_2.push_back(true);
114        in_2.push_back(false);
115        in_2.push_back(true);
116        in_2.push_back(true);
117        in_2.push_back(true);
118
119        in_1.ser(&mut writer);
120        in_2.ser(&mut writer);
121
122        let buffer = writer.to_bytes();
123
124        // Read
125        let mut reader = BitReader::new(&buffer);
126
127        let out_1: VecDeque<i32> = Serde::de(&mut reader).unwrap();
128        let out_2: VecDeque<bool> = Serde::de(&mut reader).unwrap();
129
130        assert_eq!(in_1, out_1);
131        assert_eq!(in_2, out_2);
132    }
133}