From 8fd746999041cf8baed0aa8ec72e9124c350bd0a Mon Sep 17 00:00:00 2001 From: Tobias Bucher Date: Tue, 16 Feb 2016 16:00:38 +0100 Subject: [PATCH] Implement `Clone` for `std::vec::IntoIter` --- src/libcollections/vec.rs | 12 +++++++++++- src/libcollectionstest/vec.rs | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/libcollections/vec.rs b/src/libcollections/vec.rs index 270a01014c14b..49c3552083334 100644 --- a/src/libcollections/vec.rs +++ b/src/libcollections/vec.rs @@ -59,9 +59,10 @@ #![stable(feature = "rust1", since = "1.0.0")] -use alloc::raw_vec::RawVec; use alloc::boxed::Box; use alloc::heap::EMPTY; +use alloc::raw_vec::RawVec; +use borrow::ToOwned; use core::cmp::Ordering; use core::fmt; use core::hash::{self, Hash}; @@ -1633,6 +1634,15 @@ impl DoubleEndedIterator for IntoIter { #[stable(feature = "rust1", since = "1.0.0")] impl ExactSizeIterator for IntoIter {} +#[stable(feature = "vec_into_iter_clone", since = "1.8.0")] +impl Clone for IntoIter { + fn clone(&self) -> IntoIter { + unsafe { + slice::from_raw_parts(self.ptr, self.len()).to_owned().into_iter() + } + } +} + #[stable(feature = "rust1", since = "1.0.0")] impl Drop for IntoIter { #[unsafe_destructor_blind_to_params] diff --git a/src/libcollectionstest/vec.rs b/src/libcollectionstest/vec.rs index 6a47f16c5ca77..ccdbf1092ff1e 100644 --- a/src/libcollectionstest/vec.rs +++ b/src/libcollectionstest/vec.rs @@ -467,6 +467,24 @@ fn test_into_iter_count() { assert_eq!(vec![1, 2, 3].into_iter().count(), 3); } +#[test] +fn test_into_iter_clone() { + fn iter_equal>(it: I, slice: &[i32]) { + let v: Vec = it.collect(); + assert_eq!(&v[..], slice); + } + let mut it = vec![1, 2, 3].into_iter(); + iter_equal(it.clone(), &[1, 2, 3]); + assert_eq!(it.next(), Some(1)); + let mut it = it.rev(); + iter_equal(it.clone(), &[3, 2]); + assert_eq!(it.next(), Some(3)); + iter_equal(it.clone(), &[2]); + assert_eq!(it.next(), Some(2)); + iter_equal(it.clone(), &[]); + assert_eq!(it.next(), None); +} + #[test] fn test_cow_from() { let borrowed: &[_] = &["borrowed", "(slice)"];