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
18pub 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#[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 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 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 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 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 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 None
408 } else {
409 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 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 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 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 self._connect(parent, SENTINEL, dir);
576 (SENTINEL, Some((parent, dir)))
577 } else {
578 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 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 self.get_parent(max_left) != node_index {
600 self._transplant(max_left, max_left_child);
601 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 assert!(self.is_leaf(max_left));
611 parent_and_dir = Some((max_left, Field::Left as u32));
612 }
613
614 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 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 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 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 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]
973fn 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]
1016fn 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 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]
1069fn 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 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]
1122fn 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 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]
1175fn 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 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]
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 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 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 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 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 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 assert!(tree.remove_root().is_none());
1376
1377 tree._insert(1, 5);
1378 tree._insert(2, 0);
1379 tree._insert(0, 4);
1380
1381 let root = tree.remove_root().unwrap();
1383 assert_eq!(root.key, 1);
1384 assert_eq!(root.value, 5);
1385}