diff --git a/src/features/impl_std.rs b/src/features/impl_std.rs index aedb0c9..fe53cda 100644 --- a/src/features/impl_std.rs +++ b/src/features/impl_std.rs @@ -6,6 +6,7 @@ use crate::{ }; use core::time::Duration; use std::{ + collections::HashMap, ffi::{CStr, CString}, io::Read, net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}, @@ -345,3 +346,35 @@ impl Decode for SocketAddrV6 { impl std::error::Error for EncodeError {} impl std::error::Error for DecodeError {} + +impl Encode for HashMap +where + K: Encode, + V: Encode, +{ + fn encode(&self, mut encoder: E) -> Result<(), EncodeError> { + crate::enc::encode_slice_len(&mut encoder, self.len())?; + for (k, v) in self.iter() { + Encode::encode(k, &mut encoder)?; + Encode::encode(v, &mut encoder)?; + } + Ok(()) + } +} + +impl Decode for HashMap +where + K: Decode + Eq + std::hash::Hash, + V: Decode, +{ + fn decode(mut decoder: D) -> Result { + let len = crate::de::decode_slice_len(&mut decoder)?; + let mut map = HashMap::with_capacity(len); + for _ in 0..len { + let k = K::decode(&mut decoder)?; + let v = V::decode(&mut decoder)?; + map.insert(k, v); + } + Ok(map) + } +} diff --git a/src/lib.rs b/src/lib.rs index 60748b3..c4358dd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -15,7 +15,7 @@ //! //! |Name |Default?|Supported types for Encode/Decode|Enabled methods |Other| //! |------|--------|-----------------------------------------|-----------------------------------------------------------------|-----| -//! |std | Yes ||`decode_from_reader` and `encode_into_writer`| +//! |std | Yes |`HashMap`|`decode_from_reader` and `encode_into_writer`| //! |alloc | Yes |All common containers in alloc, like `Vec`, `String`, `Box`|`encode_to_vec`| //! |atomic| Yes |All `Atomic*` integer types, e.g. `AtomicUsize`, and `AtomicBool`|| //! |derive| Yes |||Enables the `BorrowDecode`, `Decode` and `Encode` derive macros| diff --git a/tests/std.rs b/tests/std.rs index 7a669a5..14fc7dd 100644 --- a/tests/std.rs +++ b/tests/std.rs @@ -93,6 +93,12 @@ fn test_std_commons() { &*a.read().unwrap() == &*b.read().unwrap() }); + let mut map = std::collections::HashMap::new(); + map.insert("Hello".to_owned(), "world".to_owned()); + map.insert("How".to_owned(), "are".to_owned()); + map.insert("you".to_owned(), "doing?".to_owned()); + the_same(map); + // Borrowed values let config = bincode::config::Configuration::standard(); let mut buffer = [0u8; 1024];