From 48309bfdd034556915d52885c2187ffbfa89f43c Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Thu, 16 Jul 2015 09:58:29 -0400 Subject: [PATCH] Add all of the stdlib collection serialization implementations --- serde/src/lib.rs | 5 ++- serde/src/ser/impls.rs | 89 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 86 insertions(+), 8 deletions(-) diff --git a/serde/src/lib.rs b/serde/src/lib.rs index 70d0b00a..92d86c78 100644 --- a/serde/src/lib.rs +++ b/serde/src/lib.rs @@ -6,10 +6,13 @@ //! leaving serde to perform roughly the same speed as a hand written serializer for a specific //! type. #![doc(html_root_url="http://erickt.github.io/rust-serde")] -#![cfg_attr(feature = "nightly", feature(core, nonzero, zero_one))] +#![cfg_attr(feature = "nightly", feature(collections, core, enumset, nonzero, step_trait, vecmap, zero_one))] extern crate num; +#[cfg(feature = "nightly")] +extern crate collections; + #[cfg(feature = "nightly")] extern crate core; diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index 06d136af..b762c52f 100644 --- a/serde/src/ser/impls.rs +++ b/serde/src/ser/impls.rs @@ -1,7 +1,25 @@ use std::borrow::Cow; -use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; +use std::collections::{ + BinaryHeap, + BTreeMap, + BTreeSet, + LinkedList, + HashMap, + HashSet, + VecDeque, +}; +#[cfg(feature = "nightly")] +use collections::enum_set::{CLike, EnumSet}; +#[cfg(feature = "nightly")] +use std::collections::vec_map::VecMap; use std::hash::Hash; +#[cfg(feature = "nightly")] +use std::iter; use std::marker::PhantomData; +#[cfg(feature = "nightly")] +use std::num; +#[cfg(feature = "nightly")] +use std::ops; use std::path; use std::rc::Rc; use std::sync::Arc; @@ -124,7 +142,7 @@ impl SeqVisitor for SeqIteratorVisitor /////////////////////////////////////////////////////////////////////////////// -impl<'a, T> Serialize for &'a [T] +impl Serialize for [T] where T: Serialize, { #[inline] @@ -182,12 +200,16 @@ array_impls!(30); array_impls!(31); array_impls!(32); -impl Serialize for Vec where T: Serialize { +/////////////////////////////////////////////////////////////////////////////// + +impl Serialize for BinaryHeap + where T: Serialize + Ord +{ #[inline] fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> where S: Serializer, { - (&self[..]).serialize(serializer) + serializer.visit_seq(SeqIteratorVisitor::new(self.iter(), Some(self.len()))) } } @@ -202,6 +224,18 @@ impl Serialize for BTreeSet } } +#[cfg(feature = "nightly")] +impl Serialize for EnumSet + where T: Serialize + CLike +{ + #[inline] + fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + where S: Serializer, + { + serializer.visit_seq(SeqIteratorVisitor::new(self.iter(), Some(self.len()))) + } +} + impl Serialize for HashSet where T: Serialize + Eq + Hash, { @@ -213,6 +247,49 @@ impl Serialize for HashSet } } +impl Serialize for LinkedList + where T: Serialize, +{ + #[inline] + fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + where S: Serializer, + { + serializer.visit_seq(SeqIteratorVisitor::new(self.iter(), Some(self.len()))) + } +} + +#[cfg(feature = "nightly")] +impl Serialize for ops::Range + where A: Serialize + Clone + iter::Step + num::One, + for<'a> &'a A: ops::Add<&'a A, Output = A>, +{ + #[inline] + fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + where S: Serializer, + { + let len = iter::Step::steps_between(&self.start, &self.end, &A::one()); + serializer.visit_seq(SeqIteratorVisitor::new(self.clone(), len)) + } +} + +impl Serialize for Vec where T: Serialize { + #[inline] + fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + where S: Serializer, + { + (&self[..]).serialize(serializer) + } +} + +impl Serialize for VecDeque where T: Serialize { + #[inline] + fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + where S: Serializer, + { + serializer.visit_seq(SeqIteratorVisitor::new(self.iter(), Some(self.len()))) + } +} + /////////////////////////////////////////////////////////////////////////////// impl Serialize for () { @@ -462,8 +539,7 @@ impl Serialize for HashMap } } -// FIXME: `VecMap` is unstable. -/* +#[cfg(feature = "nightly")] impl Serialize for VecMap where V: Serialize, { @@ -474,7 +550,6 @@ impl Serialize for VecMap serializer.visit_map(MapIteratorVisitor::new(self.iter(), Some(self.len()))) } } -*/ ///////////////////////////////////////////////////////////////////////////////