Skip to content

Commit 20b3b69

Browse files
committed
linear_map: Add LinearMap::retain()
1 parent 801b9ab commit 20b3b69

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
@@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1313
- Removed generic from `history_buf::OldestOrdered`.
1414
- Made `LenType` opt-in.
1515
- Added `LinearMap::entry()` API.
16+
- Added `LinearMap::retain()`.
1617

1718
### Fixed
1819

src/linear_map.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,16 @@ where
495495
None => Entry::Vacant(VacantEntry { key, map: self }),
496496
}
497497
}
498+
499+
/// Retains only the elements specified by the predicate.
500+
///
501+
/// In other words, remove all pairs `(k, v)` for which `f(&k, &mut v)` returns `false`.
502+
pub fn retain<F>(&mut self, mut f: F)
503+
where
504+
F: FnMut(&K, &mut V) -> bool,
505+
{
506+
self.buffer.retain_mut(|(k, v)| f(k, v));
507+
}
498508
}
499509

500510
impl<K, V, Q, S: LinearMapStorage<K, V> + ?Sized> ops::Index<&'_ Q> for LinearMapInner<K, V, S>
@@ -926,6 +936,30 @@ mod test {
926936
assert_eq!(*v, 500);
927937
}
928938

939+
#[test]
940+
fn retain() {
941+
let mut src = almost_filled_map();
942+
src.retain(|k, _v| k % 2 == 0);
943+
src.retain(|k, _v| k % 3 == 0);
944+
945+
for (k, v) in src.iter() {
946+
assert_eq!(k, v);
947+
assert_eq!(k % 2, 0);
948+
assert_eq!(k % 3, 0);
949+
}
950+
951+
let mut src = almost_filled_map();
952+
src.retain(|_k, _v| false);
953+
assert!(src.is_empty());
954+
955+
let mut src = almost_filled_map();
956+
src.retain(|_k, _v| true);
957+
assert_eq!(src.len(), MAP_SLOTS - 1);
958+
src.insert(0, 0).unwrap();
959+
src.retain(|_k, _v| true);
960+
assert_eq!(src.len(), MAP_SLOTS);
961+
}
962+
929963
#[test]
930964
fn entry_find() {
931965
let key = 0;

0 commit comments

Comments
 (0)