naia_serde/impls/
hash.rs

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