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 core::time::Duration;
|
||||||
use std::{
|
use std::{
|
||||||
|
collections::HashMap,
|
||||||
ffi::{CStr, CString},
|
ffi::{CStr, CString},
|
||||||
io::Read,
|
io::Read,
|
||||||
net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6},
|
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 EncodeError {}
|
||||||
impl std::error::Error for DecodeError {}
|
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|
|
//! |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`|
|
//! |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`||
|
//! |atomic| Yes |All `Atomic*` integer types, e.g. `AtomicUsize`, and `AtomicBool`||
|
||||||
//! |derive| Yes |||Enables the `BorrowDecode`, `Decode` and `Encode` derive macros|
|
//! |derive| Yes |||Enables the `BorrowDecode`, `Decode` and `Encode` derive macros|
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,12 @@ fn test_std_commons() {
|
||||||
&*a.read().unwrap() == &*b.read().unwrap()
|
&*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
|
// Borrowed values
|
||||||
let config = bincode::config::Configuration::standard();
|
let config = bincode::config::Configuration::standard();
|
||||||
let mut buffer = [0u8; 1024];
|
let mut buffer = [0u8; 1024];
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue