@@ -1796,11 +1796,27 @@ impl<T, A: Allocator> Vec<T, A> {
1796
1796
#[ unstable( feature = "vec_spare_capacity" , issue = "75017" ) ]
1797
1797
#[ inline]
1798
1798
pub fn spare_capacity_mut ( & mut self ) -> & mut [ MaybeUninit < T > ] {
1799
+ self . split_at_spare_mut ( ) . 1
1800
+ }
1801
+
1802
+ #[ inline]
1803
+ fn split_at_spare_mut ( & mut self ) -> ( & mut [ T ] , & mut [ MaybeUninit < T > ] ) {
1804
+ let ptr = self . as_mut_ptr ( ) ;
1805
+
1806
+ // Safety:
1807
+ // - `ptr` is guaranteed to be in bounds for `capacity` elements
1808
+ // - `len` is guaranteed to less or equal to `capacity`
1809
+ // - `MaybeUninit<T>` has the same layout as `T`
1810
+ let spare_ptr = unsafe { ptr. cast :: < MaybeUninit < T > > ( ) . add ( self . len ) } ;
1811
+
1812
+ // Safety:
1813
+ // - `ptr` is guaranteed to be valid for `len` elements
1814
+ // - `spare_ptr` is offseted from `ptr` by `len`, so it doesn't overlap `initialized` slice
1799
1815
unsafe {
1800
- slice:: from_raw_parts_mut (
1801
- self . as_mut_ptr ( ) . add ( self . len ) as * mut MaybeUninit < T > ,
1802
- self . buf . capacity ( ) - self . len ,
1803
- )
1816
+ let initialized = slice:: from_raw_parts_mut ( ptr , self . len ) ;
1817
+ let spare = slice :: from_raw_parts_mut ( spare_ptr , self . buf . capacity ( ) - self . len ) ;
1818
+
1819
+ ( initialized , spare )
1804
1820
}
1805
1821
}
1806
1822
}
@@ -1862,6 +1878,39 @@ impl<T: Clone, A: Allocator> Vec<T, A> {
1862
1878
pub fn extend_from_slice ( & mut self , other : & [ T ] ) {
1863
1879
self . spec_extend ( other. iter ( ) )
1864
1880
}
1881
+
1882
+ /// Copies elements from `src` range to the end of the vector.
1883
+ ///
1884
+ /// ## Examples
1885
+ ///
1886
+ /// ```
1887
+ /// #![feature(vec_extend_from_within)]
1888
+ ///
1889
+ /// let mut vec = vec![0, 1, 2, 3, 4];
1890
+ ///
1891
+ /// vec.extend_from_within(2..);
1892
+ /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4]);
1893
+ ///
1894
+ /// vec.extend_from_within(..2);
1895
+ /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1]);
1896
+ ///
1897
+ /// vec.extend_from_within(4..8);
1898
+ /// assert_eq!(vec, [0, 1, 2, 3, 4, 2, 3, 4, 0, 1, 4, 2, 3, 4]);
1899
+ /// ```
1900
+ #[ unstable( feature = "vec_extend_from_within" , issue = "none" ) ]
1901
+ pub fn extend_from_within < R > ( & mut self , src : R )
1902
+ where
1903
+ R : RangeBounds < usize > ,
1904
+ {
1905
+ let range = src. assert_len ( self . len ( ) ) ;
1906
+ self . reserve ( range. len ( ) ) ;
1907
+
1908
+ // SAFETY:
1909
+ // - `assert_len` guarantees that the given range is valid for indexing self
1910
+ unsafe {
1911
+ self . spec_extend_from_within ( range) ;
1912
+ }
1913
+ }
1865
1914
}
1866
1915
1867
1916
// This code generalizes `extend_with_{element,default}`.
@@ -1969,6 +2018,62 @@ pub fn from_elem_in<T: Clone, A: Allocator>(elem: T, n: usize, alloc: A) -> Vec<
1969
2018
<T as SpecFromElem >:: from_elem ( elem, n, alloc)
1970
2019
}
1971
2020
2021
+ trait ExtendFromWithinSpec {
2022
+ /// Safety:
2023
+ /// - `src` needs to be valid index
2024
+ /// - `self.capacity() - self.len()` must be `>= src.len()`
2025
+ unsafe fn spec_extend_from_within ( & mut self , src : Range < usize > ) ;
2026
+ }
2027
+
2028
+ impl < T : Clone , A : Allocator > ExtendFromWithinSpec for Vec < T , A > {
2029
+ default unsafe fn spec_extend_from_within ( & mut self , src : Range < usize > ) {
2030
+ let initialized = {
2031
+ let ( this, spare) = self . split_at_spare_mut ( ) ;
2032
+
2033
+ // Safety:
2034
+ // - caller guaratees that src is a valid index
2035
+ let to_clone = unsafe { this. get_unchecked ( src) } ;
2036
+
2037
+ to_clone. iter ( ) . cloned ( ) . zip ( spare. iter_mut ( ) ) . map ( |( e, s) | s. write ( e) ) . count ( )
2038
+ } ;
2039
+
2040
+ // Safety:
2041
+ // - elements were just initialized
2042
+ unsafe {
2043
+ let new_len = self . len ( ) + initialized;
2044
+ self . set_len ( new_len) ;
2045
+ }
2046
+ }
2047
+ }
2048
+
2049
+ impl < T : Copy , A : Allocator > ExtendFromWithinSpec for Vec < T , A > {
2050
+ unsafe fn spec_extend_from_within ( & mut self , src : Range < usize > ) {
2051
+ let count = src. len ( ) ;
2052
+ {
2053
+ let ( init, spare) = self . split_at_spare_mut ( ) ;
2054
+
2055
+ // Safety:
2056
+ // - caller guaratees that `src` is a valid index
2057
+ let source = unsafe { init. get_unchecked ( src) } ;
2058
+
2059
+ // Safety:
2060
+ // - Both pointers are created from unique slice references (`&mut [_]`)
2061
+ // so they are valid and do not overlap.
2062
+ // - Elements are :Copy so it's OK to to copy them, without doing
2063
+ // anything with the original values
2064
+ // - `count` is equal to the len of `source`, so source is valid for
2065
+ // `count` reads
2066
+ // - `.reserve(count)` guarantees that `spare.len() >= count` so spare
2067
+ // is valid for `count` writes
2068
+ unsafe { ptr:: copy_nonoverlapping ( source. as_ptr ( ) , spare. as_mut_ptr ( ) as _ , count) } ;
2069
+ }
2070
+
2071
+ // Safety:
2072
+ // - The elements were just initialized by `copy_nonoverlapping`
2073
+ self . len += count;
2074
+ }
2075
+ }
2076
+
1972
2077
////////////////////////////////////////////////////////////////////////////////
1973
2078
// Common trait implementations for Vec
1974
2079
////////////////////////////////////////////////////////////////////////////////
0 commit comments