Skip to content

Commit bf6902c

Browse files
committed
Add BTreeMap::retain and BTreeSet::retain
1 parent f2a11a2 commit bf6902c

File tree

4 files changed

+70
-0
lines changed

4 files changed

+70
-0
lines changed

library/alloc/src/collections/btree/map.rs

+24
Original file line numberDiff line numberDiff line change
@@ -863,6 +863,30 @@ impl<K: Ord, V> BTreeMap<K, V> {
863863
}
864864
}
865865

866+
/// Retains only the elements specified by the predicate.
867+
///
868+
/// In other words, remove all pairs `(k, v)` such that `f(&k, &mut v)` returns `false`.
869+
///
870+
/// # Examples
871+
///
872+
/// ```
873+
/// #![feature(btree_retain)]
874+
/// use std::collections::BTreeMap;
875+
///
876+
/// let mut map: BTreeMap<i32, i32> = (0..8).map(|x| (x, x*10)).collect();
877+
/// // Keep only the elements with even-numbered keys.
878+
/// map.retain(|&k, _| k % 2 == 0);
879+
/// assert!(map.into_iter().eq(vec![(0, 0), (2, 20), (4, 40), (6, 60)]));
880+
/// ```
881+
#[inline]
882+
#[unstable(feature = "btree_retain", issue = "79025")]
883+
pub fn retain<F>(&mut self, mut f: F)
884+
where
885+
F: FnMut(&K, &mut V) -> bool,
886+
{
887+
self.drain_filter(|k, v| !f(k, v));
888+
}
889+
866890
/// Moves all elements from `other` into `Self`, leaving `other` empty.
867891
///
868892
/// # Examples

library/alloc/src/collections/btree/map/tests.rs

+11
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,17 @@ fn test_range_mut() {
808808
map.check();
809809
}
810810

811+
#[test]
812+
fn test_retain() {
813+
let mut map: BTreeMap<i32, i32> = (0..100).map(|x| (x, x * 10)).collect();
814+
815+
map.retain(|&k, _| k % 2 == 0);
816+
assert_eq!(map.len(), 50);
817+
assert_eq!(map[&2], 20);
818+
assert_eq!(map[&4], 40);
819+
assert_eq!(map[&6], 60);
820+
}
821+
811822
mod test_drain_filter {
812823
use super::*;
813824

library/alloc/src/collections/btree/set.rs

+24
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,30 @@ impl<T: Ord> BTreeSet<T> {
798798
Recover::take(&mut self.map, value)
799799
}
800800

801+
/// Retains only the elements specified by the predicate.
802+
///
803+
/// In other words, remove all elements `e` such that `f(&e)` returns `false`.
804+
///
805+
/// # Examples
806+
///
807+
/// ```
808+
/// #![feature(btree_retain)]
809+
/// use std::collections::BTreeSet;
810+
///
811+
/// let xs = [1, 2, 3, 4, 5, 6];
812+
/// let mut set: BTreeSet<i32> = xs.iter().cloned().collect();
813+
/// // Keep only the even numbers.
814+
/// set.retain(|&k| k % 2 == 0);
815+
/// assert!(set.iter().eq([2, 4, 6].iter()));
816+
/// ```
817+
#[unstable(feature = "btree_retain", issue = "79025")]
818+
pub fn retain<F>(&mut self, mut f: F)
819+
where
820+
F: FnMut(&T) -> bool,
821+
{
822+
self.drain_filter(|v| !f(v));
823+
}
824+
801825
/// Moves all elements from `other` into `Self`, leaving `other` empty.
802826
///
803827
/// # Examples

library/alloc/src/collections/btree/set/tests.rs

+11
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,17 @@ fn test_is_subset() {
324324
assert_eq!(is_subset(&[99, 100], &large), false);
325325
}
326326

327+
#[test]
328+
fn test_retain() {
329+
let xs = [1, 2, 3, 4, 5, 6];
330+
let mut set: BTreeSet<i32> = xs.iter().cloned().collect();
331+
set.retain(|&k| k % 2 == 0);
332+
assert_eq!(set.len(), 3);
333+
assert!(set.contains(&2));
334+
assert!(set.contains(&4));
335+
assert!(set.contains(&6));
336+
}
337+
327338
#[test]
328339
fn test_drain_filter() {
329340
let mut x: BTreeSet<_> = [1].iter().copied().collect();

0 commit comments

Comments
 (0)