Skip to content

Commit

Permalink
Rollup merge of rust-lang#71485 - arlopurcell:binary_heap_retain, r=A…
Browse files Browse the repository at this point in the history
…manieu

Add BinaryHeap::retain as suggested in rust-lang#42849

This PR implements retain for BinaryHeap as suggested in rust-lang#42849.

This is my first PR for Rust, so please let me know if I should be doing anything differently, thanks!
  • Loading branch information
Dylan-DPC committed Apr 24, 2020
2 parents 440d600 + 787eddc commit 16d2db5
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 0 deletions.
28 changes: 28 additions & 0 deletions src/liballoc/collections/binary_heap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -665,6 +665,34 @@ impl<T: Ord> BinaryHeap<T> {
pub fn drain_sorted(&mut self) -> DrainSorted<'_, T> {
DrainSorted { inner: self }
}

/// Retains only the elements specified by the predicate.
///
/// In other words, remove all elements `e` such that `f(&e)` returns
/// `false`. The elements are visited in unsorted (and unspecified) order.
///
/// # Examples
///
/// Basic usage:
///
/// ```
/// #![feature(binary_heap_retain)]
/// use std::collections::BinaryHeap;
///
/// let mut heap = BinaryHeap::from(vec![-10, -5, 1, 2, 4, 13]);
///
/// heap.retain(|x| x % 2 == 0); // only keep even numbers
///
/// assert_eq!(heap.into_sorted_vec(), [-10, 2, 4])
/// ```
#[unstable(feature = "binary_heap_retain", issue = "71503")]
pub fn retain<F>(&mut self, f: F)
where
F: FnMut(&T) -> bool,
{
self.data.retain(f);
self.rebuild();
}
}

impl<T> BinaryHeap<T> {
Expand Down
8 changes: 8 additions & 0 deletions src/liballoc/tests/binary_heap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -372,6 +372,14 @@ fn assert_covariance() {
}
}

#[test]
fn test_retain() {
let mut a = BinaryHeap::from(vec![-10, -5, 1, 2, 4, 13]);
a.retain(|x| x % 2 == 0);

assert_eq!(a.into_sorted_vec(), [-10, 2, 4])
}

// old binaryheap failed this test
//
// Integrity means that all elements are present after a comparison panics,
Expand Down
1 change: 1 addition & 0 deletions src/liballoc/tests/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#![feature(binary_heap_drain_sorted)]
#![feature(vec_remove_item)]
#![feature(split_inclusive)]
#![feature(binary_heap_retain)]

use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
Expand Down

0 comments on commit 16d2db5

Please sign in to comment.