diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/libcollections/vec.rs | 12 | ||||
| -rw-r--r-- | src/libcollectionstest/vec.rs | 18 |
2 files changed, 29 insertions, 1 deletions
diff --git a/src/libcollections/vec.rs b/src/libcollections/vec.rs index 270a01014c1..49c35520833 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<T> DoubleEndedIterator for IntoIter<T> { #[stable(feature = "rust1", since = "1.0.0")] impl<T> ExactSizeIterator for IntoIter<T> {} +#[stable(feature = "vec_into_iter_clone", since = "1.8.0")] +impl<T: Clone> Clone for IntoIter<T> { + fn clone(&self) -> IntoIter<T> { + unsafe { + slice::from_raw_parts(self.ptr, self.len()).to_owned().into_iter() + } + } +} + #[stable(feature = "rust1", since = "1.0.0")] impl<T> Drop for IntoIter<T> { #[unsafe_destructor_blind_to_params] diff --git a/src/libcollectionstest/vec.rs b/src/libcollectionstest/vec.rs index 6a47f16c5ca..ccdbf1092ff 100644 --- a/src/libcollectionstest/vec.rs +++ b/src/libcollectionstest/vec.rs @@ -468,6 +468,24 @@ fn test_into_iter_count() { } #[test] +fn test_into_iter_clone() { + fn iter_equal<I: Iterator<Item=i32>>(it: I, slice: &[i32]) { + let v: Vec<i32> = 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)"]; let owned = vec!["owned", "(vec)"]; |
