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