sokoban/
red_black_tree.rs

1use bytemuck::{Pod, Zeroable};
2use num_derive::FromPrimitive;
3use num_traits::FromPrimitive;
4use std::{
5    cmp::Ordering,
6    fmt::Debug,
7    ops::{Index, IndexMut},
8    vec,
9};
10
11use crate::node_allocator::{
12    FromSlice, NodeAllocator, NodeAllocatorMap, OrderedNodeAllocatorMap, TreeField as Field,
13    ZeroCopy, SENTINEL,
14};
15
16pub const ALIGNMENT: u32 = 8;
17
18// Register aliases
19pub const COLOR: u32 = Field::Value as u32;
20
21#[derive(Debug, Copy, Clone, PartialEq, Eq, FromPrimitive)]
22pub enum Color {
23    Black = 0,
24    Red = 1,
25}
26
27/// Exploits the fact that LEFT and RIGHT are set to 0 and 1 respectively
28#[inline(always)]
29fn opposite(dir: u32) -> u32 {
30    1 - dir
31}
32
33#[repr(C)]
34#[derive(Default, Copy, Clone)]
35pub struct RBNode<
36    K: PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
37    V: Default + Copy + Clone + Pod + Zeroable,
38> {
39    pub key: K,
40    pub value: V,
41}
42
43unsafe impl<
44        K: PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
45        V: Default + Copy + Clone + Pod + Zeroable,
46    > Zeroable for RBNode<K, V>
47{
48}
49unsafe impl<
50        K: PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
51        V: Default + Copy + Clone + Pod + Zeroable,
52    > Pod for RBNode<K, V>
53{
54}
55
56impl<
57        K: PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
58        V: Default + Copy + Clone + Pod + Zeroable,
59    > RBNode<K, V>
60{
61    pub fn new(key: K, value: V) -> Self {
62        Self { key, value }
63    }
64}
65
66#[repr(C)]
67#[derive(Copy, Clone)]
68pub struct RedBlackTree<
69    K: PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
70    V: Default + Copy + Clone + Pod + Zeroable,
71    const MAX_SIZE: usize,
72> {
73    pub root: u32,
74    _padding: [u32; 3],
75    allocator: NodeAllocator<RBNode<K, V>, MAX_SIZE, 4>,
76}
77
78unsafe impl<
79        K: PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
80        V: Default + Copy + Clone + Pod + Zeroable,
81        const MAX_SIZE: usize,
82    > Zeroable for RedBlackTree<K, V, MAX_SIZE>
83{
84}
85unsafe impl<
86        K: PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
87        V: Default + Copy + Clone + Pod + Zeroable,
88        const MAX_SIZE: usize,
89    > Pod for RedBlackTree<K, V, MAX_SIZE>
90{
91}
92
93impl<
94        K: PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
95        V: Default + Copy + Clone + Pod + Zeroable,
96        const MAX_SIZE: usize,
97    > ZeroCopy for RedBlackTree<K, V, MAX_SIZE>
98{
99}
100
101impl<
102        K: Debug + PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
103        V: Default + Copy + Clone + Pod + Zeroable,
104        const MAX_SIZE: usize,
105    > Default for RedBlackTree<K, V, MAX_SIZE>
106{
107    fn default() -> Self {
108        Self::assert_proper_alignment();
109        RedBlackTree {
110            root: SENTINEL,
111            _padding: [0; 3],
112            allocator: NodeAllocator::<RBNode<K, V>, MAX_SIZE, 4>::default(),
113        }
114    }
115}
116
117impl<
118        K: Debug + PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
119        V: Default + Copy + Clone + Pod + Zeroable,
120        const MAX_SIZE: usize,
121    > FromSlice for RedBlackTree<K, V, MAX_SIZE>
122{
123    fn new_from_slice(slice: &mut [u8]) -> &mut Self {
124        Self::assert_proper_alignment();
125        let tree = Self::load_mut_bytes(slice).unwrap();
126        tree.initialize();
127        tree
128    }
129}
130
131impl<
132        K: Debug + PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
133        V: Default + Copy + Clone + Pod + Zeroable,
134        const MAX_SIZE: usize,
135    > NodeAllocatorMap<K, V> for RedBlackTree<K, V, MAX_SIZE>
136{
137    fn insert(&mut self, key: K, value: V) -> Option<u32> {
138        self._insert(key, value)
139    }
140
141    fn remove(&mut self, key: &K) -> Option<V> {
142        self._remove(key)
143    }
144
145    fn contains(&self, key: &K) -> bool {
146        self.get(key).is_some()
147    }
148
149    fn get(&self, key: &K) -> Option<&V> {
150        let node_index = self.get_addr(key);
151        if node_index == SENTINEL {
152            None
153        } else {
154            Some(&self.get_node(node_index).value)
155        }
156    }
157
158    fn get_mut(&mut self, key: &K) -> Option<&mut V> {
159        let node_index = self.get_addr(key);
160        if node_index == SENTINEL {
161            None
162        } else {
163            Some(&mut self.get_node_mut(node_index).value)
164        }
165    }
166
167    fn size(&self) -> usize {
168        self.allocator.size as usize
169    }
170
171    fn len(&self) -> usize {
172        self.allocator.size as usize
173    }
174
175    fn capacity(&self) -> usize {
176        MAX_SIZE
177    }
178
179    fn iter(&self) -> Box<dyn DoubleEndedIterator<Item = (&K, &V)> + '_> {
180        Box::new(self._iter())
181    }
182
183    fn iter_mut(&mut self) -> Box<dyn DoubleEndedIterator<Item = (&K, &mut V)> + '_> {
184        Box::new(self._iter_mut())
185    }
186}
187
188impl<
189        K: Debug + PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
190        V: Default + Copy + Clone + Pod + Zeroable,
191        const MAX_SIZE: usize,
192    > OrderedNodeAllocatorMap<K, V> for RedBlackTree<K, V, MAX_SIZE>
193{
194    fn get_min_index(&mut self) -> u32 {
195        self._find_min(self.root)
196    }
197
198    fn get_max_index(&mut self) -> u32 {
199        self._find_max(self.root)
200    }
201
202    fn get_min(&mut self) -> Option<(K, V)> {
203        match self.get_min_index() {
204            SENTINEL => None,
205            i => {
206                let node = self.get_node(i);
207                Some((node.key, node.value))
208            }
209        }
210    }
211
212    fn get_max(&mut self) -> Option<(K, V)> {
213        match self.get_max_index() {
214            SENTINEL => None,
215            i => {
216                let node = self.get_node(i);
217                Some((node.key, node.value))
218            }
219        }
220    }
221}
222
223impl<
224        K: Debug + PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
225        V: Default + Copy + Clone + Pod + Zeroable,
226        const MAX_SIZE: usize,
227    > RedBlackTree<K, V, MAX_SIZE>
228{
229    pub fn pretty_print(&self) {
230        if self.len() == 0 {
231            return;
232        }
233        let mut s = String::new();
234        let mut stack = vec![(self.root, "".to_string(), "".to_string())];
235
236        while !stack.is_empty() {
237            let (node, mut padding, pointer) = stack.pop().unwrap();
238            if node == SENTINEL {
239                continue;
240            }
241            let key = self.get_node(node).key;
242            s.push_str(&padding);
243            s.push_str(&pointer);
244            if self.is_red(node) {
245                // Prints red nodes in red
246                s.push_str(&format!("\u{001b}[31m{:?}\u{001b}[0m", key));
247            } else {
248                s.push_str(&format!("{:?}", key));
249            }
250            s.push('\n');
251            padding.push_str("│  ");
252
253            let right_pointer = "└──".to_string();
254            let left_pointer = if self.get_right(node) != SENTINEL {
255                "├──".to_string()
256            } else {
257                "└──".to_string()
258            };
259
260            stack.push((self.get_right(node), padding.clone(), right_pointer));
261            stack.push((self.get_left(node), padding.clone(), left_pointer));
262        }
263        println!("{}", s);
264    }
265
266    fn assert_proper_alignment() {
267        // TODO is this a sufficient coverage of the edge cases?
268        assert!(std::mem::size_of::<V>() % std::mem::align_of::<K>() == 0);
269        assert!(std::mem::size_of::<RBNode<K, V>>() % std::mem::align_of::<RBNode<K, V>>() == 0);
270        assert!(std::mem::size_of::<RBNode<K, V>>() % 8_usize == 0);
271    }
272
273    pub fn is_valid_red_black_tree(&self) -> bool {
274        if self.len() == 0 {
275            return true;
276        }
277        // The root must be black
278        if self.is_red(self.root) {
279            println!("Invalid Red-Black Tree: Root is red");
280            return false;
281        }
282
283        let mut stack = vec![(self.root, 0)];
284        let mut black_count = vec![];
285
286        while !stack.is_empty() {
287            let (node_index, mut count) = stack.pop().unwrap();
288            count += self.is_black(node_index) as u32;
289            if self.is_leaf(node_index) {
290                black_count.push(count);
291                continue;
292            }
293            for child in [self.get_left(node_index), self.get_right(node_index)] {
294                if child == SENTINEL {
295                    continue;
296                }
297                // Red nodes cannot have red children
298                if self.is_red(node_index) && self.is_red(child) {
299                    println!(
300                        "Invalid Red-Black Tree: Red node (key: {:?}) has red child",
301                        self.get_node(node_index).key
302                    );
303                    return false;
304                }
305                stack.push((child, count));
306            }
307        }
308        // All paths from root to leaf must have the same number of black nodes
309        let balanced = black_count.iter().all(|&x| x == black_count[0]);
310        if !balanced {
311            println!("Invalid Red-Black Tree: All paths must have the same number of black nodes",);
312        }
313        balanced
314    }
315
316    pub fn new() -> Self {
317        Self::default()
318    }
319
320    #[inline(always)]
321    pub fn initialize(&mut self) {
322        self.allocator.initialize();
323    }
324
325    pub fn get_node(&self, node: u32) -> &RBNode<K, V> {
326        self.allocator.get(node).get_value()
327    }
328
329    pub fn get_node_mut(&mut self, node: u32) -> &mut RBNode<K, V> {
330        self.allocator.get_mut(node).get_value_mut()
331    }
332
333    #[inline(always)]
334    fn _color_red(&mut self, node: u32) {
335        if node != SENTINEL {
336            self.allocator.set_register(node, Color::Red as u32, COLOR);
337        }
338    }
339
340    #[inline(always)]
341    fn _color_black(&mut self, node: u32) {
342        self.allocator
343            .set_register(node, Color::Black as u32, COLOR);
344    }
345
346    #[inline(always)]
347    fn _color_node(&mut self, node: u32, color: u32) {
348        self.allocator.set_register(node, color, COLOR);
349    }
350
351    #[inline(always)]
352    pub fn is_red(&self, node: u32) -> bool {
353        self.allocator.get_register(node, COLOR) == Color::Red as u32
354    }
355
356    #[inline(always)]
357    pub fn is_black(&self, node: u32) -> bool {
358        self.allocator.get_register(node, COLOR) == Color::Black as u32
359    }
360
361    #[inline(always)]
362    pub fn get_child(&self, node: u32, dir: u32) -> u32 {
363        self.allocator.get_register(node, dir)
364    }
365
366    #[inline(always)]
367    pub fn is_leaf(&self, node: u32) -> bool {
368        self.get_left(node) == SENTINEL && self.get_right(node) == SENTINEL
369    }
370
371    #[inline(always)]
372    pub fn is_root(&self, node: u32) -> bool {
373        self.root == node
374    }
375
376    pub fn get_dir(&self, node: u32, dir: u32) -> u32 {
377        if dir == Field::Left as u32 {
378            self.get_left(node)
379        } else {
380            self.get_right(node)
381        }
382    }
383
384    #[inline(always)]
385    pub fn get_left(&self, node: u32) -> u32 {
386        self.allocator.get_register(node, Field::Left as u32)
387    }
388
389    #[inline(always)]
390    pub fn get_right(&self, node: u32) -> u32 {
391        self.allocator.get_register(node, Field::Right as u32)
392    }
393
394    #[inline(always)]
395    pub fn get_color(&self, node: u32) -> u32 {
396        self.allocator.get_register(node, COLOR)
397    }
398
399    #[inline(always)]
400    pub fn get_parent(&self, node: u32) -> u32 {
401        self.allocator.get_register(node, Field::Parent as u32)
402    }
403
404    pub fn remove_root(&mut self) -> Option<RBNode<K, V>> {
405        if self.root == SENTINEL {
406            // If the tree is empty, there is no root to remove
407            None
408        } else {
409            // Otherwise copy out and remove tree node
410            let root_node = self.get_node(self.root).clone();
411            self._remove_tree_node(self.root);
412            Some(root_node)
413        }
414    }
415
416    fn _remove_allocator_node(&mut self, node: u32) {
417        // Clear all registers
418        self.allocator.clear_register(node, Field::Parent as u32);
419        self.allocator.clear_register(node, COLOR);
420        self.allocator.clear_register(node, Field::Left as u32);
421        self.allocator.clear_register(node, Field::Right as u32);
422        // Add free slot to the free list
423        self.allocator.remove_node(node);
424    }
425
426    #[inline(always)]
427    fn _connect(&mut self, parent: u32, child: u32, dir: u32) {
428        self.allocator
429            .connect(parent, child, dir, Field::Parent as u32);
430    }
431
432    #[inline(always)]
433    fn _child_dir(&self, parent: u32, child: u32) -> u32 {
434        let left = self.get_left(parent);
435        let right = self.get_right(parent);
436        if child == left {
437            Field::Left as u32
438        } else if child == right {
439            Field::Right as u32
440        } else {
441            panic!("Nodes are not connected");
442        }
443    }
444
445    fn _rotate_dir(&mut self, parent_index: u32, dir: u32) -> Option<u32> {
446        let grandparent_index = self.get_parent(parent_index);
447        if !matches!(
448            FromPrimitive::from_u32(dir),
449            Some(Field::Left) | Some(Field::Right),
450        ) {
451            return None;
452        }
453        let sibling_index = self.get_child(parent_index, opposite(dir));
454        if sibling_index == SENTINEL {
455            return None;
456        }
457        let child_index = self.get_child(sibling_index, dir);
458        self._connect(sibling_index, parent_index, dir);
459        self._connect(parent_index, child_index, opposite(dir));
460        if grandparent_index != SENTINEL {
461            self._connect(
462                grandparent_index,
463                sibling_index,
464                self._child_dir(grandparent_index, parent_index),
465            );
466        } else {
467            self.allocator
468                .clear_register(sibling_index, Field::Parent as u32);
469            self.root = sibling_index;
470        }
471        Some(sibling_index)
472    }
473
474    fn _insert(&mut self, key: K, value: V) -> Option<u32> {
475        let mut parent_node_index = self.root;
476        let new_node = RBNode::<K, V>::new(key, value);
477        if parent_node_index == SENTINEL {
478            let node_index = self.allocator.add_node(new_node);
479            self.root = node_index;
480            return Some(node_index);
481        }
482        loop {
483            let curr_key = self.get_node(parent_node_index).key;
484            let (target, dir) = match key.cmp(&curr_key) {
485                Ordering::Less => (self.get_left(parent_node_index), Field::Left as u32),
486                Ordering::Greater => (self.get_right(parent_node_index), Field::Right as u32),
487                Ordering::Equal => {
488                    self.get_node_mut(parent_node_index).value = value;
489                    return Some(parent_node_index);
490                }
491            };
492            if target == SENTINEL {
493                if self.len() >= self.capacity() {
494                    return None;
495                }
496                let node_index = self.allocator.add_node(new_node);
497                self._color_red(node_index);
498                self._connect(parent_node_index, node_index, dir);
499                let grandparent = self.get_parent(parent_node_index);
500                // This is only false when the parent is the root
501                if grandparent != SENTINEL {
502                    self._fix_insert(node_index);
503                }
504                return Some(node_index);
505            }
506            parent_node_index = target
507        }
508    }
509
510    fn _fix_insert(&mut self, mut node: u32) -> Option<()> {
511        while self.is_red(self.get_parent(node)) {
512            let mut parent = self.get_parent(node);
513            let mut grandparent = self.get_parent(parent);
514            if grandparent == SENTINEL {
515                assert!(self.is_root(parent));
516                break;
517            }
518            let dir = self._child_dir(grandparent, parent);
519            let uncle = self.get_child(grandparent, opposite(dir));
520            if self.is_red(uncle) {
521                self._color_black(uncle);
522                self._color_black(parent);
523                self._color_red(grandparent);
524                node = grandparent;
525            } else {
526                if self._child_dir(parent, node) == opposite(dir) {
527                    self._rotate_dir(parent, dir);
528                    node = parent;
529                }
530                parent = self.get_parent(node);
531                grandparent = self.get_parent(parent);
532                self._color_black(parent);
533                self._color_red(grandparent);
534                self._rotate_dir(grandparent, opposite(dir));
535            }
536        }
537        self._color_black(self.root as u32);
538        Some(())
539    }
540
541    fn _remove(&mut self, key: &K) -> Option<V> {
542        let mut curr_node_index = self.root as u32;
543        if curr_node_index == SENTINEL {
544            return None;
545        }
546        loop {
547            let RBNode {
548                key: curr_key,
549                value: curr_value,
550            } = *self.allocator.get(curr_node_index).get_value();
551            let target = match key.cmp(&curr_key) {
552                Ordering::Less => self.get_left(curr_node_index),
553                Ordering::Greater => self.get_right(curr_node_index),
554                Ordering::Equal => {
555                    self._remove_tree_node(curr_node_index);
556                    return Some(curr_value);
557                }
558            };
559            if target == SENTINEL {
560                return None;
561            }
562            curr_node_index = target
563        }
564    }
565
566    fn _remove_tree_node(&mut self, node_index: u32) {
567        let mut is_black = self.is_black(node_index);
568        let left = self.get_left(node_index);
569        let right = self.get_right(node_index);
570        let (pivot_node_index, parent_and_dir) = if self.is_leaf(node_index) {
571            if !self.is_root(node_index) {
572                let parent = self.get_parent(node_index);
573                let dir = self._child_dir(parent, node_index);
574                // Remove pointer to the removed leaf node
575                self._connect(parent, SENTINEL, dir);
576                (SENTINEL, Some((parent, dir)))
577            } else {
578                // Set the root to SENTINEL
579                self.root = SENTINEL;
580                (SENTINEL, None)
581            }
582        } else if left == SENTINEL {
583            self._transplant(node_index, right);
584            (right, None)
585        } else if right == SENTINEL {
586            self._transplant(node_index, left);
587            (left, None)
588        } else {
589            // Find the largest node in the left subtree
590            let mut parent_and_dir = None;
591            let max_left = self._find_max(left);
592            let max_left_parent = self.get_parent(max_left);
593            let max_left_child = self.get_left(max_left);
594            is_black = self.is_black(max_left);
595
596            // If max_left is not equal to root of the left subtree, then
597            // replace the root of the left subtree with max_left and replace
598            // max_left with max_left_child
599            if self.get_parent(max_left) != node_index {
600                self._transplant(max_left, max_left_child);
601                // We perform this operation in the conditional because we do not
602                // want to form a cycle
603                self._connect(max_left, self.get_left(node_index), Field::Left as u32);
604                if max_left_child == SENTINEL {
605                    parent_and_dir = Some((max_left_parent, Field::Right as u32));
606                }
607            } else if max_left_child == SENTINEL {
608                // The only time this is called is when the left subtree is
609                // a single node
610                assert!(self.is_leaf(max_left));
611                parent_and_dir = Some((max_left, Field::Left as u32));
612            }
613
614            // Complete the transplant of max_left
615            self._transplant(node_index, max_left);
616            self._connect(max_left, self.get_right(node_index), Field::Right as u32);
617
618            self._color_node(max_left, self.get_color(node_index));
619
620            (max_left_child, parent_and_dir)
621        };
622
623        // Completely remove the current node index from the tree
624        self._remove_allocator_node(node_index);
625
626        if is_black {
627            if self.is_root(pivot_node_index) {
628                self._color_black(pivot_node_index);
629            } else {
630                self._fix_remove(pivot_node_index, parent_and_dir);
631            }
632        }
633    }
634
635    fn _fix_remove(&mut self, mut node_index: u32, parent_and_dir: Option<(u32, u32)>) {
636        let (mut parent, mut dir) = parent_and_dir.unwrap_or({
637            let parent = self.get_parent(node_index);
638            let dir = self._child_dir(parent, node_index);
639            (parent, dir)
640        });
641        loop {
642            let mut sibling = self.get_child(parent, opposite(dir));
643            if self.is_red(sibling) {
644                self._color_black(sibling);
645                self._color_red(parent);
646                self._rotate_dir(parent, dir);
647                sibling = self.get_dir(parent, opposite(dir));
648            }
649            if self.is_black(self.get_left(sibling)) && self.is_black(self.get_right(sibling)) {
650                self._color_red(sibling);
651                node_index = parent;
652            } else {
653                if self.is_black(self.get_dir(sibling, opposite(dir))) {
654                    self._color_black(self.get_dir(sibling, dir));
655                    self._color_red(sibling);
656                    self._rotate_dir(sibling, opposite(dir));
657                    sibling = self.get_dir(parent, opposite(dir));
658                }
659                self._color_node(sibling, self.get_color(parent));
660                self._color_black(parent);
661                self._color_black(self.get_dir(sibling, opposite(dir)));
662                self._rotate_dir(parent, dir);
663                node_index = self.root as u32;
664            }
665            if self.is_root(node_index) || self.is_red(node_index) {
666                break;
667            }
668            parent = self.get_parent(node_index);
669            dir = self._child_dir(parent, node_index);
670        }
671        self._color_black(node_index);
672    }
673
674    #[inline(always)]
675    /// This helper function connects the parent of `target` to `source`.
676    /// It is the start of the process of removing `target` from the tree.
677    fn _transplant(&mut self, target: u32, source: u32) {
678        let parent = self.get_parent(target);
679        if parent == SENTINEL {
680            self.root = source;
681            self.allocator
682                .set_register(source, SENTINEL, Field::Parent as u32);
683            return;
684        }
685        let dir = self._child_dir(parent, target);
686        self._connect(parent, source, dir);
687    }
688
689    pub fn get_addr(&self, key: &K) -> u32 {
690        let mut node_index = self.root;
691        if node_index == SENTINEL {
692            return SENTINEL;
693        }
694        loop {
695            let curr_key = self.get_node(node_index).key;
696            let target = match key.cmp(&curr_key) {
697                Ordering::Less => self.get_left(node_index),
698                Ordering::Greater => self.get_right(node_index),
699                Ordering::Equal => return node_index,
700            };
701            if target == SENTINEL {
702                return SENTINEL;
703            }
704            node_index = target
705        }
706    }
707
708    fn _find_min(&self, index: u32) -> u32 {
709        let mut node = index;
710        while self.get_left(node) != SENTINEL {
711            node = self.get_left(node);
712        }
713        node
714    }
715
716    fn _find_max(&self, index: u32) -> u32 {
717        let mut node = index;
718        while self.get_right(node) != SENTINEL {
719            node = self.get_right(node);
720        }
721        node
722    }
723
724    fn _iter(&self) -> RedBlackTreeIterator<'_, K, V, MAX_SIZE> {
725        RedBlackTreeIterator::<K, V, MAX_SIZE> {
726            tree: self,
727            fwd_stack: vec![],
728            fwd_ptr: self.root,
729            fwd_node: None,
730            rev_stack: vec![],
731            rev_ptr: self.root,
732            rev_node: None,
733            terminated: false,
734        }
735    }
736
737    fn _iter_mut(&mut self) -> RedBlackTreeIteratorMut<'_, K, V, MAX_SIZE> {
738        let node = self.root;
739        RedBlackTreeIteratorMut::<K, V, MAX_SIZE> {
740            tree: self,
741            fwd_stack: vec![],
742            fwd_ptr: node,
743            fwd_node: None,
744            rev_stack: vec![],
745            rev_ptr: node,
746            rev_node: None,
747            terminated: false,
748        }
749    }
750}
751
752impl<
753        'a,
754        K: Debug + PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
755        V: Default + Copy + Clone + Pod + Zeroable,
756        const MAX_SIZE: usize,
757    > IntoIterator for &'a RedBlackTree<K, V, MAX_SIZE>
758{
759    type Item = (&'a K, &'a V);
760    type IntoIter = RedBlackTreeIterator<'a, K, V, MAX_SIZE>;
761    fn into_iter(self) -> Self::IntoIter {
762        self._iter()
763    }
764}
765
766impl<
767        'a,
768        K: Debug + PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
769        V: Default + Copy + Clone + Pod + Zeroable,
770        const MAX_SIZE: usize,
771    > IntoIterator for &'a mut RedBlackTree<K, V, MAX_SIZE>
772{
773    type Item = (&'a K, &'a mut V);
774    type IntoIter = RedBlackTreeIteratorMut<'a, K, V, MAX_SIZE>;
775    fn into_iter(self) -> Self::IntoIter {
776        self._iter_mut()
777    }
778}
779
780pub struct RedBlackTreeIterator<
781    'a,
782    K: Debug + PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
783    V: Default + Copy + Clone + Pod + Zeroable,
784    const MAX_SIZE: usize,
785> {
786    tree: &'a RedBlackTree<K, V, MAX_SIZE>,
787    fwd_stack: Vec<u32>,
788    fwd_ptr: u32,
789    fwd_node: Option<u32>,
790    rev_stack: Vec<u32>,
791    rev_ptr: u32,
792    rev_node: Option<u32>,
793    terminated: bool,
794}
795
796impl<
797        'a,
798        K: Debug + PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
799        V: Default + Copy + Clone + Pod + Zeroable,
800        const MAX_SIZE: usize,
801    > Iterator for RedBlackTreeIterator<'a, K, V, MAX_SIZE>
802{
803    type Item = (&'a K, &'a V);
804
805    fn next(&mut self) -> Option<Self::Item> {
806        while !self.terminated && (!self.fwd_stack.is_empty() || self.fwd_ptr != SENTINEL) {
807            if self.fwd_ptr != SENTINEL {
808                self.fwd_stack.push(self.fwd_ptr);
809                self.fwd_ptr = self.tree.get_left(self.fwd_ptr);
810            } else {
811                let current_node = self.fwd_stack.pop();
812                if current_node == self.rev_node {
813                    self.terminated = true;
814                    return None;
815                }
816                self.fwd_node = current_node;
817                let node = self.tree.get_node(current_node.unwrap());
818                self.fwd_ptr = self.tree.get_right(current_node.unwrap());
819                return Some((&node.key, &node.value));
820            }
821        }
822        None
823    }
824}
825
826impl<
827        'a,
828        K: Debug + PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
829        V: Default + Copy + Clone + Pod + Zeroable,
830        const MAX_SIZE: usize,
831    > DoubleEndedIterator for RedBlackTreeIterator<'a, K, V, MAX_SIZE>
832{
833    fn next_back(&mut self) -> Option<Self::Item> {
834        while !self.terminated && (!self.rev_stack.is_empty() || self.rev_ptr != SENTINEL) {
835            if self.rev_ptr != SENTINEL {
836                self.rev_stack.push(self.rev_ptr);
837                self.rev_ptr = self.tree.get_right(self.rev_ptr);
838            } else {
839                let current_node = self.rev_stack.pop();
840                if current_node == self.fwd_node {
841                    self.terminated = true;
842                    return None;
843                }
844                self.rev_node = current_node;
845                let node = self.tree.get_node(current_node.unwrap());
846                self.rev_ptr = self.tree.get_left(current_node.unwrap());
847                return Some((&node.key, &node.value));
848            }
849        }
850        None
851    }
852}
853
854pub struct RedBlackTreeIteratorMut<
855    'a,
856    K: Debug + PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
857    V: Default + Copy + Clone + Pod + Zeroable,
858    const MAX_SIZE: usize,
859> {
860    tree: &'a mut RedBlackTree<K, V, MAX_SIZE>,
861    fwd_stack: Vec<u32>,
862    fwd_ptr: u32,
863    fwd_node: Option<u32>,
864    rev_stack: Vec<u32>,
865    rev_ptr: u32,
866    rev_node: Option<u32>,
867    terminated: bool,
868}
869
870impl<
871        'a,
872        K: Debug + PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
873        V: Default + Copy + Clone + Pod + Zeroable,
874        const MAX_SIZE: usize,
875    > Iterator for RedBlackTreeIteratorMut<'a, K, V, MAX_SIZE>
876{
877    type Item = (&'a K, &'a mut V);
878
879    fn next(&mut self) -> Option<Self::Item> {
880        while !self.terminated && (!self.fwd_stack.is_empty() || self.fwd_ptr != SENTINEL) {
881            if self.fwd_ptr != SENTINEL {
882                self.fwd_stack.push(self.fwd_ptr);
883                self.fwd_ptr = self.tree.get_left(self.fwd_ptr);
884            } else {
885                let current_node = self.fwd_stack.pop();
886                if current_node == self.rev_node {
887                    self.terminated = true;
888                    return None;
889                }
890                self.fwd_node = current_node;
891                let ptr = self.fwd_node.unwrap();
892                self.fwd_ptr = self.tree.get_right(ptr);
893                // TODO: How does one remove this unsafe?
894                unsafe {
895                    let node = (*self
896                        .tree
897                        .allocator
898                        .nodes
899                        .as_mut_ptr()
900                        .add((ptr - 1) as usize))
901                    .get_value_mut();
902                    return Some((&node.key, &mut node.value));
903                }
904            }
905        }
906        None
907    }
908}
909
910impl<
911        'a,
912        K: Debug + PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
913        V: Default + Copy + Clone + Pod + Zeroable,
914        const MAX_SIZE: usize,
915    > DoubleEndedIterator for RedBlackTreeIteratorMut<'a, K, V, MAX_SIZE>
916{
917    fn next_back(&mut self) -> Option<Self::Item> {
918        while !self.terminated && (!self.rev_stack.is_empty() || self.rev_ptr != SENTINEL) {
919            if self.rev_ptr != SENTINEL {
920                self.rev_stack.push(self.rev_ptr);
921                self.rev_ptr = self.tree.get_right(self.rev_ptr);
922            } else {
923                let current_node = self.rev_stack.pop();
924                if current_node == self.fwd_node {
925                    self.terminated = true;
926                    return None;
927                }
928                self.rev_node = current_node;
929                let ptr = self.rev_node.unwrap();
930                self.rev_ptr = self.tree.get_left(ptr);
931                // TODO: How does one remove this unsafe?
932                unsafe {
933                    let node = (*self
934                        .tree
935                        .allocator
936                        .nodes
937                        .as_mut_ptr()
938                        .add((ptr - 1) as usize))
939                    .get_value_mut();
940                    return Some((&node.key, &mut node.value));
941                }
942            }
943        }
944        None
945    }
946}
947
948impl<
949        K: Debug + PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
950        V: Default + Copy + Clone + Pod + Zeroable,
951        const MAX_SIZE: usize,
952    > Index<&K> for RedBlackTree<K, V, MAX_SIZE>
953{
954    type Output = V;
955
956    fn index(&self, index: &K) -> &Self::Output {
957        self.get(index).unwrap()
958    }
959}
960
961impl<
962        K: Debug + PartialOrd + Ord + Copy + Clone + Default + Pod + Zeroable,
963        V: Default + Copy + Clone + Pod + Zeroable,
964        const MAX_SIZE: usize,
965    > IndexMut<&K> for RedBlackTree<K, V, MAX_SIZE>
966{
967    fn index_mut(&mut self, index: &K) -> &mut Self::Output {
968        self.get_mut(index).unwrap()
969    }
970}
971
972#[test]
973/// This test addresses the case where a node's parent and uncle are both red.
974/// This is resolved by coloring the parent and uncle black and the grandparent red.
975fn test_insert_with_red_parent_and_uncle() {
976    type Rbt = RedBlackTree<u64, u64, 1024>;
977    let mut buf = vec![0u8; std::mem::size_of::<Rbt>()];
978    let tree = Rbt::new_from_slice(buf.as_mut_slice());
979    let addrs = vec![
980        tree.insert(61, 0).unwrap(),
981        tree.insert(52, 0).unwrap(),
982        tree.insert(85, 0).unwrap(),
983        tree.insert(76, 0).unwrap(),
984        tree.insert(93, 0).unwrap(),
985    ];
986
987    let parent = addrs[4];
988    let uncle = addrs[3];
989    let grandparent = addrs[2];
990
991    assert_eq!(tree.get_left(addrs[0]), addrs[1]);
992    assert_eq!(tree.get_right(addrs[0]), grandparent);
993    assert_eq!(tree.get_parent(addrs[1]), addrs[0]);
994    assert_eq!(tree.get_parent(grandparent), addrs[0]);
995
996    assert_eq!(tree.get_left(grandparent), uncle);
997    assert_eq!(tree.get_right(grandparent), parent);
998    assert_eq!(tree.get_parent(uncle), grandparent);
999    assert_eq!(tree.get_parent(parent), grandparent);
1000
1001    assert!(tree.is_black(addrs[0]) && tree.is_black(addrs[1]) && tree.is_black(grandparent));
1002    assert!(tree.is_red(uncle) && tree.is_red(parent));
1003
1004    let leaf = tree.insert(100, 0).unwrap();
1005
1006    assert!(
1007        tree.is_black(addrs[0])
1008            && tree.is_black(addrs[1])
1009            && tree.is_black(uncle)
1010            && tree.is_black(parent)
1011    );
1012    assert!(tree.is_red(grandparent) && tree.is_red(leaf));
1013}
1014
1015#[test]
1016/// This test addresses the case where a node's parent (P) is red and uncle is black.
1017/// The new leaf (L) is the right child of the parent and the parent is the right
1018/// child of the grandparent (G).
1019///
1020/// "P is right child of G and L is right child of P."
1021///
1022/// We resolve this by rotating the grandparent left and then
1023/// fixing the colors.
1024fn test_right_insert_with_red_right_child_parent_and_black_uncle() {
1025    type Rbt = RedBlackTree<u64, u64, 1024>;
1026    let mut buf = vec![0u8; std::mem::size_of::<Rbt>()];
1027    let tree = Rbt::new_from_slice(buf.as_mut_slice());
1028    let addrs = vec![
1029        tree.insert(61, 0).unwrap(),
1030        tree.insert(52, 0).unwrap(),
1031        tree.insert(85, 0).unwrap(),
1032        tree.insert(93, 0).unwrap(),
1033    ];
1034
1035    let parent = addrs[3];
1036    // Uncle is black as it is null
1037    let grandparent = addrs[2];
1038
1039    assert!(tree.is_black(addrs[0]) && tree.is_black(addrs[1]) && tree.is_black(grandparent));
1040    assert!(tree.is_red(parent));
1041
1042    assert_eq!(tree.get_left(addrs[0]), addrs[1]);
1043    assert_eq!(tree.get_right(addrs[0]), grandparent);
1044    assert_eq!(tree.get_parent(addrs[1]), addrs[0]);
1045    assert_eq!(tree.get_parent(grandparent), addrs[0]);
1046
1047    assert_eq!(tree.get_left(grandparent), SENTINEL);
1048    assert_eq!(tree.get_right(grandparent), parent);
1049    assert_eq!(tree.get_parent(parent), grandparent);
1050
1051    let leaf = tree.insert(100, 0).unwrap();
1052
1053    assert!(tree.is_black(addrs[0]) && tree.is_black(addrs[1]) && tree.is_black(parent));
1054    assert!(tree.is_red(grandparent) && tree.is_red(leaf));
1055
1056    assert_eq!(tree.get_left(addrs[0]), addrs[1]);
1057    assert_eq!(tree.get_right(addrs[0]), parent);
1058    assert_eq!(tree.get_parent(addrs[1]), addrs[0]);
1059    assert_eq!(tree.get_parent(parent), addrs[0]);
1060
1061    assert_eq!(tree.get_left(parent), grandparent);
1062    assert_eq!(tree.get_right(parent), leaf);
1063    assert_eq!(tree.get_parent(grandparent), parent);
1064    assert_eq!(tree.get_parent(leaf), parent);
1065    assert!(tree.is_leaf(leaf) && tree.is_leaf(grandparent));
1066}
1067
1068#[test]
1069/// This test addresses the case where a node's parent is red and uncle is black.
1070/// The new leaf is the left child of the parent and the parent is the right
1071/// child of the grandparent.
1072///
1073/// "P is right child of G and L is left child of P."
1074///
1075/// We resolve this by rotating the parent right then applying the same
1076/// algorithm as the previous test.
1077fn test_left_insert_with_red_right_child_parent_and_black_uncle() {
1078    type Rbt = RedBlackTree<u64, u64, 1024>;
1079    let mut buf = vec![0u8; std::mem::size_of::<Rbt>()];
1080    let tree = Rbt::new_from_slice(buf.as_mut_slice());
1081    let addrs = vec![
1082        tree.insert(61, 0).unwrap(),
1083        tree.insert(52, 0).unwrap(),
1084        tree.insert(85, 0).unwrap(),
1085        tree.insert(93, 0).unwrap(),
1086    ];
1087
1088    let parent = addrs[3];
1089    // Uncle is black as it is null
1090    let grandparent = addrs[2];
1091
1092    assert!(tree.is_black(addrs[0]) && tree.is_black(addrs[1]) && tree.is_black(grandparent));
1093    assert!(tree.is_red(parent));
1094
1095    assert_eq!(tree.get_left(addrs[0]), addrs[1]);
1096    assert_eq!(tree.get_right(addrs[0]), grandparent);
1097    assert_eq!(tree.get_parent(addrs[1]), addrs[0]);
1098    assert_eq!(tree.get_parent(grandparent), addrs[0]);
1099
1100    assert_eq!(tree.get_left(grandparent), SENTINEL);
1101    assert_eq!(tree.get_right(grandparent), parent);
1102    assert_eq!(tree.get_parent(parent), grandparent);
1103
1104    let leaf = tree.insert(87, 0).unwrap();
1105
1106    assert!(tree.is_black(addrs[0]) && tree.is_black(addrs[1]) && tree.is_black(leaf));
1107    assert!(tree.is_red(grandparent) && tree.is_red(parent));
1108
1109    assert_eq!(tree.get_left(addrs[0]), addrs[1]);
1110    assert_eq!(tree.get_right(addrs[0]), leaf);
1111    assert_eq!(tree.get_parent(addrs[1]), addrs[0]);
1112    assert_eq!(tree.get_parent(leaf), addrs[0]);
1113
1114    assert_eq!(tree.get_left(leaf), grandparent);
1115    assert_eq!(tree.get_right(leaf), parent);
1116    assert_eq!(tree.get_parent(grandparent), leaf);
1117    assert_eq!(tree.get_parent(parent), leaf);
1118    assert!(tree.is_leaf(parent) && tree.is_leaf(grandparent));
1119}
1120
1121#[test]
1122/// This test addresses the case where a node's parent is red and uncle is black.
1123/// The new leaf is the left child of the parent and the parent is the left
1124/// child of the grandparent.
1125///
1126/// "P is left child of G and L is left child of P."
1127///
1128/// We resolve this by rotating the grandparent right and then
1129/// fixing the colors.
1130fn test_left_insert_with_red_left_child_parent_and_black_uncle() {
1131    type Rbt = RedBlackTree<u64, u64, 1024>;
1132    let mut buf = vec![0u8; std::mem::size_of::<Rbt>()];
1133    let tree = Rbt::new_from_slice(buf.as_mut_slice());
1134    let addrs = vec![
1135        tree.insert(61, 0).unwrap(),
1136        tree.insert(85, 0).unwrap(),
1137        tree.insert(52, 0).unwrap(),
1138        tree.insert(41, 0).unwrap(),
1139    ];
1140
1141    let parent = addrs[3];
1142    // Uncle is black as it is null
1143    let grandparent = addrs[2];
1144
1145    assert!(tree.is_black(addrs[0]) && tree.is_black(addrs[1]) && tree.is_black(grandparent));
1146    assert!(tree.is_red(parent));
1147
1148    assert_eq!(tree.get_right(addrs[0]), addrs[1]);
1149    assert_eq!(tree.get_left(addrs[0]), grandparent);
1150    assert_eq!(tree.get_parent(addrs[1]), addrs[0]);
1151    assert_eq!(tree.get_parent(grandparent), addrs[0]);
1152
1153    assert_eq!(tree.get_right(grandparent), SENTINEL);
1154    assert_eq!(tree.get_left(grandparent), parent);
1155    assert_eq!(tree.get_parent(parent), grandparent);
1156
1157    let leaf = tree.insert(25, 0).unwrap();
1158
1159    assert!(tree.is_black(addrs[0]) && tree.is_black(addrs[1]) && tree.is_black(parent));
1160    assert!(tree.is_red(grandparent) && tree.is_red(leaf));
1161
1162    assert_eq!(tree.get_right(addrs[0]), addrs[1]);
1163    assert_eq!(tree.get_left(addrs[0]), parent);
1164    assert_eq!(tree.get_parent(addrs[1]), addrs[0]);
1165    assert_eq!(tree.get_parent(parent), addrs[0]);
1166
1167    assert_eq!(tree.get_right(parent), grandparent);
1168    assert_eq!(tree.get_left(parent), leaf);
1169    assert_eq!(tree.get_parent(grandparent), parent);
1170    assert_eq!(tree.get_parent(leaf), parent);
1171    assert!(tree.is_leaf(leaf) && tree.is_leaf(grandparent));
1172}
1173
1174#[test]
1175/// This test addresses the case where a node's parent is red and uncle is black.
1176/// The new leaf is the right child of the parent and the parent is the left
1177/// child of the grandparent.
1178///
1179/// "P is left child of G and L is right child of P."
1180///
1181/// We resolve this by rotating the parent left then applying the same
1182/// algorithm as the previous test.
1183fn test_right_insert_with_red_left_child_parent_and_black_uncle() {
1184    type Rbt = RedBlackTree<u64, u64, 1024>;
1185    let mut buf = vec![0u8; std::mem::size_of::<Rbt>()];
1186    let tree = Rbt::new_from_slice(buf.as_mut_slice());
1187    let addrs = vec![
1188        tree.insert(61, 0).unwrap(),
1189        tree.insert(85, 0).unwrap(),
1190        tree.insert(52, 0).unwrap(),
1191        tree.insert(41, 0).unwrap(),
1192    ];
1193
1194    let parent = addrs[3];
1195    // Uncle is black as it is null
1196    let grandparent = addrs[2];
1197
1198    assert!(tree.is_black(addrs[0]) && tree.is_black(addrs[1]) && tree.is_black(grandparent));
1199    assert!(tree.is_red(parent));
1200
1201    assert_eq!(tree.get_right(addrs[0]), addrs[1]);
1202    assert_eq!(tree.get_left(addrs[0]), grandparent);
1203    assert_eq!(tree.get_parent(addrs[1]), addrs[0]);
1204    assert_eq!(tree.get_parent(grandparent), addrs[0]);
1205
1206    assert_eq!(tree.get_right(grandparent), SENTINEL);
1207    assert_eq!(tree.get_left(grandparent), parent);
1208    assert_eq!(tree.get_parent(parent), grandparent);
1209
1210    let leaf = tree.insert(47, 0).unwrap();
1211
1212    assert!(tree.is_black(addrs[0]) && tree.is_black(addrs[1]) && tree.is_black(leaf));
1213    assert!(tree.is_red(grandparent) && tree.is_red(parent));
1214
1215    assert_eq!(tree.get_right(addrs[0]), addrs[1]);
1216    assert_eq!(tree.get_left(addrs[0]), leaf);
1217    assert_eq!(tree.get_parent(addrs[1]), addrs[0]);
1218    assert_eq!(tree.get_parent(leaf), addrs[0]);
1219
1220    assert_eq!(tree.get_right(leaf), grandparent);
1221    assert_eq!(tree.get_left(leaf), parent);
1222    assert_eq!(tree.get_parent(grandparent), leaf);
1223    assert_eq!(tree.get_parent(parent), leaf);
1224    assert!(tree.is_leaf(parent) && tree.is_leaf(grandparent));
1225    tree.pretty_print();
1226}
1227
1228/// Test a power of 2 minus 1
1229#[test]
1230fn test_delete_multiple_random_1023() {
1231    use std::collections::hash_map::DefaultHasher;
1232    use std::hash::{Hash, Hasher};
1233    type Rbt = RedBlackTree<u64, u64, 1023>;
1234    let mut buf = vec![0u8; std::mem::size_of::<Rbt>()];
1235    let tree = Rbt::new_from_slice(buf.as_mut_slice());
1236    let mut keys = vec![];
1237    // Fill up tree
1238    for k in 0..1023 {
1239        let mut hasher = DefaultHasher::new();
1240        (k as u64).hash(&mut hasher);
1241        let key = hasher.finish();
1242        tree.insert(key, 0).unwrap();
1243        keys.push(key);
1244        assert!(tree.is_valid_red_black_tree());
1245    }
1246
1247    for i in keys.iter() {
1248        tree.remove(i).unwrap();
1249        assert!(tree.is_valid_red_black_tree());
1250    }
1251}
1252
1253#[test]
1254fn test_delete_multiple_random_1024() {
1255    use std::collections::hash_map::DefaultHasher;
1256    use std::hash::{Hash, Hasher};
1257    type Rbt = RedBlackTree<u64, u64, 1024>;
1258    let mut buf = vec![0u8; std::mem::size_of::<Rbt>()];
1259    let tree = Rbt::new_from_slice(buf.as_mut_slice());
1260    let mut keys = vec![];
1261    let mut addrs = vec![];
1262    // Fill up tree
1263    for k in 0..1024 {
1264        let mut hasher = DefaultHasher::new();
1265        (k as u64).hash(&mut hasher);
1266        let key = hasher.finish();
1267        addrs.push(tree.insert(key, 0).unwrap());
1268        keys.push(key);
1269        assert!(tree.is_valid_red_black_tree());
1270    }
1271
1272    for (k, a) in keys.iter().zip(addrs) {
1273        assert!(tree.get_addr(k) == a);
1274    }
1275
1276    for i in keys.iter() {
1277        tree.remove(i).unwrap();
1278        assert!(tree.is_valid_red_black_tree());
1279    }
1280}
1281
1282#[test]
1283fn test_delete_multiple_random_2048() {
1284    use std::collections::{hash_map::DefaultHasher, BTreeMap};
1285    use std::hash::{Hash, Hasher};
1286    type Rbt = RedBlackTree<u64, u64, 2048>;
1287    let mut buf = vec![0u8; std::mem::size_of::<Rbt>()];
1288    let tree = Rbt::new_from_slice(buf.as_mut_slice());
1289    let mut keys = vec![];
1290    // Fill up tree
1291    for k in 0..2048 {
1292        let mut hasher = DefaultHasher::new();
1293        (k as u64).hash(&mut hasher);
1294        let key = hasher.finish();
1295        tree.insert(key, 0).unwrap();
1296        keys.push(key);
1297    }
1298
1299    let key_to_index = keys
1300        .iter()
1301        .enumerate()
1302        .map(|(i, k)| (*k, i as u64))
1303        .collect::<BTreeMap<_, _>>();
1304
1305    let mut buf = vec![0u8; std::mem::size_of::<Rbt>()];
1306    let index_tree = Rbt::new_from_slice(buf.as_mut_slice());
1307    let mut index_keys = vec![];
1308
1309    for k in keys.iter() {
1310        let key = key_to_index[k];
1311        index_tree.insert(key, 0).unwrap();
1312        index_keys.push(key);
1313    }
1314
1315    assert!(index_tree.is_valid_red_black_tree());
1316    for i in index_keys.iter() {
1317        index_tree.remove(i).unwrap();
1318        assert!(index_tree.is_valid_red_black_tree());
1319    }
1320}
1321
1322#[test]
1323fn test_delete_multiple_random_512() {
1324    use std::collections::hash_map::DefaultHasher;
1325    use std::hash::{Hash, Hasher};
1326    type Rbt = RedBlackTree<u64, u64, 512>;
1327    let mut buf = vec![0u8; std::mem::size_of::<Rbt>()];
1328    let tree = Rbt::new_from_slice(buf.as_mut_slice());
1329    let mut keys = vec![];
1330    // Fill up tree
1331    for k in 0..512 {
1332        let mut hasher = DefaultHasher::new();
1333        (k as u64).hash(&mut hasher);
1334        let key = hasher.finish();
1335        tree.insert(key, 0).unwrap();
1336        keys.push(key);
1337        assert!(tree.is_valid_red_black_tree());
1338    }
1339    for i in keys.iter() {
1340        tree.remove(i).unwrap();
1341        assert!(tree.is_valid_red_black_tree());
1342    }
1343}
1344
1345#[test]
1346fn test_delete_multiple_random_4098() {
1347    use std::collections::hash_map::DefaultHasher;
1348    use std::hash::{Hash, Hasher};
1349    type Rbt = RedBlackTree<u64, u64, 4098>;
1350    let mut buf = vec![0u8; std::mem::size_of::<Rbt>()];
1351    let tree = Rbt::new_from_slice(buf.as_mut_slice());
1352    let mut keys = vec![];
1353    // Fill up tree
1354    for k in 0..4098 {
1355        let mut hasher = DefaultHasher::new();
1356        (k as u64).hash(&mut hasher);
1357        let key = hasher.finish();
1358        tree.insert(key, 0).unwrap();
1359        keys.push(key);
1360        assert!(tree.is_valid_red_black_tree());
1361    }
1362    for i in keys.iter() {
1363        tree.remove(i).unwrap();
1364        assert!(tree.is_valid_red_black_tree());
1365    }
1366}
1367
1368#[test]
1369fn remove_root() {
1370    type Rbt = RedBlackTree<u64, u64, 4098>;
1371    let mut buf = vec![0u8; std::mem::size_of::<Rbt>()];
1372    let tree = Rbt::new_from_slice(buf.as_mut_slice());
1373
1374    // Returns none when empty
1375    assert!(tree.remove_root().is_none());
1376
1377    tree._insert(1, 5);
1378    tree._insert(2, 0);
1379    tree._insert(0, 4);
1380
1381    // balanced tree should have 1 as root
1382    let root = tree.remove_root().unwrap();
1383    assert_eq!(root.key, 1);
1384    assert_eq!(root.value, 5);
1385}