1use bytemuck::{Pod, Zeroable};
2use std::ops::{Index, IndexMut};
3
4use crate::node_allocator::{
5 FromSlice, NodeAllocator, NodeAllocatorMap, OrderedNodeAllocatorMap, TreeField as Field,
6 ZeroCopy, SENTINEL,
7};
8
9#[repr(C)]
10#[derive(Default, Copy, Clone)]
11pub struct CritbitNode {
12 pub key: u128,
13 pub prefix_len: u64,
14 pub _padding: u64,
15}
16
17unsafe impl Zeroable for CritbitNode {}
18unsafe impl Pod for CritbitNode {}
19
20impl CritbitNode {
21 pub fn new(prefix_len: u64, key: u128) -> Self {
22 Self {
23 prefix_len,
24 key,
25 _padding: 0,
26 }
27 }
28}
29
30#[repr(C)]
31#[derive(Copy, Clone)]
32pub struct Critbit<
33 V: Default + Copy + Clone + Pod + Zeroable,
34 const NUM_NODES: usize,
35 const MAX_SIZE: usize,
36> {
37 _padding0: u64,
38 pub root: u32,
40 _padding1: u32,
41 node_allocator: NodeAllocator<CritbitNode, NUM_NODES, 4>,
43 leaves: NodeAllocator<V, MAX_SIZE, 4>,
46}
47
48unsafe impl<V: Default + Copy + Clone + Pod + Zeroable, const NUM_NODES: usize, const MAX_SIZE: usize>
49 Zeroable for Critbit<V, NUM_NODES, MAX_SIZE>
50{
51}
52
53unsafe impl<V: Default + Copy + Clone + Pod + Zeroable, const NUM_NODES: usize, const MAX_SIZE: usize>
54 Pod for Critbit<V, NUM_NODES, MAX_SIZE>
55{
56}
57
58impl<V: Default + Copy + Clone + Pod + Zeroable, const NUM_NODES: usize, const MAX_SIZE: usize>
59 ZeroCopy for Critbit<V, NUM_NODES, MAX_SIZE>
60{
61}
62
63impl<V: Default + Copy + Clone + Pod + Zeroable, const NUM_NODES: usize, const MAX_SIZE: usize>
64 Default for Critbit<V, NUM_NODES, MAX_SIZE>
65{
66 fn default() -> Self {
67 assert!(NUM_NODES >= 2 * MAX_SIZE);
68 Self {
69 _padding0: 0,
70 root: SENTINEL,
71 _padding1: 0,
72 node_allocator: NodeAllocator::<CritbitNode, NUM_NODES, 4>::default(),
73 leaves: NodeAllocator::<V, MAX_SIZE, 4>::default(),
74 }
75 }
76}
77
78impl<V: Default + Copy + Clone + Pod + Zeroable, const NUM_NODES: usize, const MAX_SIZE: usize>
79 FromSlice for Critbit<V, NUM_NODES, MAX_SIZE>
80{
81 fn new_from_slice(slice: &mut [u8]) -> &mut Self {
82 assert!(NUM_NODES >= 2 * MAX_SIZE);
83 let tree = Self::load_mut_bytes(slice).unwrap();
84 tree.initialize();
85 tree
86 }
87}
88
89impl<V: Default + Copy + Clone + Pod + Zeroable, const NUM_NODES: usize, const MAX_SIZE: usize>
90 NodeAllocatorMap<u128, V> for Critbit<V, NUM_NODES, MAX_SIZE>
91{
92 fn insert(&mut self, key: u128, value: V) -> Option<u32> {
93 self._insert(key, value)
94 }
95
96 fn remove(&mut self, key: &u128) -> Option<V> {
97 self._remove(key)
98 }
99
100 fn contains(&self, key: &u128) -> bool {
101 self.get(key).is_some()
102 }
103
104 fn get(&self, key: &u128) -> Option<&V> {
105 if self.is_empty() {
106 return None;
107 }
108 let mut node_index = self.root;
109 loop {
110 let node = self.get_node(node_index);
111 if !self.is_inner_node(node_index) {
112 if node.key == *key {
113 let leaf_index = self.get_leaf_index(node_index);
114 return Some(self.get_leaf(leaf_index));
115 } else {
116 return None;
117 }
118 }
119 let shared_prefix_len = (node.key ^ key).leading_zeros() as u64;
120 if shared_prefix_len >= node.prefix_len {
121 node_index = self.get_child(node.prefix_len, node_index, *key).0;
122 continue;
123 } else {
124 return None;
125 }
126 }
127 }
128
129 fn get_mut(&mut self, key: &u128) -> Option<&mut V> {
130 if self.is_empty() {
131 return None;
132 }
133 let mut node_index = self.root as u32;
134 loop {
135 let node = self.get_node(node_index);
136 if !self.is_inner_node(node_index) {
137 if node.key == *key {
138 let leaf_index = self.get_leaf_index(node_index);
139 return Some(self.get_leaf_mut(leaf_index));
140 } else {
141 return None;
142 }
143 }
144 let shared_prefix_len = (node.key ^ key).leading_zeros() as u64;
145 if shared_prefix_len >= node.prefix_len {
146 node_index = self.get_child(node.prefix_len, node_index, *key).0;
147 continue;
148 } else {
149 return None;
150 }
151 }
152 }
153
154 fn size(&self) -> usize {
155 self.leaves.size as usize
156 }
157
158 fn len(&self) -> usize {
159 self.leaves.size as usize
160 }
161
162 fn capacity(&self) -> usize {
163 MAX_SIZE
164 }
165
166 fn iter(&self) -> Box<dyn DoubleEndedIterator<Item = (&u128, &V)> + '_> {
167 Box::new(self._iter())
168 }
169
170 fn iter_mut(&mut self) -> Box<dyn DoubleEndedIterator<Item = (&u128, &mut V)> + '_> {
171 Box::new(self._iter_mut())
172 }
173}
174
175impl<V: Default + Copy + Clone + Pod + Zeroable, const NUM_NODES: usize, const MAX_SIZE: usize>
176 OrderedNodeAllocatorMap<u128, V> for Critbit<V, NUM_NODES, MAX_SIZE>
177{
178 fn get_min_index(&mut self) -> u32 {
179 self.find_min(self.root as u32)
180 }
181
182 fn get_max_index(&mut self) -> u32 {
183 self.find_max(self.root as u32)
184 }
185
186 fn get_min(&mut self) -> Option<(u128, V)> {
187 match self.get_min_index() {
188 SENTINEL => None,
189 i => {
190 let node = self.get_node(i);
191 let leaf = self.get_leaf(self.get_leaf_index(i));
192 Some((node.key, *leaf))
193 }
194 }
195 }
196
197 fn get_max(&mut self) -> Option<(u128, V)> {
198 match self.get_max_index() {
199 SENTINEL => None,
200 i => {
201 let node = self.get_node(i);
202 let leaf = self.get_leaf(self.get_leaf_index(i));
203 Some((node.key, *leaf))
204 }
205 }
206 }
207}
208
209impl<V: Default + Copy + Clone + Pod + Zeroable, const NUM_NODES: usize, const MAX_SIZE: usize>
210 Critbit<V, NUM_NODES, MAX_SIZE>
211{
212 pub fn new() -> Self {
213 Self::default()
214 }
215
216 pub fn initialize(&mut self) {
217 self.node_allocator.initialize();
218 self.leaves.initialize();
219 }
220
221 pub fn get_leaf(&self, leaf_index: u32) -> &V {
222 self.leaves.get(leaf_index).get_value()
223 }
224
225 pub fn get_leaf_mut(&mut self, leaf_index: u32) -> &mut V {
226 self.leaves.get_mut(leaf_index).get_value_mut()
227 }
228
229 fn get_leaf_index(&self, node: u32) -> u32 {
230 self.node_allocator.get_register(node, Field::Value as u32)
231 }
232
233 pub fn is_inner_node(&self, node: u32) -> bool {
234 self.node_allocator.get_register(node, Field::Value as u32) == SENTINEL
235 }
236
237 pub fn get_node(&self, node: u32) -> CritbitNode {
238 *self.node_allocator.get(node).get_value()
239 }
240
241 pub fn get_key(&self, node: u32) -> &u128 {
242 &self.node_allocator.get(node).get_value().key
243 }
244
245 #[inline(always)]
246 pub fn get_left(&self, node: u32) -> u32 {
247 self.node_allocator.get_register(node, Field::Left as u32)
248 }
249
250 #[inline(always)]
251 pub fn get_right(&self, node: u32) -> u32 {
252 self.node_allocator.get_register(node, Field::Right as u32)
253 }
254
255 #[inline(always)]
256 pub fn get_parent(&self, node: u32) -> u32 {
257 self.node_allocator.get_register(node, Field::Parent as u32)
258 }
259
260 pub fn get_node_mut(&mut self, node: u32) -> &mut CritbitNode {
261 self.node_allocator.get_mut(node).get_value_mut()
262 }
263
264 #[inline(always)]
265 fn replace_leaf(&mut self, leaf_index: u32, value: V) {
266 self.leaves.get_mut(leaf_index).set_value(value);
267 }
268
269 #[inline(always)]
270 fn add_leaf(&mut self, key: u128, value: V) -> (u32, u32) {
271 let node_index = self.node_allocator.add_node(CritbitNode::new(128, key));
272 let leaf_index = self.leaves.add_node(value);
273 self.node_allocator
274 .set_register(node_index, leaf_index, Field::Value as u32);
275 self.leaves.get_mut(leaf_index).set_value(value);
276 (node_index, leaf_index)
277 }
278
279 #[inline(always)]
280 fn get_child(&self, prefix_len: u64, node_index: u32, search_key: u128) -> (u32, bool) {
281 let crit_bit_mask = (1u128 << 127) >> prefix_len;
282 if (search_key & crit_bit_mask) != 0 {
283 (self.get_right(node_index), true)
284 } else {
285 (self.get_left(node_index), false)
286 }
287 }
288
289 #[inline(always)]
290 fn duplicate(&mut self, node_index: u32) -> u32 {
291 let index = self.node_allocator.add_node(self.get_node(node_index));
292 let left = self.get_left(node_index);
293 let right = self.get_right(node_index);
294 let value = self
295 .node_allocator
296 .get_register(node_index, Field::Value as u32);
297 self.node_allocator
298 .set_register(index, value, Field::Value as u32);
299 self.node_allocator
300 .connect(index, left, Field::Left as u32, Field::Parent as u32);
301 self.node_allocator
302 .connect(index, right, Field::Right as u32, Field::Parent as u32);
303 index
304 }
305
306 #[inline(always)]
307 fn replace_node(
308 &mut self,
309 node_index: u32,
310 node_contents: &CritbitNode,
311 left: u32,
312 right: u32,
313 ) {
314 *self.get_node_mut(node_index) = *node_contents;
315 self.node_allocator
316 .clear_register(node_index, Field::Value as u32);
317 self.node_allocator
318 .connect(node_index, left, Field::Left as u32, Field::Parent as u32);
319 self.node_allocator
320 .connect(node_index, right, Field::Right as u32, Field::Parent as u32);
321 }
322
323 #[inline(always)]
324 fn migrate(&mut self, source: u32, target: u32) {
325 let content = self.get_node(source);
326 *self.get_node_mut(target) = content;
327 if !self.is_inner_node(source) {
328 assert!(self.get_left(source) == SENTINEL);
329 assert!(self.get_right(source) == SENTINEL);
330 let leaf_index = self.get_leaf_index(source);
331 self.node_allocator
332 .clear_register(source, Field::Value as u32);
333 self.node_allocator
334 .set_register(target, leaf_index, Field::Value as u32);
335 }
336 assert!(self.get_leaf_index(source) == SENTINEL);
337 self.node_allocator.connect(
338 target,
339 self.get_left(source),
340 Field::Left as u32,
341 Field::Parent as u32,
342 );
343 self.node_allocator.connect(
344 target,
345 self.get_right(source),
346 Field::Right as u32,
347 Field::Parent as u32,
348 );
349 self.node_allocator
350 .clear_register(source, Field::Left as u32);
351 self.node_allocator
352 .clear_register(source, Field::Right as u32);
353 self.node_allocator.remove_node(source);
354 }
355
356 #[inline(always)]
357 fn remove_leaf(&mut self, node_index: u32) -> V {
358 let leaf_index = self.get_leaf_index(node_index);
359 let value = *self.get_leaf(leaf_index);
360 self.node_allocator
361 .clear_register(node_index, Field::Value as u32);
362 assert!(self.get_leaf_index(node_index) == SENTINEL);
363 let parent = self.get_parent(node_index);
364 if node_index == self.get_left(parent) {
365 self.node_allocator.disconnect(
366 node_index,
367 parent,
368 Field::Parent as u32,
369 Field::Left as u32,
370 );
371 } else if node_index == self.get_right(parent) {
372 self.node_allocator.disconnect(
373 node_index,
374 parent,
375 Field::Parent as u32,
376 Field::Right as u32,
377 );
378 } else if parent != SENTINEL {
379 panic!("Parent is not connected to child");
380 }
381 self.leaves.remove_node(leaf_index);
382 self.node_allocator.remove_node(node_index);
383 value
384 }
385
386 pub fn get_addr(&self, key: u128) -> u32 {
387 let mut node_index = self.root as u32;
388 loop {
389 let node = self.get_node(node_index);
390 if !self.is_inner_node(node_index) {
391 if node.key == key {
392 return node_index;
393 } else {
394 return SENTINEL;
395 }
396 }
397 let shared_prefix_len = (node.key ^ key).leading_zeros() as u64;
398 if shared_prefix_len >= node.prefix_len {
399 node_index = self.get_child(node.prefix_len, node_index, key).0;
400 continue;
401 } else {
402 return SENTINEL;
403 }
404 }
405 }
406
407 fn _insert(&mut self, key: u128, value: V) -> Option<u32> {
408 if self.root == SENTINEL {
409 let (node_index, _leaf_index) = self.add_leaf(key, value);
410 self.root = node_index;
411 return Some(self.root);
412 }
413 if self.len() >= self.capacity() {
415 return None;
416 }
417 let mut node_index = self.root;
418 loop {
419 let node = self.get_node(node_index);
420 if node.key == key && !self.is_inner_node(node_index) {
421 let leaf_index = self.get_leaf_index(node_index);
423 self.replace_leaf(leaf_index, value);
424 return Some(node_index);
425 }
426 let shared_prefix_len = (node.key ^ key).leading_zeros() as u64;
427 if shared_prefix_len >= node.prefix_len {
428 node_index = self.get_child(node.prefix_len, node_index, key).0;
429 continue;
430 }
431 let crit_bit_mask: u128 = (1u128 << 127) >> shared_prefix_len;
432 let is_right = (crit_bit_mask & key) != 0;
433 let (node_leaf_index, _leaf_index) = self.add_leaf(key, value);
434 let moved_node_index = self.duplicate(node_index);
435 let new_node = CritbitNode::new(shared_prefix_len, key);
436 if is_right {
437 self.replace_node(node_index, &new_node, moved_node_index, node_leaf_index);
438 } else {
439 self.replace_node(node_index, &new_node, node_leaf_index, moved_node_index);
440 }
441 return Some(node_leaf_index);
442 }
443 }
444
445 fn _remove(&mut self, key: &u128) -> Option<V> {
446 let nsize = self.node_allocator.size;
447 let lsize = self.leaves.size;
448 let mut parent = self.root;
449 let mut child: u32;
450 let mut is_right: bool;
451 if self.len() == 0 {
452 return None;
453 }
454 if self.is_inner_node(parent) {
455 let node = self.get_node(parent);
456 let (c, ir) = self.get_child(node.prefix_len, parent, *key);
457 child = c;
458 is_right = ir;
459 } else {
460 let leaf = self.get_node(parent);
461 if leaf.key == *key {
462 self.root = SENTINEL;
463 assert!(self.len() == 1);
464 return Some(self.remove_leaf(parent));
465 } else {
466 return None;
467 }
468 }
469 loop {
470 let node = self.get_node(child);
471 if self.is_inner_node(child) {
472 let (grandchild, grandchild_crit_bit) =
473 self.get_child(node.prefix_len, child, *key);
474 parent = child;
475 child = grandchild;
476 is_right = grandchild_crit_bit;
477 } else {
478 if node.key != *key {
479 return None;
480 }
481 break;
482 }
483 }
484 let sibling = if is_right {
485 self.get_left(parent)
486 } else {
487 self.get_right(parent)
488 };
489 let leaf = self.remove_leaf(child);
490 self.migrate(sibling, parent);
491 assert!(nsize - self.node_allocator.size == 2);
492 assert!(lsize - self.leaves.size == 1);
493 Some(leaf)
494 }
495
496 fn find_min(&self, index: u32) -> u32 {
497 let mut node = index;
498 while self.get_left(node) != SENTINEL {
499 node = self.get_left(node);
500 }
501 node
502 }
503
504 fn find_max(&self, index: u32) -> u32 {
505 let mut node = index;
506 while self.get_right(node) != SENTINEL {
507 node = self.get_right(node);
508 }
509 node
510 }
511
512 fn _iter(&self) -> CritbitIterator<'_, V, NUM_NODES, MAX_SIZE> {
513 if self.root == SENTINEL {
514 CritbitIterator::<V, NUM_NODES, MAX_SIZE> {
515 tree: self,
516 fwd_stack: vec![],
517 fwd_node: None,
518 rev_stack: vec![],
519 rev_node: None,
520 terminated: false,
521 }
522 } else {
523 CritbitIterator::<V, NUM_NODES, MAX_SIZE> {
524 tree: self,
525 fwd_stack: vec![self.root],
526 fwd_node: None,
527 rev_stack: vec![self.root],
528 rev_node: None,
529 terminated: false,
530 }
531 }
532 }
533
534 fn _iter_mut(&mut self) -> CritbitIteratorMut<'_, V, NUM_NODES, MAX_SIZE> {
535 let node = self.root;
536 if node == SENTINEL {
537 CritbitIteratorMut::<V, NUM_NODES, MAX_SIZE> {
538 tree: self,
539 fwd_stack: vec![],
540 fwd_node: None,
541 rev_stack: vec![],
542 rev_node: None,
543 terminated: false,
544 }
545 } else {
546 CritbitIteratorMut::<V, NUM_NODES, MAX_SIZE> {
547 tree: self,
548 fwd_stack: vec![node],
549 fwd_node: None,
550 rev_stack: vec![node],
551 rev_node: None,
552 terminated: false,
553 }
554 }
555 }
556}
557
558impl<
559 'a,
560 V: Default + Copy + Clone + Pod + Zeroable,
561 const MAX_NODES: usize,
562 const MAX_SIZE: usize,
563 > IntoIterator for &'a Critbit<V, MAX_NODES, MAX_SIZE>
564{
565 type Item = (&'a u128, &'a V);
566 type IntoIter = CritbitIterator<'a, V, MAX_NODES, MAX_SIZE>;
567
568 fn into_iter(self) -> Self::IntoIter {
569 self._iter()
570 }
571}
572
573impl<
574 'a,
575 V: Default + Copy + Clone + Pod + Zeroable,
576 const MAX_NODES: usize,
577 const MAX_SIZE: usize,
578 > IntoIterator for &'a mut Critbit<V, MAX_NODES, MAX_SIZE>
579{
580 type Item = (&'a u128, &'a mut V);
581 type IntoIter = CritbitIteratorMut<'a, V, MAX_NODES, MAX_SIZE>;
582
583 fn into_iter(self) -> Self::IntoIter {
584 self._iter_mut()
585 }
586}
587
588pub struct CritbitIterator<
589 'a,
590 V: Default + Copy + Clone + Pod + Zeroable,
591 const MAX_NODES: usize,
592 const MAX_SIZE: usize,
593> {
594 tree: &'a Critbit<V, MAX_NODES, MAX_SIZE>,
595 fwd_stack: Vec<u32>,
596 fwd_node: Option<u32>,
597 rev_stack: Vec<u32>,
598 rev_node: Option<u32>,
599 terminated: bool,
600}
601
602impl<
603 'a,
604 V: Default + Copy + Clone + Pod + Zeroable,
605 const MAX_NODES: usize,
606 const MAX_SIZE: usize,
607 > Iterator for CritbitIterator<'a, V, MAX_NODES, MAX_SIZE>
608{
609 type Item = (&'a u128, &'a V);
610
611 fn next(&mut self) -> Option<Self::Item> {
612 while !self.terminated && !self.fwd_stack.is_empty() {
613 let node = self.fwd_stack.pop();
614 match node {
615 Some(n) => {
616 if !self.tree.is_inner_node(n) {
617 let i = self.tree.get_leaf_index(n);
618 if Some(i) == self.rev_node {
619 self.terminated = true;
620 return None;
621 }
622 self.fwd_node = Some(i);
623 let v = self.tree.get_leaf(i);
624 let k = self.tree.get_key(n);
625 return Some((k, v));
626 } else {
627 self.fwd_stack.push(self.tree.get_right(n));
628 self.fwd_stack.push(self.tree.get_left(n));
629 }
630 }
631 _ => return None,
632 }
633 }
634 None
635 }
636}
637
638impl<
639 'a,
640 V: Default + Copy + Clone + Pod + Zeroable,
641 const MAX_NODES: usize,
642 const MAX_SIZE: usize,
643 > DoubleEndedIterator for CritbitIterator<'a, V, MAX_NODES, MAX_SIZE>
644{
645 fn next_back(&mut self) -> Option<Self::Item> {
646 while !self.terminated && !self.rev_stack.is_empty() {
647 let node = self.rev_stack.pop();
648 match node {
649 Some(n) => {
650 if !self.tree.is_inner_node(n) {
651 let i = self.tree.get_leaf_index(n);
652 if Some(i) == self.fwd_node {
653 self.terminated = true;
654 return None;
655 }
656 self.rev_node = Some(i);
657 let v = self.tree.get_leaf(i);
658 let k = self.tree.get_key(n);
659 return Some((k, v));
660 } else {
661 self.rev_stack.push(self.tree.get_left(n));
662 self.rev_stack.push(self.tree.get_right(n));
663 }
664 }
665 _ => return None,
666 }
667 }
668 None
669 }
670}
671
672pub struct CritbitIteratorMut<
673 'a,
674 V: Default + Copy + Clone + Pod + Zeroable,
675 const MAX_NODES: usize,
676 const MAX_SIZE: usize,
677> {
678 tree: &'a mut Critbit<V, MAX_NODES, MAX_SIZE>,
679 fwd_stack: Vec<u32>,
680 fwd_node: Option<u32>,
681 rev_stack: Vec<u32>,
682 rev_node: Option<u32>,
683 terminated: bool,
684}
685
686impl<
687 'a,
688 V: Default + Copy + Clone + Pod + Zeroable,
689 const MAX_NODES: usize,
690 const MAX_SIZE: usize,
691 > Iterator for CritbitIteratorMut<'a, V, MAX_NODES, MAX_SIZE>
692{
693 type Item = (&'a u128, &'a mut V);
694
695 fn next(&mut self) -> Option<Self::Item> {
696 while !self.terminated && !self.fwd_stack.is_empty() {
697 let node = self.fwd_stack.pop();
698 match node {
699 Some(n) => {
700 if !self.tree.is_inner_node(n) {
701 let i = self.tree.get_leaf_index(n);
702 if Some(i) == self.rev_node {
703 self.terminated = true;
704 return None;
705 }
706 self.fwd_node = Some(i);
707 unsafe {
708 let key = &(*self
709 .tree
710 .node_allocator
711 .nodes
712 .as_ptr()
713 .add((n - 1) as usize))
714 .get_value()
715 .key;
716 let leaf = (*self.tree.leaves.nodes.as_mut_ptr().add((i - 1) as usize))
717 .get_value_mut();
718 return Some((key, leaf));
719 }
720 } else {
721 self.fwd_stack.push(self.tree.get_right(n));
722 self.fwd_stack.push(self.tree.get_left(n));
723 }
724 }
725 _ => return None,
726 }
727 }
728 None
729 }
730}
731
732impl<
733 'a,
734 V: Default + Copy + Clone + Pod + Zeroable,
735 const MAX_NODES: usize,
736 const MAX_SIZE: usize,
737 > DoubleEndedIterator for CritbitIteratorMut<'a, V, MAX_NODES, MAX_SIZE>
738{
739 fn next_back(&mut self) -> Option<Self::Item> {
740 while !self.terminated && !self.rev_stack.is_empty() {
741 let node = self.rev_stack.pop();
742 match node {
743 Some(n) => {
744 if !self.tree.is_inner_node(n) {
745 let i = self.tree.get_leaf_index(n);
746 if Some(i) == self.fwd_node {
747 self.terminated = true;
748 return None;
749 }
750 self.rev_node = Some(i);
751 unsafe {
752 let key = &(*self
753 .tree
754 .node_allocator
755 .nodes
756 .as_ptr()
757 .add((n - 1) as usize))
758 .get_value()
759 .key;
760 let leaf = (*self.tree.leaves.nodes.as_mut_ptr().add((i - 1) as usize))
761 .get_value_mut();
762 return Some((key, leaf));
763 }
764 } else {
765 self.rev_stack.push(self.tree.get_left(n));
766 self.rev_stack.push(self.tree.get_right(n));
767 }
768 }
769 _ => return None,
770 }
771 }
772 None
773 }
774}
775
776impl<V: Default + Copy + Clone + Pod + Zeroable, const NUM_NODES: usize, const MAX_SIZE: usize>
777 Index<u128> for Critbit<V, NUM_NODES, MAX_SIZE>
778{
779 type Output = V;
780
781 fn index(&self, index: u128) -> &Self::Output {
782 self.get(&index).unwrap()
783 }
784}
785
786impl<V: Default + Copy + Clone + Pod + Zeroable, const NUM_NODES: usize, const MAX_SIZE: usize>
787 IndexMut<u128> for Critbit<V, NUM_NODES, MAX_SIZE>
788{
789 fn index_mut(&mut self, index: u128) -> &mut Self::Output {
790 self.get_mut(&index).unwrap()
791 }
792}