@@ -1446,13 +1446,12 @@ impl<T> IntoIterator for Vec<T> {
1446
1446
#[ inline]
1447
1447
fn into_iter ( mut self ) -> IntoIter < T > {
1448
1448
unsafe {
1449
- let ptr = self . as_mut_ptr ( ) ;
1450
- assume ( !ptr. is_null ( ) ) ;
1451
- let begin = ptr as * const T ;
1449
+ let begin = self . as_mut_ptr ( ) ;
1450
+ assume ( !begin. is_null ( ) ) ;
1452
1451
let end = if mem:: size_of :: < T > ( ) == 0 {
1453
- arith_offset ( ptr as * const i8 , self . len ( ) as isize ) as * const T
1452
+ arith_offset ( begin as * const i8 , self . len ( ) as isize ) as * const T
1454
1453
} else {
1455
- ptr . offset ( self . len ( ) as isize ) as * const T
1454
+ begin . offset ( self . len ( ) as isize ) as * const T
1456
1455
} ;
1457
1456
let buf = ptr:: read ( & self . buf ) ;
1458
1457
mem:: forget ( self ) ;
@@ -1710,10 +1709,52 @@ impl<'a, T> FromIterator<T> for Cow<'a, [T]> where T: Clone {
1710
1709
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1711
1710
pub struct IntoIter < T > {
1712
1711
_buf : RawVec < T > ,
1713
- ptr : * const T ,
1712
+ ptr : * mut T ,
1714
1713
end : * const T ,
1715
1714
}
1716
1715
1716
+ impl < T > IntoIter < T > {
1717
+ /// Returns the remaining items of this iterator as a slice.
1718
+ ///
1719
+ /// # Examples
1720
+ ///
1721
+ /// ```rust
1722
+ /// # #![feature(vec_into_iter_as_slice)]
1723
+ /// let vec = vec!['a', 'b', 'c'];
1724
+ /// let mut into_iter = vec.into_iter();
1725
+ /// assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
1726
+ /// let _ = into_iter.next().unwrap();
1727
+ /// assert_eq!(into_iter.as_slice(), &['b', 'c']);
1728
+ /// ```
1729
+ #[ unstable( feature = "vec_into_iter_as_slice" , issue = "35601" ) ]
1730
+ pub fn as_slice ( & self ) -> & [ T ] {
1731
+ unsafe {
1732
+ slice:: from_raw_parts ( self . ptr , self . len ( ) )
1733
+ }
1734
+ }
1735
+
1736
+ /// Returns the remaining items of this iterator as a mutable slice.
1737
+ ///
1738
+ /// # Examples
1739
+ ///
1740
+ /// ```rust
1741
+ /// # #![feature(vec_into_iter_as_slice)]
1742
+ /// let vec = vec!['a', 'b', 'c'];
1743
+ /// let mut into_iter = vec.into_iter();
1744
+ /// assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']);
1745
+ /// into_iter.as_mut_slice()[2] = 'z';
1746
+ /// assert_eq!(into_iter.next().unwrap(), 'a');
1747
+ /// assert_eq!(into_iter.next().unwrap(), 'b');
1748
+ /// assert_eq!(into_iter.next().unwrap(), 'z');
1749
+ /// ```
1750
+ #[ unstable( feature = "vec_into_iter_as_slice" , issue = "35601" ) ]
1751
+ pub fn as_mut_slice ( & self ) -> & mut [ T ] {
1752
+ unsafe {
1753
+ slice:: from_raw_parts_mut ( self . ptr , self . len ( ) )
1754
+ }
1755
+ }
1756
+ }
1757
+
1717
1758
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
1718
1759
unsafe impl < T : Send > Send for IntoIter < T > { }
1719
1760
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -1726,14 +1767,14 @@ impl<T> Iterator for IntoIter<T> {
1726
1767
#[ inline]
1727
1768
fn next ( & mut self ) -> Option < T > {
1728
1769
unsafe {
1729
- if self . ptr == self . end {
1770
+ if self . ptr as * const _ == self . end {
1730
1771
None
1731
1772
} else {
1732
1773
if mem:: size_of :: < T > ( ) == 0 {
1733
1774
// purposefully don't use 'ptr.offset' because for
1734
1775
// vectors with 0-size elements this would return the
1735
1776
// same pointer.
1736
- self . ptr = arith_offset ( self . ptr as * const i8 , 1 ) as * const T ;
1777
+ self . ptr = arith_offset ( self . ptr as * const i8 , 1 ) as * mut T ;
1737
1778
1738
1779
// Use a non-null pointer value
1739
1780
Some ( ptr:: read ( EMPTY as * mut T ) )
@@ -1776,7 +1817,7 @@ impl<T> DoubleEndedIterator for IntoIter<T> {
1776
1817
} else {
1777
1818
if mem:: size_of :: < T > ( ) == 0 {
1778
1819
// See above for why 'ptr.offset' isn't used
1779
- self . end = arith_offset ( self . end as * const i8 , -1 ) as * const T ;
1820
+ self . end = arith_offset ( self . end as * const i8 , -1 ) as * mut T ;
1780
1821
1781
1822
// Use a non-null pointer value
1782
1823
Some ( ptr:: read ( EMPTY as * mut T ) )
@@ -1796,9 +1837,7 @@ impl<T> ExactSizeIterator for IntoIter<T> {}
1796
1837
#[ stable( feature = "vec_into_iter_clone" , since = "1.8.0" ) ]
1797
1838
impl < T : Clone > Clone for IntoIter < T > {
1798
1839
fn clone ( & self ) -> IntoIter < T > {
1799
- unsafe {
1800
- slice:: from_raw_parts ( self . ptr , self . len ( ) ) . to_owned ( ) . into_iter ( )
1801
- }
1840
+ self . as_slice ( ) . to_owned ( ) . into_iter ( )
1802
1841
}
1803
1842
}
1804
1843
0 commit comments