sokoban/
avl_tree.rs

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
11// The number of registers (the last register is currently not in use).
12const REGISTERS: usize = 4;
13
14// Enum representing the fields of a node:
15// 0 - left pointer
16// 1 - right pointer
17// 2 - height of the (sub-)tree
18// TODO: add parent reference using the additional register (tree traversal
19// currently does not need this)
20#[derive(Debug, Copy, Clone, PartialEq, Eq)]
21pub enum Field {
22    Left = 0,
23    Right = 1,
24    Height = 2,
25}
26
27// Type representing a path entry (parent, branch, child) when
28// traversing the tree.
29type 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        // sanity check: the loop should be stopped by the break statement
348        // node_index == SENTINEL indicates that the key was not found
349        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            // path to the leftmost descendant
361            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            // drop the last inner_path element since it references the leftmost node
392            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        // safe to convert to i32 since height will be at most log2(capacity)
432        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                // TODO: How does one remove this unsafe?
772                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                // TODO: How does one remove this unsafe?
810                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}