Skip to content

Commit d099e30

Browse files
committed
Introduce as_slice method on std::vec::IntoIter struct.
Similar to the `as_slice` method on `core::slice::Iter` struct.
1 parent ae77410 commit d099e30

File tree

3 files changed

+35
-3
lines changed

3 files changed

+35
-3
lines changed

src/libcollections/vec.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1714,6 +1714,27 @@ pub struct IntoIter<T> {
17141714
end: *const T,
17151715
}
17161716

1717+
impl<T> IntoIter<T> {
1718+
/// Returns the remaining items of this iterator as a slice.
1719+
///
1720+
/// # Examples
1721+
///
1722+
/// ```rust
1723+
/// # #![feature(vec_into_iter_as_slice)]
1724+
/// let vec = vec!['a', 'b', 'c'];
1725+
/// let mut into_iter = vec.into_iter();
1726+
/// assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
1727+
/// let _ = into_iter.next().unwrap();
1728+
/// assert_eq!(into_iter.as_slice(), &['b', 'c']);
1729+
/// ```
1730+
#[unstable(feature = "vec_into_iter_as_slice", issue = "35601")]
1731+
pub fn as_slice(&self) -> &[T] {
1732+
unsafe {
1733+
slice::from_raw_parts(self.ptr, self.len())
1734+
}
1735+
}
1736+
}
1737+
17171738
#[stable(feature = "rust1", since = "1.0.0")]
17181739
unsafe impl<T: Send> Send for IntoIter<T> {}
17191740
#[stable(feature = "rust1", since = "1.0.0")]
@@ -1796,9 +1817,7 @@ impl<T> ExactSizeIterator for IntoIter<T> {}
17961817
#[stable(feature = "vec_into_iter_clone", since = "1.8.0")]
17971818
impl<T: Clone> Clone for IntoIter<T> {
17981819
fn clone(&self) -> IntoIter<T> {
1799-
unsafe {
1800-
slice::from_raw_parts(self.ptr, self.len()).to_owned().into_iter()
1801-
}
1820+
self.as_slice().to_owned().into_iter()
18021821
}
18031822
}
18041823

src/libcollectionstest/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#![feature(unboxed_closures)]
2929
#![feature(unicode)]
3030
#![feature(vec_deque_contains)]
31+
#![feature(vec_into_iter_as_slice)]
3132

3233
extern crate collections;
3334
extern crate test;

src/libcollectionstest/vec.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,18 @@ fn test_split_off() {
478478
assert_eq!(vec2, [5, 6]);
479479
}
480480

481+
#[test]
482+
fn test_into_iter_as_slice() {
483+
let vec = vec!['a', 'b', 'c'];
484+
let mut into_iter = vec.into_iter();
485+
assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
486+
let _ = into_iter.next().unwrap();
487+
assert_eq!(into_iter.as_slice(), &['b', 'c']);
488+
let _ = into_iter.next().unwrap();
489+
let _ = into_iter.next().unwrap();
490+
assert_eq!(into_iter.as_slice(), &[]);
491+
}
492+
481493
#[test]
482494
fn test_into_iter_count() {
483495
assert_eq!(vec![1, 2, 3].into_iter().count(), 3);

0 commit comments

Comments
 (0)