mirror of
https://github.com/italicsjenga/agb.git
synced 2025-01-11 09:31:34 +11:00
Add implementation of retain to HashMap
This commit is contained in:
parent
2d23f0a36c
commit
c658b6afe5
|
@ -196,6 +196,14 @@ impl<K, V, ALLOCATOR: ClonableAllocator> HashMap<K, V, ALLOCATOR> {
|
||||||
self.nodes.nodes.iter_mut().filter_map(Node::key_value_mut)
|
self.nodes.nodes.iter_mut().filter_map(Node::key_value_mut)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Retains only the elements specified by the predicate `f`.
|
||||||
|
pub fn retain<F>(&mut self, f: F)
|
||||||
|
where
|
||||||
|
F: FnMut(&K, &mut V) -> bool,
|
||||||
|
{
|
||||||
|
self.nodes.retain(f);
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns `true` if the map contains no elements
|
/// Returns `true` if the map contains no elements
|
||||||
#[must_use]
|
#[must_use]
|
||||||
pub fn is_empty(&self) -> bool {
|
pub fn is_empty(&self) -> bool {
|
||||||
|
@ -737,6 +745,27 @@ impl<K, V, ALLOCATOR: ClonableAllocator> NodeStorage<K, V, ALLOCATOR> {
|
||||||
inserted_location
|
inserted_location
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn retain<F>(&mut self, mut f: F)
|
||||||
|
where
|
||||||
|
F: FnMut(&K, &mut V) -> bool,
|
||||||
|
{
|
||||||
|
let num_nodes = self.nodes.len();
|
||||||
|
let mut i = 0;
|
||||||
|
|
||||||
|
while i < num_nodes {
|
||||||
|
let node = &mut self.nodes[i];
|
||||||
|
|
||||||
|
if let Some((k, v)) = node.key_value_mut() {
|
||||||
|
if !f(k, v) {
|
||||||
|
self.remove_from_location(i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn remove_from_location(&mut self, location: usize) -> V {
|
fn remove_from_location(&mut self, location: usize) -> V {
|
||||||
let mut current_location = location;
|
let mut current_location = location;
|
||||||
self.number_of_items -= 1;
|
self.number_of_items -= 1;
|
||||||
|
@ -1441,5 +1470,21 @@ mod test {
|
||||||
|
|
||||||
assert_eq!(map[&2], 1);
|
assert_eq!(map[&2], 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test_case]
|
||||||
|
fn test_retain(_gba: &mut Gba) {
|
||||||
|
let mut map = HashMap::new();
|
||||||
|
|
||||||
|
for i in 0..100 {
|
||||||
|
map.insert(i, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
map.retain(|k, _| k % 2 == 0);
|
||||||
|
|
||||||
|
assert_eq!(map[&2], 2);
|
||||||
|
assert_eq!(map.get(&3), None);
|
||||||
|
|
||||||
|
assert_eq!(map.iter().count(), 50); // force full iteration
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue