From 756bff534fc4b66b61b0bad74802da729cf38b6f Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 12 Jan 2017 19:24:35 +0100 Subject: [PATCH 1/4] make `ser::iterator` more general by taking `IntoIterator` --- serde/src/ser/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/serde/src/ser/mod.rs b/serde/src/ser/mod.rs index 942ad984..1583adf9 100644 --- a/serde/src/ser/mod.rs +++ b/serde/src/ser/mod.rs @@ -431,8 +431,8 @@ pub struct Iterator(RefCell>) /// serialize the given iterator as a sequence #[cfg(feature = "unstable")] pub fn iterator(iter: I) -> Iterator - where ::Item: Serialize, - I: iter::Iterator + where ::Item: Serialize, + I: iter::IntoIterator { - Iterator(RefCell::new(Some(iter))) + Iterator(RefCell::new(Some(iter.into_iter()))) } From 5edfdba9406775d9cef1664ee75adf8f7497830c Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 12 Jan 2017 20:05:26 +0100 Subject: [PATCH 2/4] use IntoIterator everywhere --- serde/src/ser/mod.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/serde/src/ser/mod.rs b/serde/src/ser/mod.rs index 1583adf9..94deb203 100644 --- a/serde/src/ser/mod.rs +++ b/serde/src/ser/mod.rs @@ -22,8 +22,6 @@ use collections::String; use core::marker::PhantomData; #[cfg(feature = "unstable")] use core::cell::RefCell; -#[cfg(feature = "unstable")] -use core::iter; pub mod impls; @@ -424,15 +422,15 @@ pub trait Serializer { /// every time you want to serialize an iterator. #[cfg(feature = "unstable")] pub struct Iterator(RefCell>) - where ::Item: Serialize, - I: iter::Iterator; + where ::Item: Serialize, + I: IntoIterator; /// Creates a temporary type that can be passed to any function expecting a `Serialize` and will /// serialize the given iterator as a sequence #[cfg(feature = "unstable")] pub fn iterator(iter: I) -> Iterator - where ::Item: Serialize, - I: iter::IntoIterator + where ::Item: Serialize, + I: IntoIterator { Iterator(RefCell::new(Some(iter.into_iter()))) } From 2d1a60c056ad5113c624c1cbf23dbcf90790aed5 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 12 Jan 2017 20:06:44 +0100 Subject: [PATCH 3/4] Update the Serialize impl, too --- serde/src/ser/impls.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/serde/src/ser/impls.rs b/serde/src/ser/impls.rs index 17cd872b..4be35fc3 100644 --- a/serde/src/ser/impls.rs +++ b/serde/src/ser/impls.rs @@ -226,7 +226,7 @@ array_impls!(32); #[cfg(feature = "unstable")] impl<'a, I> Serialize for Iterator - where I: iter::Iterator, ::Item: Serialize + where I: IntoIterator, ::Item: Serialize { #[inline] fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> @@ -234,7 +234,7 @@ impl<'a, I> Serialize for Iterator { // FIXME: use specialization to prevent invalidating the object in case of clonable iterators? let iter = match self.0.borrow_mut().take() { - Some(iter) => iter, + Some(iter) => iter.into_iter(), None => return Err(S::Error::custom("Iterator used twice")), }; let size = match iter.size_hint() { From 5e6ee523d26d7856323e8c88e60ad00b2476c468 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 12 Jan 2017 21:52:38 +0100 Subject: [PATCH 4/4] remove duplicate into_iter --- serde/src/ser/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/serde/src/ser/mod.rs b/serde/src/ser/mod.rs index 94deb203..cacaa6dd 100644 --- a/serde/src/ser/mod.rs +++ b/serde/src/ser/mod.rs @@ -432,5 +432,5 @@ pub fn iterator(iter: I) -> Iterator where ::Item: Serialize, I: IntoIterator { - Iterator(RefCell::new(Some(iter.into_iter()))) + Iterator(RefCell::new(Some(iter))) }