mls_rs_codec/
map.rs

1// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2// Copyright by contributors to this project.
3// SPDX-License-Identifier: (Apache-2.0 OR MIT)
4
5use 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}