76 lines
2.1 KiB
Rust
76 lines
2.1 KiB
Rust
use core::hash::{BuildHasher, Hash};
|
||
|
||
use super::{Equivalent, IndexMap};
|
||
|
||
pub struct PrivateMarker {}
|
||
|
||
/// Opt-in mutable access to keys.
|
||
///
|
||
/// These methods expose `&mut K`, mutable references to the key as it is stored
|
||
/// in the map.
|
||
/// You are allowed to modify the keys in the hashmap **if the modification
|
||
/// does not change the key’s hash and equality**.
|
||
///
|
||
/// If keys are modified erroneously, you can no longer look them up.
|
||
/// This is sound (memory safe) but a logical error hazard (just like
|
||
/// implementing PartialEq, Eq, or Hash incorrectly would be).
|
||
///
|
||
/// `use` this trait to enable its methods for `IndexMap`.
|
||
pub trait MutableKeys {
|
||
type Key;
|
||
type Value;
|
||
|
||
/// Return item index, mutable reference to key and value
|
||
fn get_full_mut2<Q: ?Sized>(
|
||
&mut self,
|
||
key: &Q,
|
||
) -> Option<(usize, &mut Self::Key, &mut Self::Value)>
|
||
where
|
||
Q: Hash + Equivalent<Self::Key>;
|
||
|
||
/// Scan through each key-value pair in the map and keep those where the
|
||
/// closure `keep` returns `true`.
|
||
///
|
||
/// The elements are visited in order, and remaining elements keep their
|
||
/// order.
|
||
///
|
||
/// Computes in **O(n)** time (average).
|
||
fn retain2<F>(&mut self, keep: F)
|
||
where
|
||
F: FnMut(&mut Self::Key, &mut Self::Value) -> bool;
|
||
|
||
/// This method is not useful in itself – it is there to “seal” the trait
|
||
/// for external implementation, so that we can add methods without
|
||
/// causing breaking changes.
|
||
fn __private_marker(&self) -> PrivateMarker;
|
||
}
|
||
|
||
/// Opt-in mutable access to keys.
|
||
///
|
||
/// See [`MutableKeys`](trait.MutableKeys.html) for more information.
|
||
impl<K, V, S> MutableKeys for IndexMap<K, V, S>
|
||
where
|
||
K: Eq + Hash,
|
||
S: BuildHasher,
|
||
{
|
||
type Key = K;
|
||
type Value = V;
|
||
fn get_full_mut2<Q: ?Sized>(&mut self, key: &Q) -> Option<(usize, &mut K, &mut V)>
|
||
where
|
||
Q: Hash + Equivalent<K>,
|
||
{
|
||
self.get_full_mut2_impl(key)
|
||
}
|
||
|
||
fn retain2<F>(&mut self, keep: F)
|
||
where
|
||
F: FnMut(&mut K, &mut V) -> bool,
|
||
{
|
||
self.retain_mut(keep)
|
||
}
|
||
|
||
fn __private_marker(&self) -> PrivateMarker {
|
||
PrivateMarker {}
|
||
}
|
||
}
|