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