@@ -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,7 +1709,7 @@ 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
@@ -1733,6 +1732,27 @@ impl<T> IntoIter<T> {
1733
1732
slice:: from_raw_parts ( self . ptr , self . len ( ) )
1734
1733
}
1735
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
+ }
1736
1756
}
1737
1757
1738
1758
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -1747,14 +1767,14 @@ impl<T> Iterator for IntoIter<T> {
1747
1767
#[ inline]
1748
1768
fn next ( & mut self ) -> Option < T > {
1749
1769
unsafe {
1750
- if self . ptr == self . end {
1770
+ if self . ptr as * const _ == self . end {
1751
1771
None
1752
1772
} else {
1753
1773
if mem:: size_of :: < T > ( ) == 0 {
1754
1774
// purposefully don't use 'ptr.offset' because for
1755
1775
// vectors with 0-size elements this would return the
1756
1776
// same pointer.
1757
- 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 ;
1758
1778
1759
1779
// Use a non-null pointer value
1760
1780
Some ( ptr:: read ( EMPTY as * mut T ) )
@@ -1797,7 +1817,7 @@ impl<T> DoubleEndedIterator for IntoIter<T> {
1797
1817
} else {
1798
1818
if mem:: size_of :: < T > ( ) == 0 {
1799
1819
// See above for why 'ptr.offset' isn't used
1800
- 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 ;
1801
1821
1802
1822
// Use a non-null pointer value
1803
1823
Some ( ptr:: read ( EMPTY as * mut T ) )
0 commit comments