]> git.lizzy.rs Git - rust.git/commitdiff
Introduce `as_slice` method on `std::vec::IntoIter` struct.
authorCorey Farwell <coreyf@rwell.org>
Sun, 7 Aug 2016 04:30:17 +0000 (00:30 -0400)
committerCorey Farwell <coreyf@rwell.org>
Thu, 11 Aug 2016 20:48:43 +0000 (16:48 -0400)
Similar to the `as_slice` method on `core::slice::Iter` struct.

src/libcollections/vec.rs
src/libcollectionstest/lib.rs
src/libcollectionstest/vec.rs

index 8b4fce158de4645d60b1557bde684283d0d21509..696ce3a2a03e920da46d4b5c879349603da488f6 100644 (file)
@@ -1714,6 +1714,27 @@ pub struct IntoIter<T> {
     end: *const T,
 }
 
+impl<T> IntoIter<T> {
+    /// Returns the remaining items of this iterator as a slice.
+    ///
+    /// # Examples
+    ///
+    /// ```rust
+    /// # #![feature(vec_into_iter_as_slice)]
+    /// let vec = vec!['a', 'b', 'c'];
+    /// let mut into_iter = vec.into_iter();
+    /// assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
+    /// let _ = into_iter.next().unwrap();
+    /// assert_eq!(into_iter.as_slice(), &['b', 'c']);
+    /// ```
+    #[unstable(feature = "vec_into_iter_as_slice", issue = "35601")]
+    pub fn as_slice(&self) -> &[T] {
+        unsafe {
+            slice::from_raw_parts(self.ptr, self.len())
+        }
+    }
+}
+
 #[stable(feature = "rust1", since = "1.0.0")]
 unsafe impl<T: Send> Send for IntoIter<T> {}
 #[stable(feature = "rust1", since = "1.0.0")]
@@ -1796,9 +1817,7 @@ 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()
-        }
+        self.as_slice().to_owned().into_iter()
     }
 }
 
index 8ae63808f27404b9abdc4406b6eab7ef40b251f6..ab3231b2b9955e693540cd5f111a5961b934c632 100644 (file)
@@ -28,6 +28,7 @@
 #![feature(unboxed_closures)]
 #![feature(unicode)]
 #![feature(vec_deque_contains)]
+#![feature(vec_into_iter_as_slice)]
 
 extern crate collections;
 extern crate test;
index 7a6bd958a5f8c7cb915c5756e055d1d25a65be78..0302b180aff564d3e88d65aeea6543327d50ad6d 100644 (file)
@@ -478,6 +478,18 @@ fn test_split_off() {
     assert_eq!(vec2, [5, 6]);
 }
 
+#[test]
+fn test_into_iter_as_slice() {
+    let vec = vec!['a', 'b', 'c'];
+    let mut into_iter = vec.into_iter();
+    assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
+    let _ = into_iter.next().unwrap();
+    assert_eq!(into_iter.as_slice(), &['b', 'c']);
+    let _ = into_iter.next().unwrap();
+    let _ = into_iter.next().unwrap();
+    assert_eq!(into_iter.as_slice(), &[]);
+}
+
 #[test]
 fn test_into_iter_count() {
     assert_eq!(vec![1, 2, 3].into_iter().count(), 3);