1use std::ops::{Index, IndexMut};
2use std::fmt::{Debug, Formatter};
3use thin_vec::ThinVec;
4use bitvec::prelude::*;
5
6pub type Key = BitVec<usize, Lsb0>;
7pub type KeyRef<'a> = &'a BitSlice<usize, Lsb0>;
8
9#[derive(Default)]
10struct Bitmap {
11 bitmap: BitmapType,
12}
13
14type BitmapType = u64;
15const RESULTS_BITS_END_NODE: usize = 5;
16const RESULTS_BITS: usize = RESULTS_BITS_END_NODE - 1;
17const CHILDREN_START_END_NODE: usize = 2_usize.pow(RESULTS_BITS_END_NODE as u32 + 1);
18const CHILDREN_START: usize = 2_usize.pow(RESULTS_BITS as u32 + 1);
19
20impl Debug for Bitmap {
21 fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
22 let field2_name = if self.is_end_node() { "internal2" } else { "external" };
23 f.debug_struct("Bitmap")
24 .field("is_end_node", &self.is_end_node())
25 .field("internal", &format!("{}", &self.bitmap.view_bits::<Lsb0>()[..CHILDREN_START]))
26 .field(field2_name, &format!("{}", &self.bitmap.view_bits::<Lsb0>()[CHILDREN_START..]))
27 .finish()
28 }
29}
30
31impl Bitmap {
32 #[inline]
33 fn is_end_node(&self) -> bool {
34 self.bitmap.view_bits::<Lsb0>()[0]
35 }
36 fn set_is_end_node(&mut self, is_end_node: bool) {
37 self.bitmap.view_bits_mut::<Lsb0>().set(0, is_end_node);
38 }
39 #[inline]
40 fn children_start_at(&self) -> usize {
41 if self.is_end_node() { CHILDREN_START_END_NODE } else { CHILDREN_START }
42 }
43 #[inline]
44 fn results_capacity(&self) -> usize {
45 if self.is_end_node() { RESULTS_BITS_END_NODE } else { RESULTS_BITS }
46 }
47
48 fn children_bits_mut(&mut self) -> &mut BitSlice<BitmapType, Lsb0> {
49 let start = self.children_start_at();
50 self.bitmap.view_bits_mut::<Lsb0>().index_mut(start..)
51 }
52 fn children_bits(&self) -> &BitSlice<BitmapType, Lsb0> {
53 let start = self.children_start_at();
54 self.bitmap.view_bits::<Lsb0>().index(start..)
55 }
56
57 fn results_bits_mut(&mut self) -> &mut BitSlice<BitmapType, Lsb0> {
58 let end = self.children_start_at();
59 self.bitmap.view_bits_mut::<Lsb0>().index_mut(1..end)
60 }
61 fn results_bits(&self) -> &BitSlice<BitmapType, Lsb0> {
62 let end = self.children_start_at();
63 self.bitmap.view_bits::<Lsb0>().index(1..end)
64 }
65
66 fn results_keys_with_prefix(&self, prefix: Key) -> impl Iterator<Item = Key> + '_ {
67 self.results_bits()
68 .iter_ones()
69 .map(from_index)
70 .map(move |result_key| {
71 let mut key = prefix.clone();
72 key.extend(result_key);
73 key
74 })
75 }
76}
77
78#[derive(Debug)]
79pub struct Node<T> {
80 results: Option<ThinVec<T>>,
81 children: Option<ThinVec<Node<T>>>,
82 bitmap: Bitmap,
83}
84
85impl<T> Default for Node<T> {
86 fn default() -> Self {
87 let mut bitmap: Bitmap = Default::default();
88 bitmap.set_is_end_node(true);
89 Node {
90 results: None,
91 children: None,
92 bitmap,
93 }
94 }
95}
96
97fn children_mut<'a, T>(bitmap: &'a Bitmap, children: &'a mut Option<ThinVec<Node<T>>>) -> impl Iterator<Item = (Key, &'a mut Node<T>)> {
98 let children_iter = children.iter_mut().flat_map(|children| children.iter_mut());
99 bitmap.children_bits().iter_ones().map(|x| x.view_bits::<Lsb0>().iter().take(RESULTS_BITS_END_NODE).collect()).zip(children_iter)
100}
101fn results_mut<'a, T>(bitmap: &'a Bitmap, results: &'a mut Option<ThinVec<T>>) -> impl Iterator<Item = (Key, &'a mut T)> {
102 let results_iter = results.iter_mut().flat_map(|results| results.iter_mut());
103 bitmap.results_bits().iter_ones().map(from_index).zip(results_iter)
104}
105
106fn to_index(key: KeyRef) -> usize {
107 let leading_one = 2usize.pow(key.len() as u32);
108 let net_bits: usize = if key.is_empty() { 0 } else { key.load_le() };
109 (leading_one + net_bits) - 1
110}
111
112fn from_index(mut index: usize) -> Key {
113 index += 1;
114 let prefix_len = (std::mem::size_of::<usize>() as u32 * 8) - index.leading_zeros() - 1;
115 let mut key = Key::new();
116 key.extend(index.view_bits::<Lsb0>().iter().take(prefix_len as usize));
117 key
118}
119
120impl<T: Debug + Send + Sync> Node<T> {
121 fn children(&self) -> impl Iterator<Item = (Key, &Node<T>)> {
122 let children_iter = self.children.iter().flat_map(|children| children.iter());
123 self.bitmap.children_bits().iter_ones().map(|x| x.view_bits::<Lsb0>().iter().take(RESULTS_BITS_END_NODE).collect()).zip(children_iter)
124 }
125
126 fn results(&self) -> impl Iterator<Item = (Key, &T)> {
127 let results_iter = self.results.iter().flat_map(|results| results.iter());
128 self.bitmap.results_bits().iter_ones().map(from_index).zip(results_iter)
129 }
130
131 fn get_child(&self, key: KeyRef) -> Option<&Node<T>> {
132 if self.bitmap.is_end_node() { return None; }
133 let nibble: usize = key.load_le();
134 self.bitmap.children_bits()[nibble].then(|| {
135 let vec_index = self.bitmap.children_bits()[..nibble].count_ones();
136 &self.children.as_ref().unwrap()[vec_index]
137 })
138 }
139 fn get_child_mut(&mut self, key: KeyRef) -> Option<&mut Node<T>> {
140 if self.bitmap.is_end_node() { return None; }
141 let nibble: usize = key.load_le();
142 self.bitmap.children_bits()[nibble].then(|| {
143 let vec_index = self.bitmap.children_bits()[..nibble].count_ones();
144 &mut self.children.as_mut().unwrap()[vec_index]
145 })
146 }
147
148 fn convert_to_normal(&mut self) {
149 if !self.bitmap.is_end_node() { return; }
150
151 let results_iter = self.results.take().into_iter().flat_map(|results| results.into_iter());
152 let results = self.bitmap.results_bits().iter_ones().map(from_index).zip(results_iter).collect::<Vec<_>>();
153
154 self.bitmap = Default::default();
155 self.bitmap.set_is_end_node(false);
156
157 for (key, value) in results {
158 self.insert(&key, value);
159 }
160 }
161 fn get_or_insert_child(&mut self, key: KeyRef) -> &mut Node<T> {
162 self.convert_to_normal();
163
164 {
165 let nibble: usize = key.load_le();
166 if !self.bitmap.children_bits()[nibble] {
167 self.bitmap.children_bits_mut().set(nibble, true);
168 let children = self.children.get_or_insert(Default::default());
169 let vec_index = self.bitmap.children_bits()[..nibble].count_ones();
170 children.insert(vec_index, Node::default());
171 }
172 }
173 self.get_child_mut(key).unwrap()
174 }
175
176 pub fn insert(&mut self, key: KeyRef, value: T) -> Option<T> {
177 if key.len() <= self.bitmap.results_capacity() {
178 let index = to_index(&key);
180
181 let results = self.results.get_or_insert(Default::default());
182 let vec_index = self.bitmap.results_bits()[..index].count_ones();
183 if self.bitmap.results_bits()[index] {
184 Some(std::mem::replace(&mut results[vec_index], value))
185 } else {
186 self.bitmap.results_bits_mut().set(index, true);
187 results.insert(vec_index, value);
188 None
189 }
190 } else {
191 let (key, remaining) = key.split_at(RESULTS_BITS_END_NODE);
192 let child = self.get_or_insert_child(key);
194 child.insert(remaining, value)
195 }
196 }
197 pub fn remove(&mut self, key: KeyRef) -> Option<T> {
198 if key.len() <= self.bitmap.results_capacity() {
199 let index = to_index(key);
200 self.bitmap.results_bits()[index].then(|| {
201 self.bitmap.results_bits_mut().set(index, false);
202 let results = self.results.get_or_insert(Default::default());
203 let vec_index = self.bitmap.results_bits()[..index].count_ones();
204 results.remove(vec_index)
205 })
206 } else {
207 let (key, remaining) = key.split_at(RESULTS_BITS_END_NODE);
208 self.get_child_mut(key).and_then(|child| child.remove(remaining))
209 }
210 }
211
212 fn iter_with_prefix(&self, prefix: Key) -> impl Iterator<Item = (Key, &T)> + Send + Sync + '_ {
213 let results_iter = {
214 let prefix = prefix.clone();
215 self.results().map(move |(result_key, val)| {
216 let mut key = prefix.clone();
217 key.extend(result_key);
218 (key, val)
219 })
220 };
221 let children_iter = self.children()
222 .flat_map(move |(child_key, child)| {
223 let mut key = prefix.clone();
224 key.extend(child_key);
225 child.iter_with_prefix(key)
226 });
227 let children_iter: Box<dyn Iterator<Item = (Key, &T)> + Send + Sync + '_> = Box::new(children_iter);
228 results_iter.chain(children_iter)
229 }
230 fn iter_mut_with_prefix(&mut self, prefix: Key) -> impl Iterator<Item = (Key, &mut T)> + Send + Sync + '_ {
231 let results_iter = {
232 let prefix = prefix.clone();
233 results_mut(&self.bitmap, &mut self.results).map(move |(result_key, val)| {
234 let mut key = prefix.clone();
235 key.extend(result_key);
236 (key, val)
237 })
238 };
239 let children_iter = children_mut(&self.bitmap, &mut self.children)
240 .flat_map(move |(child_key, child)| {
241 let mut key = prefix.clone();
242 key.extend(child_key);
243 child.iter_mut_with_prefix(key)
244 });
245 let children_iter: Box<dyn Iterator<Item = (Key, &mut T)> + Send + Sync + '_> = Box::new(children_iter);
246 results_iter.chain(children_iter)
247 }
248
249 pub fn iter(&self) -> impl Iterator<Item = (Key, &T)> + '_ {
250 self.iter_with_prefix(Key::new())
251 }
252 pub fn iter_mut(&mut self) -> impl Iterator<Item = (Key, &mut T)> + '_ {
253 self.iter_mut_with_prefix(Key::new())
254 }
255
256 pub fn values(&self) -> impl Iterator<Item = &T> + Send + Sync + '_ {
257 let results_iter = self.results.iter().flat_map(|values| values.iter());
258 let children_iter = self.children.iter()
259 .flat_map(|children| children.iter())
260 .flat_map(|child| child.values());
261 let children_iter: Box<dyn Iterator<Item = &T> + Send + Sync + '_> = Box::new(children_iter);
262 results_iter.chain(children_iter)
263 }
264 pub fn values_mut(&mut self) -> impl Iterator<Item = &mut T> + Send + Sync + '_ {
265 let results_iter = self.results.iter_mut().flat_map(|values| values.iter_mut());
266 let children_iter = self.children.iter_mut()
267 .flat_map(|children| children.iter_mut())
268 .flat_map(|child| child.values_mut());
269 let children_iter: Box<dyn Iterator<Item = &mut T> + Send + Sync + '_> = Box::new(children_iter);
270 results_iter.chain(children_iter)
271 }
272
273 fn keys_with_prefix<'a>(&'a self, prefix: Key) -> impl Iterator<Item = Key> + Send + Sync + '_ {
274 let results_keys_iter = self.bitmap.results_keys_with_prefix(prefix.clone());
275 let children_keys_iter = self.children()
276 .flat_map(move |(child_key, child)| {
277 let mut key = prefix.clone();
278 key.extend(child_key);
279 child.keys_with_prefix(key)
280 });
281 let children_keys_iter: Box<dyn Iterator<Item = Key> + Send + Sync + '_> = Box::new(children_keys_iter);
282 results_keys_iter.chain(children_keys_iter)
283 }
284
285 pub fn keys(&self) -> impl Iterator<Item = Key> + '_ {
286 self.keys_with_prefix(Key::new())
287 }
288
289 pub fn exact(&self, key: KeyRef) -> Option<&T> {
290 if key.len() <= self.bitmap.results_capacity() {
291 let index = to_index(key);
292 self.bitmap.results_bits()[index].then(|| {
293 let vec_index = self.bitmap.results_bits()[..index].count_ones();
294 &self.results.as_ref().unwrap()[vec_index]
295 })
296 } else {
297 let (key, remaining) = key.split_at(RESULTS_BITS_END_NODE);
298 self.get_child(key).and_then(|child| child.exact(remaining))
299 }
300 }
301 pub fn exact_mut(&mut self, key: KeyRef) -> Option<&mut T> {
302 if key.len() <= self.bitmap.results_capacity() {
303 let index = to_index(key);
304 self.bitmap.results_bits()[index].then(|| {
305 let vec_index = self.bitmap.results_bits()[..index].count_ones();
306 &mut self.results.as_mut().unwrap()[vec_index]
307 })
308 } else {
309 let (key, remaining) = key.split_at(RESULTS_BITS_END_NODE);
310 self.get_child_mut(key).and_then(|child| child.exact_mut(remaining))
311 }
312 }
313
314 fn longest_match_with_prefix(&self, mut prefix: Key, mut key: KeyRef) -> Option<(Key, &T)> {
315 (key.len() > self.bitmap.results_capacity()).then(|| {
316 let mut prefix = prefix.clone();
317 let (key, remaining) = key.split_at(RESULTS_BITS_END_NODE);
318 prefix.extend(key);
319 self.get_child(key).and_then(|child| child.longest_match_with_prefix(prefix, remaining))
320 })
321 .flatten()
322 .or_else(|| {
323 loop {
324 if let Some(result) = self.exact(key) {
325 prefix.extend(key);
326 return Some((prefix, result));
327 }
328 if !key.is_empty() {
329 key = &key[..key.len() - 1];
330 } else {
331 break;
332 }
333 }
334 None
335 })
336 }
337 pub fn longest_match(&self, key: KeyRef) -> Option<(Key, &T)> {
338 self.longest_match_with_prefix(Key::new(), key)
339 }
340
341 fn or_longer_with_prefix(&self, prefix: Key, mut key: Key) -> Box<dyn Iterator<Item = (Key, &T)> + Send + Sync + '_> {
342 if key.len() > self.bitmap.results_capacity() {
343 let mut prefix = prefix.clone();
344 let remaining = key.split_off(RESULTS_BITS_END_NODE);
345 prefix.extend(&key);
346 if let Some(child) = self.get_child(&key) {
347 child.or_longer_with_prefix(prefix, remaining)
348 } else {
349 Box::new(std::iter::empty())
350 }
351 } else {
352 let results_iter = {
353 let prefix = prefix.clone();
354 let key = key.clone();
355 self.results()
356 .filter(move |(result_key, _)| {
357 result_key.starts_with(&key)
358 })
359 .map(move |(result_key, val)| {
360 let mut key = prefix.clone();
361 key.extend(result_key);
362 (key, val)
363 })
364 };
365 let children_iter = self.children()
366 .filter(move |(child_key, _)| {
367 child_key.starts_with(&key)
368 })
369 .flat_map(move |(child_key, child)| {
370 let mut key = prefix.clone();
371 key.extend(child_key);
372 child.iter_with_prefix(key)
373 });
374 let children_iter: Box<dyn Iterator<Item = (Key, &T)> + Send + Sync + '_> = Box::new(children_iter);
375 Box::new(results_iter.chain(children_iter))
376 }
377 }
378 pub fn or_longer(&self, key: Key) -> impl Iterator<Item = (Key, &T)> + '_ {
379 self.or_longer_with_prefix(Key::new(), key)
380 }
381
382 fn matches_with_prefix(&self, prefix: Key, mut key: Key) -> impl Iterator<Item = (Key, &T)> + Send + Sync + '_ {
383 let results_iter = {
384 let prefix = prefix.clone();
385 let key = key.clone();
386 self.results()
387 .filter(move |(result_key, _)| {
388 key.starts_with(result_key)
389 })
390 .map(move |(result_key, val)| {
391 let mut key = prefix.clone();
392 key.extend(result_key);
393 (key, val)
394 })
395 };
396 let children_iter = {
397 let key = key.clone();
398 self.children()
399 .filter(move |(child_key, _)| {
400 key.starts_with(child_key)
401 })
402 };
403 let children_iter = children_iter
404 .flat_map(move |(child_key, child)| {
405 let remaining = key.split_off(RESULTS_BITS_END_NODE);
406
407 let mut key = prefix.clone();
408 key.extend(child_key);
409 child.matches_with_prefix(key, remaining)
410 });
411 let children_iter: Box<dyn Iterator<Item = (Key, &T)> + Send + Sync + '_> = Box::new(children_iter);
412 results_iter.chain(children_iter)
413 }
414 pub fn matches(&self, key: Key) -> impl Iterator<Item = (Key, &T)> + '_ {
415 self.matches_with_prefix(Key::new(), key)
416 }
417}