| use crate::{mapref, setref, DashMap, DashSet}; |
| use core::fmt; |
| use core::hash::{BuildHasher, Hash}; |
| use core::marker::PhantomData; |
| use serde::de::{Deserialize, MapAccess, SeqAccess, Visitor}; |
| use serde::ser::{Serialize, SerializeMap, SerializeSeq, Serializer}; |
| use serde::Deserializer; |
| |
| pub struct DashMapVisitor<K, V, S> { |
| marker: PhantomData<fn() -> DashMap<K, V, S>>, |
| } |
| |
| impl<K, V, S> DashMapVisitor<K, V, S> |
| where |
| K: Eq + Hash, |
| S: BuildHasher + Clone, |
| { |
| fn new() -> Self { |
| DashMapVisitor { |
| marker: PhantomData, |
| } |
| } |
| } |
| |
| impl<'de, K, V, S> Visitor<'de> for DashMapVisitor<K, V, S> |
| where |
| K: Deserialize<'de> + Eq + Hash, |
| V: Deserialize<'de>, |
| S: BuildHasher + Clone + Default, |
| { |
| type Value = DashMap<K, V, S>; |
| |
| fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| formatter.write_str("a DashMap") |
| } |
| |
| fn visit_map<M>(self, mut access: M) -> Result<Self::Value, M::Error> |
| where |
| M: MapAccess<'de>, |
| { |
| let map = |
| DashMap::with_capacity_and_hasher(access.size_hint().unwrap_or(0), Default::default()); |
| |
| while let Some((key, value)) = access.next_entry()? { |
| map.insert(key, value); |
| } |
| |
| Ok(map) |
| } |
| } |
| |
| impl<'de, K, V, S> Deserialize<'de> for DashMap<K, V, S> |
| where |
| K: Deserialize<'de> + Eq + Hash, |
| V: Deserialize<'de>, |
| S: BuildHasher + Clone + Default, |
| { |
| fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
| where |
| D: Deserializer<'de>, |
| { |
| deserializer.deserialize_map(DashMapVisitor::<K, V, S>::new()) |
| } |
| } |
| |
| impl<K, V, H> Serialize for DashMap<K, V, H> |
| where |
| K: Serialize + Eq + Hash, |
| V: Serialize, |
| H: BuildHasher + Clone, |
| { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| let mut map = serializer.serialize_map(Some(self.len()))?; |
| |
| for ref_multi in self.iter() { |
| map.serialize_entry(ref_multi.key(), ref_multi.value())?; |
| } |
| |
| map.end() |
| } |
| } |
| |
| pub struct DashSetVisitor<K, S> { |
| marker: PhantomData<fn() -> DashSet<K, S>>, |
| } |
| |
| impl<K, S> DashSetVisitor<K, S> |
| where |
| K: Eq + Hash, |
| S: BuildHasher + Clone, |
| { |
| fn new() -> Self { |
| DashSetVisitor { |
| marker: PhantomData, |
| } |
| } |
| } |
| |
| impl<'de, K, S> Visitor<'de> for DashSetVisitor<K, S> |
| where |
| K: Deserialize<'de> + Eq + Hash, |
| S: BuildHasher + Clone + Default, |
| { |
| type Value = DashSet<K, S>; |
| |
| fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| formatter.write_str("a DashSet") |
| } |
| |
| fn visit_seq<M>(self, mut access: M) -> Result<Self::Value, M::Error> |
| where |
| M: SeqAccess<'de>, |
| { |
| let map = |
| DashSet::with_capacity_and_hasher(access.size_hint().unwrap_or(0), Default::default()); |
| |
| while let Some(key) = access.next_element()? { |
| map.insert(key); |
| } |
| |
| Ok(map) |
| } |
| } |
| |
| impl<'de, K, S> Deserialize<'de> for DashSet<K, S> |
| where |
| K: Deserialize<'de> + Eq + Hash, |
| S: BuildHasher + Clone + Default, |
| { |
| fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
| where |
| D: Deserializer<'de>, |
| { |
| deserializer.deserialize_seq(DashSetVisitor::<K, S>::new()) |
| } |
| } |
| |
| impl<K, H> Serialize for DashSet<K, H> |
| where |
| K: Serialize + Eq + Hash, |
| H: BuildHasher + Clone, |
| { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| let mut seq = serializer.serialize_seq(Some(self.len()))?; |
| |
| for ref_multi in self.iter() { |
| seq.serialize_element(ref_multi.key())?; |
| } |
| |
| seq.end() |
| } |
| } |
| |
| macro_rules! serialize_impl { |
| () => { |
| fn serialize<Ser>(&self, serializer: Ser) -> Result<Ser::Ok, Ser::Error> |
| where |
| Ser: serde::Serializer, |
| { |
| std::ops::Deref::deref(self).serialize(serializer) |
| } |
| }; |
| } |
| |
| // Map |
| impl<'a, K: Eq + Hash, V: Serialize, S: BuildHasher> Serialize |
| for mapref::multiple::RefMulti<'a, K, V, S> |
| { |
| serialize_impl! {} |
| } |
| |
| impl<'a, K: Eq + Hash, V: Serialize, S: BuildHasher> Serialize |
| for mapref::multiple::RefMutMulti<'a, K, V, S> |
| { |
| serialize_impl! {} |
| } |
| |
| impl<'a, K: Eq + Hash, V: Serialize, S: BuildHasher> Serialize for mapref::one::Ref<'a, K, V, S> { |
| serialize_impl! {} |
| } |
| |
| impl<'a, K: Eq + Hash, V: Serialize, S: BuildHasher> Serialize |
| for mapref::one::RefMut<'a, K, V, S> |
| { |
| serialize_impl! {} |
| } |
| |
| impl<'a, K: Eq + Hash, V, T: Serialize, S: BuildHasher> Serialize |
| for mapref::one::MappedRef<'a, K, V, T, S> |
| { |
| serialize_impl! {} |
| } |
| |
| impl<'a, K: Eq + Hash, V, T: Serialize, S: BuildHasher> Serialize |
| for mapref::one::MappedRefMut<'a, K, V, T, S> |
| { |
| serialize_impl! {} |
| } |
| |
| // Set |
| impl<'a, V: Hash + Eq + Serialize, S: BuildHasher> Serialize |
| for setref::multiple::RefMulti<'a, V, S> |
| { |
| serialize_impl! {} |
| } |
| |
| impl<'a, V: Hash + Eq + Serialize, S: BuildHasher> Serialize for setref::one::Ref<'a, V, S> { |
| serialize_impl! {} |
| } |