diff --git a/src/lib.rs b/src/lib.rs index 4961e28..d981ae4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -216,11 +216,18 @@ where K: Collapse // TODO: Replace with `SmallVec<[Page; 1]>` when feature that adds `smallvec` is enabled (this will allocate the first page on the stack, and the rest on the heap. pub struct Map(Vec>); -#[derive(Default)] +#[cfg(feature = "serde")] struct MapVisitor { _pd: core::marker::PhantomData<(TKey, TValue)>, } +#[cfg(feature = "serde")] +impl<'de, TKey, TValue> serde::de::Deserialize<'de> for Map where TKey: Collapse + serde::Deserialize<'de>, TValue: serde::Deserialize<'de> { + fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de> { + deserializer.deserialize_map(MapVisitor { _pd: core::marker::PhantomData::default() }) + } +} + /// Just taken from [serde.rs' examples](https://serde.rs/deserialize-map.html) #[cfg(feature = "serde")] impl<'de, TKey, TValue> serde::de::Visitor<'de> for MapVisitor where TKey: Collapse + serde::Deserialize<'de>, TValue: serde::Deserialize<'de> { @@ -231,7 +238,7 @@ impl<'de, TKey, TValue> serde::de::Visitor<'de> for MapVisitor whe } fn visit_map(self, mut access: A) -> Result where A: serde::de::MapAccess<'de> { - let mut map = Map::with_capacity(access.size_hint().unwrap_or(0)); + let mut map = Map::with_capacity(access.size_hint().unwrap_or(1)); while let Some((key, value)) = access.next_entry()? { map.insert(key, value); }