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, 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]