1use alloc::{collections::BTreeMap, vec::Vec};
6
7#[cfg(feature = "std")]
8use std::{collections::HashMap, hash::Hash};
9
10use crate::{MlsDecode, MlsEncode, MlsSize};
11
12#[cfg(feature = "std")]
13impl<K, V> MlsSize for HashMap<K, V>
14where
15 K: MlsSize,
16 V: MlsSize,
17{
18 fn mls_encoded_len(&self) -> usize {
19 crate::iter::mls_encoded_len(self.iter())
20 }
21}
22
23#[cfg(feature = "std")]
24impl<K, V> MlsEncode for HashMap<K, V>
25where
26 K: MlsEncode + Ord,
27 V: MlsEncode,
28{
29 fn mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error> {
30 use itertools::Itertools;
31 crate::iter::mls_encode(self.iter().sorted_by_key(|(key, _)| *key), writer)
32 }
33}
34
35#[cfg(feature = "std")]
36impl<K, V> MlsDecode for HashMap<K, V>
37where
38 K: MlsDecode + Hash + Eq,
39 V: MlsDecode,
40{
41 fn mls_decode(reader: &mut &[u8]) -> Result<Self, crate::Error> {
42 crate::iter::mls_decode_collection(reader, |data| {
43 let mut items = HashMap::new();
44
45 while !data.is_empty() {
46 items.insert(K::mls_decode(data)?, V::mls_decode(data)?);
47 }
48
49 Ok(items)
50 })
51 }
52}
53
54impl<K, V> MlsSize for BTreeMap<K, V>
55where
56 K: MlsSize,
57 V: MlsSize,
58{
59 fn mls_encoded_len(&self) -> usize {
60 crate::iter::mls_encoded_len(self.iter())
61 }
62}
63
64impl<K, V> MlsEncode for BTreeMap<K, V>
65where
66 K: MlsEncode,
67 V: MlsEncode,
68{
69 fn mls_encode(&self, writer: &mut Vec<u8>) -> Result<(), crate::Error> {
70 crate::iter::mls_encode(self.iter(), writer)
71 }
72}
73
74impl<K, V> MlsDecode for BTreeMap<K, V>
75where
76 K: MlsDecode + Eq + Ord,
77 V: MlsDecode,
78{
79 fn mls_decode(reader: &mut &[u8]) -> Result<Self, crate::Error> {
80 crate::iter::mls_decode_collection(reader, |data| {
81 let mut items = BTreeMap::new();
82
83 while !data.is_empty() {
84 items.insert(K::mls_decode(data)?, V::mls_decode(data)?);
85 }
86
87 Ok(items)
88 })
89 }
90}