Skip to content

Commit c8fc481

Browse files
committed
Auto merge of #31704 - tbu-:pr_vec_into_iter_clone, r=aturon
2 parents d3929b2 + 8fd7469 commit c8fc481

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

src/libcollections/vec.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,10 @@
5959
6060
#![stable(feature = "rust1", since = "1.0.0")]
6161

62-
use alloc::raw_vec::RawVec;
6362
use alloc::boxed::Box;
6463
use alloc::heap::EMPTY;
64+
use alloc::raw_vec::RawVec;
65+
use borrow::ToOwned;
6566
use core::cmp::Ordering;
6667
use core::fmt;
6768
use core::hash::{self, Hash};
@@ -1633,6 +1634,15 @@ impl<T> DoubleEndedIterator for IntoIter<T> {
16331634
#[stable(feature = "rust1", since = "1.0.0")]
16341635
impl<T> ExactSizeIterator for IntoIter<T> {}
16351636

1637+
#[stable(feature = "vec_into_iter_clone", since = "1.8.0")]
1638+
impl<T: Clone> Clone for IntoIter<T> {
1639+
fn clone(&self) -> IntoIter<T> {
1640+
unsafe {
1641+
slice::from_raw_parts(self.ptr, self.len()).to_owned().into_iter()
1642+
}
1643+
}
1644+
}
1645+
16361646
#[stable(feature = "rust1", since = "1.0.0")]
16371647
impl<T> Drop for IntoIter<T> {
16381648
#[unsafe_destructor_blind_to_params]

src/libcollectionstest/vec.rs

+18
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,24 @@ fn test_into_iter_count() {
467467
assert_eq!(vec![1, 2, 3].into_iter().count(), 3);
468468
}
469469

470+
#[test]
471+
fn test_into_iter_clone() {
472+
fn iter_equal<I: Iterator<Item=i32>>(it: I, slice: &[i32]) {
473+
let v: Vec<i32> = it.collect();
474+
assert_eq!(&v[..], slice);
475+
}
476+
let mut it = vec![1, 2, 3].into_iter();
477+
iter_equal(it.clone(), &[1, 2, 3]);
478+
assert_eq!(it.next(), Some(1));
479+
let mut it = it.rev();
480+
iter_equal(it.clone(), &[3, 2]);
481+
assert_eq!(it.next(), Some(3));
482+
iter_equal(it.clone(), &[2]);
483+
assert_eq!(it.next(), Some(2));
484+
iter_equal(it.clone(), &[]);
485+
assert_eq!(it.next(), None);
486+
}
487+
470488
#[test]
471489
fn test_cow_from() {
472490
let borrowed: &[_] = &["borrowed", "(slice)"];

0 commit comments

Comments
 (0)