@@ -182,11 +182,16 @@ impl<T, A: Allocator> VecDeque<T, A> {
182182        unsafe  {  ptr:: read ( self . ptr ( ) . add ( off) )  } 
183183    } 
184184
185-     /// Writes an element into the buffer, moving it. 
185+     /// Writes an element into the buffer, moving it and returning a pointer to it. 
186+ /// # Safety 
187+ /// 
188+ /// May only be called if `off < self.capacity()`. 
186189#[ inline]  
187-     unsafe  fn  buffer_write ( & mut  self ,  off :  usize ,  value :  T )  { 
190+     unsafe  fn  buffer_write ( & mut  self ,  off :  usize ,  value :  T )  ->  & mut   T   { 
188191        unsafe  { 
189-             ptr:: write ( self . ptr ( ) . add ( off) ,  value) ; 
192+             let  ptr = self . ptr ( ) . add ( off) ; 
193+             ptr:: write ( ptr,  value) ; 
194+             & mut  * ptr
190195        } 
191196    } 
192197
@@ -1888,16 +1893,34 @@ impl<T, A: Allocator> VecDeque<T, A> {
18881893#[ stable( feature = "rust1" ,  since = "1.0.0" ) ]  
18891894    #[ track_caller]  
18901895    pub  fn  push_front ( & mut  self ,  value :  T )  { 
1896+         let  _ = self . push_front_mut ( value) ; 
1897+     } 
1898+ 
1899+     /// Prepends an element to the deque, returning a reference to it. 
1900+ /// 
1901+ /// # Examples 
1902+ /// 
1903+ /// ``` 
1904+ /// #![feature(push_mut)] 
1905+ /// use std::collections::VecDeque; 
1906+ /// 
1907+ /// let mut d = VecDeque::from([1, 2, 3]); 
1908+ /// let x = d.push_front_mut(8); 
1909+ /// *x -= 1; 
1910+ /// assert_eq!(d.front(), Some(&7)); 
1911+ /// ``` 
1912+ #[ unstable( feature = "push_mut" ,  issue = "135974" ) ]  
1913+     #[ track_caller]  
1914+     #[ must_use = "if you don't need a reference to the value, use `VecDeque::push_front` instead" ]  
1915+     pub  fn  push_front_mut ( & mut  self ,  value :  T )  -> & mut  T  { 
18911916        if  self . is_full ( )  { 
18921917            self . grow ( ) ; 
18931918        } 
18941919
18951920        self . head  = self . wrap_sub ( self . head ,  1 ) ; 
18961921        self . len  += 1 ; 
1897- 
1898-         unsafe  { 
1899-             self . buffer_write ( self . head ,  value) ; 
1900-         } 
1922+         // SAFETY: We know that self.head is within range of the deque. 
1923+         unsafe  {  self . buffer_write ( self . head ,  value)  } 
19011924    } 
19021925
19031926    /// Appends an element to the back of the deque. 
@@ -1916,12 +1939,33 @@ impl<T, A: Allocator> VecDeque<T, A> {
19161939    #[ rustc_confusables( "push" ,  "put" ,  "append" ) ]  
19171940    #[ track_caller]  
19181941    pub  fn  push_back ( & mut  self ,  value :  T )  { 
1942+         let  _ = self . push_back_mut ( value) ; 
1943+     } 
1944+ 
1945+     /// Appends an element to the back of the deque, returning a reference to it. 
1946+ /// 
1947+ /// # Examples 
1948+ /// 
1949+ /// ``` 
1950+ /// #![feature(push_mut)] 
1951+ /// use std::collections::VecDeque; 
1952+ /// 
1953+ /// let mut d = VecDeque::from([1, 2, 3]); 
1954+ /// let x = d.push_back_mut(9); 
1955+ /// *x += 1; 
1956+ /// assert_eq!(d.back(), Some(&10)); 
1957+ /// ``` 
1958+ #[ unstable( feature = "push_mut" ,  issue = "135974" ) ]  
1959+     #[ track_caller]  
1960+     #[ must_use = "if you don't need a reference to the value, use `VecDeque::push_back` instead" ]  
1961+     pub  fn  push_back_mut ( & mut  self ,  value :  T )  -> & mut  T  { 
19191962        if  self . is_full ( )  { 
19201963            self . grow ( ) ; 
19211964        } 
19221965
1923-         unsafe   {   self . buffer_write ( self . to_physical_idx ( self . len ) ,  value )   } 
1966+         let  len =  self . len ; 
19241967        self . len  += 1 ; 
1968+         unsafe  {  self . buffer_write ( self . to_physical_idx ( len) ,  value)  } 
19251969    } 
19261970
19271971    #[ inline]  
@@ -2007,7 +2051,7 @@ impl<T, A: Allocator> VecDeque<T, A> {
20072051/// 
20082052/// # Panics 
20092053/// 
2010- /// Panics if `index` is strictly greater than deque's length 
2054+ /// Panics if `index` is strictly greater than the  deque's length.  
20112055/// 
20122056/// # Examples 
20132057/// 
@@ -2029,7 +2073,37 @@ impl<T, A: Allocator> VecDeque<T, A> {
20292073#[ stable( feature = "deque_extras_15" ,  since = "1.5.0" ) ]  
20302074    #[ track_caller]  
20312075    pub  fn  insert ( & mut  self ,  index :  usize ,  value :  T )  { 
2076+         let  _ = self . insert_mut ( index,  value) ; 
2077+     } 
2078+ 
2079+     /// Inserts an element at `index` within the deque, shifting all elements 
2080+ /// with indices greater than or equal to `index` towards the back, and 
2081+ /// returning a reference to it. 
2082+ /// 
2083+ /// Element at index 0 is the front of the queue. 
2084+ /// 
2085+ /// # Panics 
2086+ /// 
2087+ /// Panics if `index` is strictly greater than the deque's length. 
2088+ /// 
2089+ /// # Examples 
2090+ /// 
2091+ /// ``` 
2092+ /// #![feature(push_mut)] 
2093+ /// use std::collections::VecDeque; 
2094+ /// 
2095+ /// let mut vec_deque = VecDeque::from([1, 2, 3]); 
2096+ /// 
2097+ /// let x = vec_deque.insert_mut(1, 5); 
2098+ /// *x += 7; 
2099+ /// assert_eq!(vec_deque, &[1, 12, 2, 3]); 
2100+ /// ``` 
2101+ #[ unstable( feature = "push_mut" ,  issue = "135974" ) ]  
2102+     #[ track_caller]  
2103+     #[ must_use = "if you don't need a reference to the value, use `VecDeque::insert` instead" ]  
2104+     pub  fn  insert_mut ( & mut  self ,  index :  usize ,  value :  T )  -> & mut  T  { 
20322105        assert ! ( index <= self . len( ) ,  "index out of bounds" ) ; 
2106+ 
20332107        if  self . is_full ( )  { 
20342108            self . grow ( ) ; 
20352109        } 
@@ -2042,16 +2116,16 @@ impl<T, A: Allocator> VecDeque<T, A> {
20422116            unsafe  { 
20432117                // see `remove()` for explanation why this wrap_copy() call is safe. 
20442118                self . wrap_copy ( self . to_physical_idx ( index) ,  self . to_physical_idx ( index + 1 ) ,  k) ; 
2045-                 self . buffer_write ( self . to_physical_idx ( index) ,  value) ; 
20462119                self . len  += 1 ; 
2120+                 self . buffer_write ( self . to_physical_idx ( index) ,  value) 
20472121            } 
20482122        }  else  { 
20492123            let  old_head = self . head ; 
20502124            self . head  = self . wrap_sub ( self . head ,  1 ) ; 
20512125            unsafe  { 
20522126                self . wrap_copy ( old_head,  self . head ,  index) ; 
2053-                 self . buffer_write ( self . to_physical_idx ( index) ,  value) ; 
20542127                self . len  += 1 ; 
2128+                 self . buffer_write ( self . to_physical_idx ( index) ,  value) 
20552129            } 
20562130        } 
20572131    } 
0 commit comments