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}