diff --git a/src/de.rs b/src/de.rs index 87d02f85..c83a78e9 100644 --- a/src/de.rs +++ b/src/de.rs @@ -1,4 +1,4 @@ -use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; +use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecMap}; use std::hash::Hash; use std::marker::PhantomData; use std::num::FromPrimitive; @@ -995,6 +995,60 @@ impl Deserialize for HashMap /////////////////////////////////////////////////////////////////////////////// +pub struct VecMapVisitor { + marker: PhantomData>, +} + +impl VecMapVisitor { + #[inline] + pub fn new() -> Self { + VecMapVisitor { + marker: PhantomData, + } + } +} + +impl Visitor for VecMapVisitor + where V: Deserialize, +{ + type Value = VecMap; + + #[inline] + fn visit_unit(&mut self) -> Result, E> + where E: Error, + { + Ok(VecMap::new()) + } + + #[inline] + fn visit_map(&mut self, mut visitor: V_) -> Result, V_::Error> + where V_: MapVisitor, + { + let (len, _) = visitor.size_hint(); + let mut values = VecMap::with_capacity(len); + + while let Some((key, value)) = try!(visitor.visit()) { + values.insert(key, value); + } + + try!(visitor.end()); + + Ok(values) + } +} + +impl Deserialize for VecMap + where V: Deserialize, +{ + fn deserialize(deserializer: &mut D) -> Result, D::Error> + where D: Deserializer, + { + deserializer.visit(VecMapVisitor::new()) + } +} + +/////////////////////////////////////////////////////////////////////////////// + struct PathBufVisitor; impl Visitor for PathBufVisitor { diff --git a/src/lib.rs b/src/lib.rs index 6dc36e14..1909fe0d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ -#![feature(convert, core, std_misc, unicode)] +#![feature(collections, convert, core, std_misc, unicode)] extern crate unicode; diff --git a/src/ser.rs b/src/ser.rs index a63dd783..26fc91cf 100644 --- a/src/ser.rs +++ b/src/ser.rs @@ -1,5 +1,5 @@ use std::collections::hash_state::HashState; -use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; +use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecMap}; use std::hash::Hash; use std::path; use std::rc::Rc; @@ -587,6 +587,17 @@ impl Serialize for HashMap } } +impl Serialize for VecMap + where V: Serialize, +{ + #[inline] + fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + where S: Serializer, + { + serializer.visit_map(MapIteratorVisitor::new(self.iter(), Some(self.len()))) + } +} + /////////////////////////////////////////////////////////////////////////////// impl<'a, T> Serialize for &'a T where T: Serialize {