From 46b64537cb227b1611c2f05d4b02fb0f1ac20be1 Mon Sep 17 00:00:00 2001 From: Clar Fon Date: Sun, 28 Oct 2018 17:28:55 -0400 Subject: [PATCH 1/2] Implement Clone, Debug for IntoIter --- src/lib.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 96e7a24..8f08401 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -748,6 +748,30 @@ impl Drop for IntoIter { } } +impl Clone for IntoIter +where + A::Item: Clone, +{ + fn clone(&self) -> IntoIter { + self.v[self.index.to_usize()..] + .iter() + .cloned() + .collect::>() + .into_iter() + } +} + +impl fmt::Debug for IntoIter +where + A::Item: fmt::Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_list() + .entries(&self.v[self.index.to_usize()..]) + .finish() + } +} + /// A draining iterator for `ArrayVec`. pub struct Drain<'a, A> where A: Array, From 2d3c2e3a0fd09bb5afa4a60358c714e52bb240ac Mon Sep 17 00:00:00 2001 From: Clar Fon Date: Sun, 28 Oct 2018 17:39:13 -0400 Subject: [PATCH 2/2] Test IntoIter::clone --- tests/tests.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/tests.rs b/tests/tests.rs index de3507a..7580eab 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -55,6 +55,7 @@ fn test_drop() { let flag = &Cell::new(0); + #[derive(Clone)] struct Bump<'a>(&'a Cell); impl<'a> Drop for Bump<'a> { @@ -105,6 +106,24 @@ fn test_drop() { assert_eq!(flag.get(), 3); } + // test cloning into_iter + flag.set(0); + { + let mut array = ArrayVec::<[_; 3]>::new(); + array.push(Bump(flag)); + array.push(Bump(flag)); + array.push(Bump(flag)); + let mut iter = array.into_iter(); + assert_eq!(flag.get(), 0); + iter.next(); + assert_eq!(flag.get(), 1); + let clone = iter.clone(); + assert_eq!(flag.get(), 1); + drop(clone); + assert_eq!(flag.get(), 3); + drop(iter); + assert_eq!(flag.get(), 5); + } } #[test]