nibbletree/
node.rs

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            // capacity is suffcient, insert into local node
179            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            // insert into child node
193            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}