1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
use crate::IntMap;
pub enum Entry<'a, V: 'a> {
Occupied(OccupiedEntry<'a, V>),
Vacant(VacantEntry<'a, V>),
}
impl<'a, V> Entry<'a, V> {
#[inline]
pub(crate) fn new(key: u64, int_map: &'a mut IntMap<V>) -> Self {
let (cache_ix, val_ix) = Self::indices(key, int_map);
match val_ix {
Some(vals_ix) => Entry::Occupied(OccupiedEntry {
vals_ix,
vals: &mut int_map.cache[cache_ix],
count: &mut int_map.count,
}),
None => Entry::Vacant(VacantEntry { key, int_map }),
}
}
fn indices(key: u64, int_map: &IntMap<V>) -> (usize, Option<usize>) {
let cache_ix = int_map.calc_index(key);
let vals = &int_map.cache[cache_ix];
let vals_ix = { vals.iter() }
.enumerate()
.find_map(|(vals_ix, &(k, _))| (k == key).then(|| vals_ix));
(cache_ix, vals_ix)
}
}
pub struct OccupiedEntry<'a, V: 'a> {
vals_ix: usize,
vals: &'a mut Vec<(u64, V)>,
count: &'a mut usize,
}
impl<'a, V> OccupiedEntry<'a, V> {
pub fn get(&self) -> &V {
&self.vals.get(self.vals_ix).unwrap().1
}
pub fn get_mut(&mut self) -> &mut V {
&mut self.vals.get_mut(self.vals_ix).unwrap().1
}
pub fn into_mut(self) -> &'a mut V {
&mut self.vals.get_mut(self.vals_ix).unwrap().1
}
pub fn insert(&mut self, value: V) -> V {
std::mem::replace(&mut self.vals[self.vals_ix].1, value)
}
pub fn remove(self) -> V {
*self.count -= 1;
let kv = self.vals.swap_remove(self.vals_ix);
kv.1
}
}
pub struct VacantEntry<'a, V: 'a> {
key: u64,
int_map: &'a mut IntMap<V>,
}
impl<'a, V: 'a> VacantEntry<'a, V> {
pub fn insert(self, value: V) -> &'a mut V {
self.int_map.insert(self.key, value);
return self.int_map.get_mut(self.key).unwrap();
}
}