djin_protocol/types/collections/
map.rs1use crate::{hint, Parcel, Error, Settings};
2
3use std::collections::{HashMap, BTreeMap};
4use std::hash::Hash;
5
6use std::io::prelude::*;
7
8pub type SizeType = u32;
9
10macro_rules! impl_map_type {
11 ( $ty:ident => K: $( $k_pred:ident ),+ ) => {
12 impl<K, V> Parcel for $ty<K, V>
13 where K: Parcel + $( $k_pred +)+,
14 V: Parcel
15 {
16 const TYPE_NAME: &'static str = stringify!($ty<K,V>);
17
18 fn read_field(read: &mut dyn Read,
19 settings: &Settings,
20 _: &mut hint::Hints) -> Result<Self, Error> {
21 let mut map = $ty::new();
22
23 let length = SizeType::read(read, settings)?;
24
25 for _ in 0..length {
26 let key = K::read(read, settings)?;
27 let value = V::read(read, settings)?;
28
29 map.insert(key, value);
30 }
31
32 Ok(map)
33 }
34
35 fn write_field(&self, write: &mut dyn Write,
36 settings: &Settings,
37 _: &mut hint::Hints) -> Result<(), Error> {
38 (self.len() as SizeType).write(write, settings)?;
39
40 for (key, value) in self.iter() {
41 key.write(write, settings)?;
42 value.write(write, settings)?;
43 }
44
45 Ok(())
46 }
47 }
48 }
49}
50
51impl_map_type!(HashMap => K: Hash, Eq);
52impl_map_type!(BTreeMap => K: Ord);
53