Added Decode/Encode for HashMap<K, V> (#438)

This commit is contained in:
Trangar 2021-11-22 15:18:58 +01:00 committed by GitHub
parent c4fd7efa49
commit 4be23b88de
3 changed files with 40 additions and 1 deletions

View File

@ -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<K, V> Encode for HashMap<K, V>
where
K: Encode,
V: Encode,
{
fn encode<E: Encoder>(&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<K, V> Decode for HashMap<K, V>
where
K: Decode + Eq + std::hash::Hash,
V: Decode,
{
fn decode<D: Decoder>(mut decoder: D) -> Result<Self, DecodeError> {
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)
}
}

View File

@ -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|

View File

@ -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];