sim_lib_sequence/mutable/
ordered_table.rs1pub trait KeyEquivalence<K> {
3 fn equivalent(&self, left: &K, right: &K) -> bool;
5}
6impl<K, F> KeyEquivalence<K> for F
7where
8 F: Fn(&K, &K) -> bool,
9{
10 fn equivalent(&self, left: &K, right: &K) -> bool {
11 self(left, right)
12 }
13}
14
15#[derive(Clone, Debug)]
16struct OrderedEntry<K, V> {
17 key: K,
18 value: Option<V>,
19}
20
21#[derive(Debug)]
22struct OrderedState<K, V> {
23 entries: Vec<OrderedEntry<K, V>>,
24 live_len: usize,
25 active_iterators: Cell<usize>,
26}
27
28#[derive(Clone, Copy, Debug, Eq, PartialEq)]
30pub enum CompactionResult {
31 Compacted(usize),
33 NotNeeded,
35 ActiveIterator,
37 BudgetExceeded {
39 required: usize,
41 },
42}
43
44#[derive(Debug)]
51pub struct OrderedTable<K, V, E> {
52 state: Rc<RefCell<OrderedState<K, V>>>,
53 equivalence: E,
54}
55
56impl<K, V, E> OrderedTable<K, V, E>
57where
58 E: KeyEquivalence<K>,
59{
60 pub fn new(equivalence: E) -> Self {
62 Self {
63 state: Rc::new(RefCell::new(OrderedState {
64 entries: Vec::new(),
65 live_len: 0,
66 active_iterators: Cell::new(0),
67 })),
68 equivalence,
69 }
70 }
71
72 pub fn len(&self) -> usize {
74 self.state.borrow().live_len
75 }
76
77 pub fn is_empty(&self) -> bool {
79 self.len() == 0
80 }
81
82 pub fn get(&self, key: &K) -> Option<V>
84 where
85 V: Clone,
86 {
87 let state = self.state.borrow();
88 state
89 .entries
90 .iter()
91 .find(|entry| entry.value.is_some() && self.equivalence.equivalent(&entry.key, key))
92 .and_then(|entry| entry.value.clone())
93 }
94
95 pub fn insert(&self, key: K, value: V) -> Option<V> {
100 let mut state = self.state.borrow_mut();
101 if let Some(entry) = state
102 .entries
103 .iter_mut()
104 .find(|entry| entry.value.is_some() && self.equivalence.equivalent(&entry.key, &key))
105 {
106 return entry.value.replace(value);
107 }
108 state.entries.push(OrderedEntry {
109 key,
110 value: Some(value),
111 });
112 state.live_len += 1;
113 None
114 }
115
116 pub fn remove(&self, key: &K) -> Option<V> {
118 let mut state = self.state.borrow_mut();
119 let removed = state
120 .entries
121 .iter_mut()
122 .find(|entry| entry.value.is_some() && self.equivalence.equivalent(&entry.key, key))?
123 .value
124 .take();
125 state.live_len -= 1;
126 removed
127 }
128
129 pub fn iter(&self) -> OrderedTableIter<K, V> {
131 let state = self.state.borrow();
132 state
133 .active_iterators
134 .set(state.active_iterators.get().saturating_add(1));
135 drop(state);
136 OrderedTableIter {
137 state: Rc::clone(&self.state),
138 next_slot: 0,
139 }
140 }
141
142 pub fn compact(&self, max_work: usize) -> CompactionResult {
148 let mut state = self.state.borrow_mut();
149 if state.active_iterators.get() != 0 {
150 return CompactionResult::ActiveIterator;
151 }
152 let required = state.entries.len();
153 if required == state.live_len {
154 return CompactionResult::NotNeeded;
155 }
156 if required > max_work {
157 return CompactionResult::BudgetExceeded { required };
158 }
159 let removed = required - state.live_len;
160 state.entries.retain(|entry| entry.value.is_some());
161 CompactionResult::Compacted(removed)
162 }
163
164 #[cfg(test)]
165 fn slot_len(&self) -> usize {
166 self.state.borrow().entries.len()
167 }
168}
169
170pub struct OrderedTableIter<K, V> {
172 state: Rc<RefCell<OrderedState<K, V>>>,
173 next_slot: usize,
174}
175
176impl<K, V> Clone for OrderedTableIter<K, V> {
177 fn clone(&self) -> Self {
178 let state = self.state.borrow();
179 state
180 .active_iterators
181 .set(state.active_iterators.get().saturating_add(1));
182 drop(state);
183 Self {
184 state: Rc::clone(&self.state),
185 next_slot: self.next_slot,
186 }
187 }
188}
189
190impl<K, V> Iterator for OrderedTableIter<K, V>
191where
192 K: Clone,
193 V: Clone,
194{
195 type Item = (K, V);
196
197 fn next(&mut self) -> Option<Self::Item> {
198 let state = self.state.borrow();
199 while self.next_slot < state.entries.len() {
200 let slot = self.next_slot;
201 self.next_slot += 1;
202 let entry = &state.entries[slot];
203 if let Some(value) = &entry.value {
204 return Some((entry.key.clone(), value.clone()));
205 }
206 }
207 None
208 }
209}
210
211impl<K, V> Drop for OrderedTableIter<K, V> {
212 fn drop(&mut self) {
213 let state = self.state.borrow();
214 state
215 .active_iterators
216 .set(state.active_iterators.get().saturating_sub(1));
217 }
218}