#![cfg(feature = "serde")]
use core::{
hash::{BuildHasher, Hash},
marker::PhantomData,
};
use serde::{
de::{MapAccess, Visitor},
ser::SerializeMap,
Deserialize, Serialize, Serializer,
};
use crate::hash_map::HashMap;
impl<K: Eq + Hash + Serialize, V: Serialize, H: BuildHasher, const F: usize> Serialize
for HashMap<K, V, H, F>
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut ser = serializer.serialize_map(Some(self.len()))?;
for (key, value) in self.iter() {
ser.serialize_entry(key, value)?;
}
ser.end()
}
}
impl<
'de,
K: Eq + Hash + Clone + Deserialize<'de> + 'de,
V: Clone + Deserialize<'de> + 'de,
H: BuildHasher + Default + 'de,
const F: usize,
> Deserialize<'de> for HashMap<K, V, H, F>
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
struct HashMapVisitor<
'de,
K: Eq + Hash + Deserialize<'de>,
V: Deserialize<'de>,
H: BuildHasher,
const F: usize,
>(PhantomData<&'de HashMap<K, V, H, F>>);
impl<
'de,
K: Eq + Hash + Clone + Deserialize<'de>,
V: Clone + Deserialize<'de>,
H: BuildHasher + Default,
const F: usize,
> Visitor<'de> for HashMapVisitor<'de, K, V, H, F>
{
type Value = HashMap<K, V, H, F>;
fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
formatter.write_str("a map")
}
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
where
A: MapAccess<'de>,
{
let mut hm = HashMap::new(Default::default());
while let Some((key, value)) = map.next_entry()? {
hm.insert(key, value);
}
Ok(hm)
}
}
deserializer.deserialize_map(HashMapVisitor(PhantomData))
}
}