naia_serde/impls/
vector.rs1use 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#[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 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 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 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 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}