@@ -1796,11 +1796,27 @@ impl<T, A: Allocator> Vec<T, A> {
17961796 #[ unstable( feature = "vec_spare_capacity" , issue = "75017" ) ]
17971797 #[ inline]
17981798 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
17991815 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 )
18041820 }
18051821 }
18061822}
@@ -1862,6 +1878,39 @@ impl<T: Clone, A: Allocator> Vec<T, A> {
18621878 pub fn extend_from_slice ( & mut self , other : & [ T ] ) {
18631879 self . spec_extend ( other. iter ( ) )
18641880 }
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+ }
18651914}
18661915
18671916// 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<
19692018 <T as SpecFromElem >:: from_elem ( elem, n, alloc)
19702019}
19712020
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+
19722077////////////////////////////////////////////////////////////////////////////////
19732078// Common trait implementations for Vec
19742079////////////////////////////////////////////////////////////////////////////////
0 commit comments