From 6494363a71a6b6f8f59b6baa6bcf81803d273e10 Mon Sep 17 00:00:00 2001 From: Victor Koenders Date: Thu, 3 Mar 2022 13:47:31 +0100 Subject: [PATCH] Added HashSet --- src/features/impl_std.rs | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/features/impl_std.rs b/src/features/impl_std.rs index 4955b352..ab8ed006 100644 --- a/src/features/impl_std.rs +++ b/src/features/impl_std.rs @@ -6,8 +6,9 @@ use crate::{ }; use core::time::Duration; use std::{ - collections::HashMap, + collections::{HashMap, HashSet}, ffi::{CStr, CString}, + hash::Hash, io::Read, net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}, path::{Path, PathBuf}, @@ -392,3 +393,36 @@ where Ok(map) } } + +impl Decode for HashSet +where + T: Decode + Eq + Hash, +{ + fn decode(decoder: &mut D) -> Result { + let len = crate::de::decode_slice_len(decoder)?; + decoder.claim_container_read::(len)?; + + let mut map = HashSet::new(); + for _ in 0..len { + // See the documentation on `unclaim_bytes_read` as to why we're doing this here + decoder.unclaim_bytes_read(core::mem::size_of::()); + + let key = T::decode(decoder)?; + map.insert(key); + } + Ok(map) + } +} + +impl Encode for HashSet +where + T: Encode, +{ + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + crate::enc::encode_slice_len(encoder, self.len())?; + for item in self.iter() { + item.encode(encoder)?; + } + Ok(()) + } +}