Skip to content

Commit

Permalink
add BinaryHeap::try_reserve and BinaryHeap::try_reserve_exact
Browse files Browse the repository at this point in the history
Signed-off-by: TennyZhuang <zty0826@gmail.com>
  • Loading branch information
TennyZhuang committed Dec 11, 2021
1 parent 4a66a70 commit d0f8793
Showing 1 changed file with 79 additions and 0 deletions.
79 changes: 79 additions & 0 deletions library/alloc/src/collections/binary_heap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};

Expand Down Expand Up @@ -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_binary_heap)]
/// 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_binary_heap", issue = "none")]
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_binary_heap)]
/// 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_binary_heap", issue = "none")]
pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
self.data.try_reserve(additional)
}

/// Discards as much additional capacity as possible.
///
/// # Examples
Expand Down

0 comments on commit d0f8793

Please sign in to comment.