@@ -1773,6 +1773,50 @@ impl<T, A: Allocator> Vec<T, A> {
1773
1773
}
1774
1774
}
1775
1775
1776
+ /// Appends an element if there is sufficient spare capacity, otherwise the element is returned.
1777
+ ///
1778
+ /// Unlike [`push`] method will not reallocate when there's insufficient capacity.
1779
+ /// The caller should use [`reserve`] or [`try_reserve`] to ensure that there is enough capacity.
1780
+ ///
1781
+ /// [`push`]: Vec::push
1782
+ /// [`reserve`]: Vec::reserve
1783
+ /// [`try_reserve`]: Vec::try_reserve
1784
+ ///
1785
+ /// # Examples
1786
+ ///
1787
+ /// A manual, panic-free alternative to FromIterator
1788
+ ///
1789
+ /// ```
1790
+ /// #![feature(vec_push_within_capacity, try_reserve)]
1791
+ ///
1792
+ /// use std::collections::TryReserveError;
1793
+ /// fn from_iter<T>(iter: impl Iterator<Item=T>) -> Result<Vec<T>, TryReserveError> {
1794
+ /// let mut vec = Vec::new();
1795
+ /// for value in iter {
1796
+ /// if let Err(value) = vec.push_within_capacity(value) {
1797
+ /// vec.try_reserve(1)?;
1798
+ /// // this cannot fail, the previous line either returned or added at least 1 free slot
1799
+ /// let _ = vec.push_within_capacity(value);
1800
+ /// }
1801
+ /// }
1802
+ /// Ok(vec)
1803
+ /// }
1804
+ /// # from_iter(0..100).expect("please insert more memory");
1805
+ /// ```
1806
+ #[ inline]
1807
+ #[ unstable( feature = "vec_push_within_capacity" , issue = "none" ) ]
1808
+ pub fn push_within_capacity ( & mut self , value : T ) -> Result < ( ) , T > {
1809
+ if self . len == self . buf . capacity ( ) {
1810
+ return Err ( value) ;
1811
+ }
1812
+ unsafe {
1813
+ let end = self . as_mut_ptr ( ) . add ( self . len ) ;
1814
+ ptr:: write ( end, value) ;
1815
+ self . len += 1 ;
1816
+ }
1817
+ Ok ( ( ) )
1818
+ }
1819
+
1776
1820
/// Removes the last element from a vector and returns it, or [`None`] if it
1777
1821
/// is empty.
1778
1822
///
0 commit comments