diff options
| author | bors <bors@rust-lang.org> | 2020-11-15 13:19:05 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-11-15 13:19:05 +0000 |
| commit | 5fab31e5ddf5f2613bf57a0a7286dc6f5887e1cb (patch) | |
| tree | bf2540f955bf3e3adb49330b1fd06ee628d9fc35 /library/alloc | |
| parent | 04688459242356c0f6b9fdad3ba76c9ec4dcc354 (diff) | |
| parent | 568354f01f22148709e51fe1130826addb455e18 (diff) | |
| download | rust-5fab31e5ddf5f2613bf57a0a7286dc6f5887e1cb.tar.gz rust-5fab31e5ddf5f2613bf57a0a7286dc6f5887e1cb.zip | |
Auto merge of #79070 - jonas-schievink:rollup-wacn2b8, r=jonas-schievink
Rollup of 13 pull requests
Successful merges:
- #77802 (Allow making `RUSTC_BOOTSTRAP` conditional on the crate name)
- #79004 (Add `--color` support to bootstrap)
- #79005 (cleanup: Remove `ParseSess::injected_crate_name`)
- #79016 (Make `_` an expression, to discard values in destructuring assignments)
- #79019 (astconv: extract closures into a separate trait)
- #79026 (Implement BTreeMap::retain and BTreeSet::retain)
- #79031 (Validate that locals have a corresponding `LocalDecl`)
- #79034 (rustc_resolve: Make `macro_rules` scope chain compression lazy)
- #79036 (Move Steal to rustc_data_structures.)
- #79041 (Rename clean::{ItemEnum -> ItemKind}, clean::Item::{inner -> kind})
- #79058 (Move likely/unlikely argument outside of invisible unsafe block)
- #79059 (Print 'checking cranelift artifacts' to easily separate it from other artifacts)
- #79063 (Update rustfmt to v1.4.26)
Failed merges:
r? `@ghost`
`@rustbot` modify labels: rollup
Diffstat (limited to 'library/alloc')
| -rw-r--r-- | library/alloc/src/collections/btree/map.rs | 24 | ||||
| -rw-r--r-- | library/alloc/src/collections/btree/map/tests.rs | 11 | ||||
| -rw-r--r-- | library/alloc/src/collections/btree/set.rs | 24 | ||||
| -rw-r--r-- | library/alloc/src/collections/btree/set/tests.rs | 11 |
4 files changed, 70 insertions, 0 deletions
diff --git a/library/alloc/src/collections/btree/map.rs b/library/alloc/src/collections/btree/map.rs index 49122f53d33..7151d3763f0 100644 --- a/library/alloc/src/collections/btree/map.rs +++ b/library/alloc/src/collections/btree/map.rs @@ -863,6 +863,30 @@ impl<K: Ord, V> BTreeMap<K, V> { } } + /// Retains only the elements specified by the predicate. + /// + /// In other words, remove all pairs `(k, v)` such that `f(&k, &mut v)` returns `false`. + /// + /// # Examples + /// + /// ``` + /// #![feature(btree_retain)] + /// use std::collections::BTreeMap; + /// + /// let mut map: BTreeMap<i32, i32> = (0..8).map(|x| (x, x*10)).collect(); + /// // Keep only the elements with even-numbered keys. + /// map.retain(|&k, _| k % 2 == 0); + /// assert!(map.into_iter().eq(vec![(0, 0), (2, 20), (4, 40), (6, 60)])); + /// ``` + #[inline] + #[unstable(feature = "btree_retain", issue = "79025")] + pub fn retain<F>(&mut self, mut f: F) + where + F: FnMut(&K, &mut V) -> bool, + { + self.drain_filter(|k, v| !f(k, v)); + } + /// Moves all elements from `other` into `Self`, leaving `other` empty. /// /// # Examples diff --git a/library/alloc/src/collections/btree/map/tests.rs b/library/alloc/src/collections/btree/map/tests.rs index dd3ebcccf76..11dbb584abd 100644 --- a/library/alloc/src/collections/btree/map/tests.rs +++ b/library/alloc/src/collections/btree/map/tests.rs @@ -808,6 +808,17 @@ fn test_range_mut() { map.check(); } +#[test] +fn test_retain() { + let mut map: BTreeMap<i32, i32> = (0..100).map(|x| (x, x * 10)).collect(); + + map.retain(|&k, _| k % 2 == 0); + assert_eq!(map.len(), 50); + assert_eq!(map[&2], 20); + assert_eq!(map[&4], 40); + assert_eq!(map[&6], 60); +} + mod test_drain_filter { use super::*; diff --git a/library/alloc/src/collections/btree/set.rs b/library/alloc/src/collections/btree/set.rs index 684019f8f5f..1a807100653 100644 --- a/library/alloc/src/collections/btree/set.rs +++ b/library/alloc/src/collections/btree/set.rs @@ -798,6 +798,30 @@ impl<T: Ord> BTreeSet<T> { Recover::take(&mut self.map, value) } + /// Retains only the elements specified by the predicate. + /// + /// In other words, remove all elements `e` such that `f(&e)` returns `false`. + /// + /// # Examples + /// + /// ``` + /// #![feature(btree_retain)] + /// use std::collections::BTreeSet; + /// + /// let xs = [1, 2, 3, 4, 5, 6]; + /// let mut set: BTreeSet<i32> = xs.iter().cloned().collect(); + /// // Keep only the even numbers. + /// set.retain(|&k| k % 2 == 0); + /// assert!(set.iter().eq([2, 4, 6].iter())); + /// ``` + #[unstable(feature = "btree_retain", issue = "79025")] + pub fn retain<F>(&mut self, mut f: F) + where + F: FnMut(&T) -> bool, + { + self.drain_filter(|v| !f(v)); + } + /// Moves all elements from `other` into `Self`, leaving `other` empty. /// /// # Examples diff --git a/library/alloc/src/collections/btree/set/tests.rs b/library/alloc/src/collections/btree/set/tests.rs index 52cde8299e4..ef40a048a38 100644 --- a/library/alloc/src/collections/btree/set/tests.rs +++ b/library/alloc/src/collections/btree/set/tests.rs @@ -325,6 +325,17 @@ fn test_is_subset() { } #[test] +fn test_retain() { + let xs = [1, 2, 3, 4, 5, 6]; + let mut set: BTreeSet<i32> = xs.iter().cloned().collect(); + set.retain(|&k| k % 2 == 0); + assert_eq!(set.len(), 3); + assert!(set.contains(&2)); + assert!(set.contains(&4)); + assert!(set.contains(&6)); +} + +#[test] fn test_drain_filter() { let mut x: BTreeSet<_> = [1].iter().copied().collect(); let mut y: BTreeSet<_> = [1].iter().copied().collect(); |
