mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-08 04:56:58 +00:00
Rollup merge of #91529 - TennyZhuang:try_reserve_binary_heap, r=yaahc
add BinaryHeap::try_reserve and BinaryHeap::try_reserve_exact `try_reserve` of many collections were stablized in https://github.com/rust-lang/rust/pull/87993 in 1.57.0. Add `try_reserve` for the rest collections such as `BinaryHeap` should be not controversial.
This commit is contained in:
commit
7ec00cd135
@ -149,6 +149,7 @@ use core::mem::{self, swap, ManuallyDrop};
|
||||
use core::ops::{Deref, DerefMut};
|
||||
use core::ptr;
|
||||
|
||||
use crate::collections::TryReserveError;
|
||||
use crate::slice;
|
||||
use crate::vec::{self, AsIntoIter, Vec};
|
||||
|
||||
@ -953,6 +954,84 @@ impl<T> BinaryHeap<T> {
|
||||
self.data.reserve(additional);
|
||||
}
|
||||
|
||||
/// Tries to reserve the minimum capacity for exactly `additional`
|
||||
/// elements to be inserted in the given `BinaryHeap<T>`. After calling
|
||||
/// `try_reserve_exact`, capacity will be greater than or equal to
|
||||
/// `self.len() + additional` if it returns `Ok(())`.
|
||||
/// Does nothing if the capacity is already sufficient.
|
||||
///
|
||||
/// Note that the allocator may give the collection more space than it
|
||||
/// requests. Therefore, capacity can not be relied upon to be precisely
|
||||
/// minimal. Prefer [`try_reserve`] if future insertions are expected.
|
||||
///
|
||||
/// [`try_reserve`]: BinaryHeap::try_reserve
|
||||
///
|
||||
/// # Errors
|
||||
///
|
||||
/// If the capacity overflows, or the allocator reports a failure, then an error
|
||||
/// is returned.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(try_reserve_2)]
|
||||
/// use std::collections::BinaryHeap;
|
||||
/// use std::collections::TryReserveError;
|
||||
///
|
||||
/// fn find_max_slow(data: &[u32]) -> Result<Option<u32>, TryReserveError> {
|
||||
/// let mut heap = BinaryHeap::new();
|
||||
///
|
||||
/// // Pre-reserve the memory, exiting if we can't
|
||||
/// heap.try_reserve_exact(data.len())?;
|
||||
///
|
||||
/// // Now we know this can't OOM in the middle of our complex work
|
||||
/// heap.extend(data.iter());
|
||||
///
|
||||
/// Ok(heap.pop())
|
||||
/// }
|
||||
/// # find_max_slow(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?");
|
||||
/// ```
|
||||
#[unstable(feature = "try_reserve_2", issue = "91789")]
|
||||
pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> {
|
||||
self.data.try_reserve_exact(additional)
|
||||
}
|
||||
|
||||
/// Tries to reserve capacity for at least `additional` more elements to be inserted
|
||||
/// in the given `BinaryHeap<T>`. The collection may reserve more space to avoid
|
||||
/// frequent reallocations. After calling `try_reserve`, capacity will be
|
||||
/// greater than or equal to `self.len() + additional`. Does nothing if
|
||||
/// capacity is already sufficient.
|
||||
///
|
||||
/// # Errors
|
||||
///
|
||||
/// If the capacity overflows, or the allocator reports a failure, then an error
|
||||
/// is returned.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(try_reserve_2)]
|
||||
/// use std::collections::BinaryHeap;
|
||||
/// use std::collections::TryReserveError;
|
||||
///
|
||||
/// fn find_max_slow(data: &[u32]) -> Result<Option<u32>, TryReserveError> {
|
||||
/// let mut heap = BinaryHeap::new();
|
||||
///
|
||||
/// // Pre-reserve the memory, exiting if we can't
|
||||
/// heap.try_reserve(data.len())?;
|
||||
///
|
||||
/// // Now we know this can't OOM in the middle of our complex work
|
||||
/// heap.extend(data.iter());
|
||||
///
|
||||
/// Ok(heap.pop())
|
||||
/// }
|
||||
/// # find_max_slow(&[1, 2, 3]).expect("why is the test harness OOMing on 12 bytes?");
|
||||
/// ```
|
||||
#[unstable(feature = "try_reserve_2", issue = "91789")]
|
||||
pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
|
||||
self.data.try_reserve(additional)
|
||||
}
|
||||
|
||||
/// Discards as much additional capacity as possible.
|
||||
///
|
||||
/// # Examples
|
||||
|
Loading…
Reference in New Issue
Block a user