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#[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 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 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 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 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}