@@ -149,6 +149,7 @@ use core::mem::{self, swap, ManuallyDrop};
149
149
use core:: ops:: { Deref , DerefMut } ;
150
150
use core:: ptr;
151
151
152
+ use crate :: collections:: TryReserveError ;
152
153
use crate :: slice;
153
154
use crate :: vec:: { self , AsIntoIter , Vec } ;
154
155
@@ -953,6 +954,84 @@ impl<T> BinaryHeap<T> {
953
954
self . data . reserve ( additional) ;
954
955
}
955
956
957
+ /// Tries to reserve the minimum capacity for exactly `additional`
958
+ /// elements to be inserted in the given `BinaryHeap<T>`. After calling
959
+ /// `try_reserve_exact`, capacity will be greater than or equal to
960
+ /// `self.len() + additional` if it returns `Ok(())`.
961
+ /// Does nothing if the capacity is already sufficient.
962
+ ///
963
+ /// Note that the allocator may give the collection more space than it
964
+ /// requests. Therefore, capacity can not be relied upon to be precisely
965
+ /// minimal. Prefer [`try_reserve`] if future insertions are expected.
966
+ ///
967
+ /// [`try_reserve`]: BinaryHeap::try_reserve
968
+ ///
969
+ /// # Errors
970
+ ///
971
+ /// If the capacity overflows, or the allocator reports a failure, then an error
972
+ /// is returned.
973
+ ///
974
+ /// # Examples
975
+ ///
976
+ /// ```
977
+ /// #![feature(try_reserve_2)]
978
+ /// use std::collections::BinaryHeap;
979
+ /// use std::collections::TryReserveError;
980
+ ///
981
+ /// fn find_max_slow(data: &[u32]) -> Result<Option<u32>, TryReserveError> {
982
+ /// let mut heap = BinaryHeap::new();
983
+ ///
984
+ /// // Pre-reserve the memory, exiting if we can't
985
+ /// heap.try_reserve_exact(data.len())?;
986
+ ///
987
+ /// // Now we know this can't OOM in the middle of our complex work
988
+ /// heap.extend(data.iter());
989
+ ///
990
+ /// Ok(heap.pop())
991
+ /// }
992
+ /// # find_max_slow(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?");
993
+ /// ```
994
+ #[ unstable( feature = "try_reserve_2" , issue = "91789" ) ]
995
+ pub fn try_reserve_exact ( & mut self , additional : usize ) -> Result < ( ) , TryReserveError > {
996
+ self . data . try_reserve_exact ( additional)
997
+ }
998
+
999
+ /// Tries to reserve capacity for at least `additional` more elements to be inserted
1000
+ /// in the given `BinaryHeap<T>`. The collection may reserve more space to avoid
1001
+ /// frequent reallocations. After calling `try_reserve`, capacity will be
1002
+ /// greater than or equal to `self.len() + additional`. Does nothing if
1003
+ /// capacity is already sufficient.
1004
+ ///
1005
+ /// # Errors
1006
+ ///
1007
+ /// If the capacity overflows, or the allocator reports a failure, then an error
1008
+ /// is returned.
1009
+ ///
1010
+ /// # Examples
1011
+ ///
1012
+ /// ```
1013
+ /// #![feature(try_reserve_2)]
1014
+ /// use std::collections::BinaryHeap;
1015
+ /// use std::collections::TryReserveError;
1016
+ ///
1017
+ /// fn find_max_slow(data: &[u32]) -> Result<Option<u32>, TryReserveError> {
1018
+ /// let mut heap = BinaryHeap::new();
1019
+ ///
1020
+ /// // Pre-reserve the memory, exiting if we can't
1021
+ /// heap.try_reserve(data.len())?;
1022
+ ///
1023
+ /// // Now we know this can't OOM in the middle of our complex work
1024
+ /// heap.extend(data.iter());
1025
+ ///
1026
+ /// Ok(heap.pop())
1027
+ /// }
1028
+ /// # find_max_slow(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?");
1029
+ /// ```
1030
+ #[ unstable( feature = "try_reserve_2" , issue = "91789" ) ]
1031
+ pub fn try_reserve ( & mut self , additional : usize ) -> Result < ( ) , TryReserveError > {
1032
+ self . data . try_reserve ( additional)
1033
+ }
1034
+
956
1035
/// Discards as much additional capacity as possible.
957
1036
///
958
1037
/// # Examples
0 commit comments