Skip to main content

subtr_actor/
vec_map.rs

1pub(crate) trait VecMapEntry<K: PartialEq, V> {
2    fn get_entry(&mut self, key: K) -> Entry<'_, K, V>;
3}
4
5pub(crate) enum Entry<'a, K: PartialEq, V> {
6    Occupied(OccupiedEntry<'a, K, V>),
7    Vacant(VacantEntry<'a, K, V>),
8}
9
10impl<'a, K: PartialEq, V> Entry<'a, K, V> {
11    pub fn or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V {
12        match self {
13            Entry::Occupied(occupied) => &mut occupied.entry.1,
14            Entry::Vacant(vacant) => {
15                vacant.vec.push((vacant.key, default()));
16                &mut vacant.vec.last_mut().unwrap().1
17            }
18        }
19    }
20}
21
22pub(crate) struct OccupiedEntry<'a, K: PartialEq, V> {
23    entry: &'a mut (K, V),
24}
25
26pub(crate) struct VacantEntry<'a, K: PartialEq, V> {
27    vec: &'a mut Vec<(K, V)>,
28    key: K,
29}
30
31impl<K: PartialEq + Clone, V> VecMapEntry<K, V> for Vec<(K, V)> {
32    fn get_entry(&mut self, key: K) -> Entry<'_, K, V> {
33        match self.iter_mut().position(|(k, _)| k == &key) {
34            Some(index) => Entry::Occupied(OccupiedEntry {
35                entry: &mut self[index],
36            }),
37            None => Entry::Vacant(VacantEntry { vec: self, key }),
38        }
39    }
40}