Skip to content

Commit ad89973

Browse files
committed
linear_map: Add LinearMap::retain()
1 parent 1cc2ee8 commit ad89973

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
2424
- Add missing `Debug` derive to `vec::IntoIter`.
2525
- Removed generic from `spsc::Consumer`, `spsc::Producer` and `spsc::Iter`.
2626
- Added `LinearMap::entry()` API.
27+
- Added `LinearMap::retain()`.
2728

2829
### Fixed
2930

src/linear_map.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,16 @@ where
501501
}),
502502
}
503503
}
504+
505+
/// Retains only the elements specified by the predicate.
506+
///
507+
/// In other words, remove all pairs `(k, v)` for which `f(&k, &mut v)` returns `false`.
508+
pub fn retain<F>(&mut self, mut f: F)
509+
where
510+
F: FnMut(&K, &mut V) -> bool,
511+
{
512+
self.buffer.retain_mut(|(k, v)| f(k, v));
513+
}
504514
}
505515

506516
impl<K, V, Q, S: LinearMapStorage<K, V> + ?Sized> ops::Index<&'_ Q> for LinearMapInner<K, V, S>
@@ -932,6 +942,30 @@ mod test {
932942
assert_eq!(*v, 500);
933943
}
934944

945+
#[test]
946+
fn retain() {
947+
let mut src = almost_filled_map();
948+
src.retain(|k, _v| k % 2 == 0);
949+
src.retain(|k, _v| k % 3 == 0);
950+
951+
for (k, v) in src.iter() {
952+
assert_eq!(k, v);
953+
assert_eq!(k % 2, 0);
954+
assert_eq!(k % 3, 0);
955+
}
956+
957+
let mut src = almost_filled_map();
958+
src.retain(|_k, _v| false);
959+
assert!(src.is_empty());
960+
961+
let mut src = almost_filled_map();
962+
src.retain(|_k, _v| true);
963+
assert_eq!(src.len(), MAP_SLOTS - 1);
964+
src.insert(0, 0).unwrap();
965+
src.retain(|_k, _v| true);
966+
assert_eq!(src.len(), MAP_SLOTS);
967+
}
968+
935969
#[test]
936970
fn entry_find() {
937971
let key = 0;

0 commit comments

Comments
 (0)