mirror of https://git.sr.ht/~stygianentity/bincode
Added Decode/Encode for HashMap<K, V> (#438)
This commit is contained in:
parent
c4fd7efa49
commit
4be23b88de
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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|
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
Loading…
Reference in New Issue