1use core::marker::PhantomData;
2
3use crate::error::Result;
4
5use super::traits::{Get, GetMut};
6
7#[allow(dead_code)]
8pub struct RbTree<Tag, T: Copy> {
9 root: Option<T>,
10 min: Option<T>,
11 _tag: PhantomData<Tag>,
12}
13
14#[allow(dead_code)]
15pub trait Linkable<Tag, T> {
16 fn links(&self) -> &Links<Tag, T>;
17 fn links_mut(&mut self) -> &mut Links<Tag, T>;
18}
19
20pub trait Compare<Tag, T> {
21 fn cmp(&self, other: &Self) -> core::cmp::Ordering;
22}
23
24#[allow(dead_code)]
25#[proc_macros::fmt]
26#[derive(Clone, Copy, PartialEq, Eq)]
27pub struct Links<Tag, T> {
28 parent: Option<T>,
29 left: Option<T>,
30 right: Option<T>,
31 color: Color,
32 _tag: PhantomData<Tag>,
33}
34
35#[allow(dead_code)]
36impl<Tag, T> Links<Tag, T> {
37 pub fn new() -> Self {
38 Self {
39 parent: None,
40 left: None,
41 right: None,
42 color: Color::Red,
43 _tag: PhantomData,
44 }
45 }
46}
47
48#[proc_macros::fmt]
49#[derive(Clone, Copy, PartialEq, Eq)]
50enum Color {
51 Red,
52 Black,
53}
54
55#[allow(dead_code)]
56impl<Tag, T: Copy + PartialEq> RbTree<Tag, T> {
57 pub const fn new() -> Self {
58 Self {
59 root: None,
60 min: None,
61 _tag: PhantomData,
62 }
63 }
64
65 pub fn insert<S: Get<T> + GetMut<T>>(&mut self, id: T, storage: &mut S) -> Result<()>
67 where
68 <S as Get<T>>::Output: Linkable<Tag, T> + Compare<Tag, T>,
69 {
70 let already_linked = {
71 let node = storage.get(id).ok_or(kerr!(NotFound))?;
72 let links = node.links();
73 self.root == Some(id)
74 || links.parent.is_some()
75 || links.left.is_some()
76 || links.right.is_some()
77 };
78
79 if already_linked {
80 self.remove(id, storage)?;
81 }
82
83 let mut last = None;
84
85 {
86 let node = storage.get(id).ok_or(kerr!(NotFound))?;
87 let mut current = self.root;
88
89 while let Some(current_id) = current {
90 last = current;
91 let current_node = storage.get(current_id).unwrap_or_else(|| {
92 bug!("node linked from tree does not exist in storage.");
93 });
94 let go_left = node.cmp(current_node) == core::cmp::Ordering::Less;
95
96 current = if go_left {
97 current_node.links().left
98 } else {
99 current_node.links().right
100 };
101 }
102 }
103
104 {
105 let node = storage.get_mut(id).ok_or(kerr!(NotFound))?.links_mut();
106 node.parent = last;
107 node.left = None;
108 node.right = None;
109 node.color = Color::Red;
110 }
111
112 match last {
113 None => self.root = Some(id),
114 Some(last_id) => {
115 if let (Some(node), Some(last)) = storage.get2_mut(id, last_id) {
116 if node.cmp(last) == core::cmp::Ordering::Less {
117 last.links_mut().left = Some(id);
118 } else {
119 last.links_mut().right = Some(id);
120 }
121 }
122 }
123 }
124
125 if let Some(min_id) = self.min {
126 let node = storage.get(id).ok_or(kerr!(NotFound))?;
127 let min_node = storage.get(min_id).unwrap_or_else(|| {
128 bug!("node linked from tree does not exist in storage.");
129 });
130 if node.cmp(min_node) == core::cmp::Ordering::Less {
131 self.min = Some(id);
132 }
133 } else {
134 self.min = Some(id);
135 }
136
137 self.insert_fixup(id, storage)
138 }
139
140 pub fn remove<S: Get<T> + GetMut<T>>(&mut self, id: T, storage: &mut S) -> Result<()>
141 where
142 <S as Get<T>>::Output: Linkable<Tag, T> + Compare<Tag, T>,
143 {
144 let (node_left, node_right, node_parent, node_is_red, linked) = {
145 let node = storage.get(id).ok_or(kerr!(NotFound))?;
146 let links = node.links();
147 (
148 links.left,
149 links.right,
150 links.parent,
151 matches!(links.color, Color::Red),
152 self.root == Some(id)
153 || links.parent.is_some()
154 || links.left.is_some()
155 || links.right.is_some(),
156 )
157 };
158
159 if !linked {
160 return Err(kerr!(NotFound));
161 }
162
163 let mut succ_was_red = node_is_red;
164 let child: Option<T>;
165 let child_parent: Option<T>;
166
167 if node_left.is_none() {
168 child = node_right;
169 child_parent = node_parent;
170
171 self.transplant(id, node_right, storage)?;
172 } else if node_right.is_none() {
173 child = node_left;
174 child_parent = node_parent;
175
176 self.transplant(id, node_left, storage)?;
177 } else {
178 let right_id = node_right.unwrap_or_else(|| {
179 bug!("node's right child is None, but it is not None according to previous get.");
180 });
181 let succ = self.minimum(right_id, storage)?;
182 let succ_right = storage.get(succ).and_then(|n| n.links().right);
183 let succ_parent = storage.get(succ).and_then(|n| n.links().parent);
184
185 succ_was_red = storage
186 .get(succ)
187 .map_or(false, |n| matches!(n.links().color, Color::Red));
188 child = succ_right;
189
190 if succ_parent == Some(id) {
191 child_parent = Some(succ);
192 } else {
193 self.transplant(succ, succ_right, storage)?;
194
195 if let (Some(succ_node), Some(right_node)) = storage.get2_mut(succ, right_id) {
196 succ_node.links_mut().right = Some(right_id);
197 right_node.links_mut().parent = Some(succ);
198 } else {
199 bug!("node linked from tree does not exist in storage.");
200 }
201
202 child_parent = succ_parent;
203 }
204
205 self.transplant(id, Some(succ), storage)?;
206
207 let left_id = node_left.unwrap_or_else(|| {
208 bug!("node's left child is None, but it is not None according to previous get.");
209 });
210
211 if let (Some(succ_node), Some(left_node)) = storage.get2_mut(succ, left_id) {
212 succ_node.links_mut().left = Some(left_id);
213 left_node.links_mut().parent = Some(succ);
214 } else {
215 bug!("node linked from tree does not exist in storage.");
216 }
217
218 if let Some(succ_node) = storage.get_mut(succ) {
219 succ_node.links_mut().color = if node_is_red {
220 Color::Red
221 } else {
222 Color::Black
223 };
224 } else {
225 bug!("node linked from tree does not exist in storage.");
226 }
227 }
228
229 if !succ_was_red {
230 self.delete_fixup(child, child_parent, storage)?;
231 }
232
233 if let Some(node) = storage.get_mut(id) {
235 let links = node.links_mut();
236 links.parent = None;
237 links.left = None;
238 links.right = None;
239 links.color = Color::Red;
240 } else {
241 bug!("node linked from tree does not exist in storage.");
242 }
243
244 if self.min == Some(id) {
245 self.min = match self.root {
246 Some(root_id) => Some(self.minimum(root_id, storage)?),
247 None => None,
248 };
249 }
250
251 Ok(())
252 }
253
254 pub fn min(&self) -> Option<T> {
255 self.min
256 }
257
258 fn insert_fixup<S: Get<T> + GetMut<T>>(&mut self, mut id: T, storage: &mut S) -> Result<()>
259 where
260 <S as Get<T>>::Output: Linkable<Tag, T> + Compare<Tag, T>,
261 {
262 while let Some(parent) = storage.get(id).and_then(|n| n.links().parent)
263 && storage
264 .get(parent)
265 .map_or(false, |n| matches!(n.links().color, Color::Red))
266 {
267 let grandparent = storage
268 .get(parent)
269 .and_then(|n| n.links().parent)
270 .unwrap_or_else(|| {
271 bug!("node linked from tree does not have a parent.");
272 });
273
274 if storage
276 .get(grandparent)
277 .map_or(false, |n| n.links().left == Some(parent))
278 {
279 let uncle = storage.get(grandparent).and_then(|n| n.links().right);
281
282 if let Some(uncle_id) = uncle
283 && storage
284 .get(uncle_id)
285 .map_or(false, |n| matches!(n.links().color, Color::Red))
286 {
287 if let (Some(parent_node), Some(uncle_node), Some(grandparent_node)) =
289 storage.get3_mut(parent, uncle_id, grandparent)
290 {
291 parent_node.links_mut().color = Color::Black;
292 uncle_node.links_mut().color = Color::Black;
293 grandparent_node.links_mut().color = Color::Red;
294 }
295 id = grandparent;
296 } else {
297 if storage
299 .get(parent)
300 .map_or(false, |n| n.links().right == Some(id))
301 {
302 let old_parent = parent;
303 self.rotate_left(parent, id, storage)?;
304 id = old_parent;
305 }
306
307 let parent = storage
308 .get(id)
309 .and_then(|n| n.links().parent)
310 .ok_or(kerr!(NotFound))?;
311 let grandparent = storage
312 .get(parent)
313 .and_then(|n| n.links().parent)
314 .unwrap_or_else(|| {
315 bug!("node linked from tree does not have a parent.");
316 });
317
318 if let (Some(parent_node), Some(grandparent_node)) =
319 storage.get2_mut(parent, grandparent)
320 {
321 parent_node.links_mut().color = Color::Black;
322 grandparent_node.links_mut().color = Color::Red;
323 }
324 self.rotate_right(grandparent, parent, storage)?;
325 break;
326 }
327 } else {
328 let uncle = storage.get(grandparent).and_then(|n| n.links().left);
330
331 if let Some(uncle_id) = uncle
332 && storage
333 .get(uncle_id)
334 .map_or(false, |n| matches!(n.links().color, Color::Red))
335 {
336 if let (Some(parent_node), Some(uncle_node), Some(grandparent_node)) =
338 storage.get3_mut(parent, uncle_id, grandparent)
339 {
340 parent_node.links_mut().color = Color::Black;
341 uncle_node.links_mut().color = Color::Black;
342 grandparent_node.links_mut().color = Color::Red;
343 }
344 id = grandparent;
345 } else {
346 if storage
348 .get(parent)
349 .map_or(false, |n| n.links().left == Some(id))
350 {
351 let old_parent = parent;
352 self.rotate_right(parent, id, storage)?;
353 id = old_parent;
354 }
355
356 let parent = storage
357 .get(id)
358 .and_then(|n| n.links().parent)
359 .ok_or(kerr!(NotFound))?;
360 let grandparent = storage
361 .get(parent)
362 .and_then(|n| n.links().parent)
363 .unwrap_or_else(|| {
364 bug!("node linked from tree does not have a parent.");
365 });
366
367 if let (Some(parent_node), Some(grandparent_node)) =
368 storage.get2_mut(parent, grandparent)
369 {
370 parent_node.links_mut().color = Color::Black;
371 grandparent_node.links_mut().color = Color::Red;
372 }
373 self.rotate_left(grandparent, parent, storage)?;
374 break;
375 }
376 }
377 }
378
379 if let Some(root_id) = self.root {
380 if let Some(root_node) = storage.get_mut(root_id) {
381 root_node.links_mut().color = Color::Black;
382 }
383 }
384
385 Ok(())
386 }
387
388 fn delete_fixup<S: Get<T> + GetMut<T>>(
389 &mut self,
390 mut id: Option<T>,
391 mut parent: Option<T>,
392 storage: &mut S,
393 ) -> Result<()>
394 where
395 <S as Get<T>>::Output: Linkable<Tag, T> + Compare<Tag, T>,
396 {
397 let is_red = |node_id: Option<T>, storage: &S| -> bool {
398 node_id
399 .and_then(|id| storage.get(id))
400 .map_or(false, |n| matches!(n.links().color, Color::Red))
401 };
402
403 let is_black = |node_id: Option<T>, storage: &S| -> bool { !is_red(node_id, storage) };
404
405 while id != self.root && is_black(id, storage) {
406 let parent_id = parent.unwrap_or_else(|| {
407 bug!("node linked from tree does not have a parent.");
408 });
409
410 let is_left_child = storage
411 .get(parent_id)
412 .map_or(false, |n| n.links().left == id);
413
414 if is_left_child {
415 let mut sibling_opt = storage.get(parent_id).and_then(|n| n.links().right);
416
417 if is_red(sibling_opt, storage) {
418 let sibling_id = sibling_opt.unwrap_or_else(|| {
419 bug!("node linked from tree does not exist in storage.");
420 });
421 if let (Some(sib), Some(par)) = storage.get2_mut(sibling_id, parent_id) {
423 sib.links_mut().color = Color::Black;
424 par.links_mut().color = Color::Red;
425 } else {
426 return Err(kerr!(NotFound));
427 }
428 self.rotate_left(parent_id, sibling_id, storage)?;
429 sibling_opt = storage.get(parent_id).and_then(|n| n.links().right);
430 }
431
432 let sibling_id = sibling_opt.unwrap_or_else(|| {
434 bug!("node linked from tree does not exist in storage.");
435 });
436 let sib_left = storage.get(sibling_id).and_then(|n| n.links().left);
437 let sib_right = storage.get(sibling_id).and_then(|n| n.links().right);
438
439 if is_black(sib_left, storage) && is_black(sib_right, storage) {
440 if let Some(sib) = storage.get_mut(sibling_id) {
442 sib.links_mut().color = Color::Red;
443 } else {
444 bug!("node linked from tree does not exist in storage.");
445 }
446 id = Some(parent_id);
447 parent = storage.get(parent_id).and_then(|n| n.links().parent);
448 } else {
449 if is_black(sib_right, storage) {
451 let sib_left_id = sib_left.unwrap_or_else(|| {
452 bug!("node linked from tree does not exist in storage.");
453 });
454 if let (Some(sib), Some(left)) = storage.get2_mut(sibling_id, sib_left_id) {
455 sib.links_mut().color = Color::Red;
456 left.links_mut().color = Color::Black;
457 } else {
458 bug!("node linked from tree does not exist in storage.");
459 }
460 self.rotate_right(sibling_id, sib_left_id, storage)?;
461 sibling_opt = storage.get(parent_id).and_then(|n| n.links().right);
462 }
463
464 let sibling_id = sibling_opt.unwrap_or_else(|| {
466 bug!("node linked from tree does not exist in storage.");
467 });
468 let parent_is_red = storage
469 .get(parent_id)
470 .map_or(false, |n| matches!(n.links().color, Color::Red));
471
472 if let Some(sib) = storage.get_mut(sibling_id) {
473 sib.links_mut().color = if parent_is_red {
474 Color::Red
475 } else {
476 Color::Black
477 };
478 }
479 if let Some(par) = storage.get_mut(parent_id) {
480 par.links_mut().color = Color::Black;
481 }
482
483 let sib_right = storage.get(sibling_id).and_then(|n| n.links().right);
484 if let Some(sib_right_id) = sib_right {
485 if let Some(right) = storage.get_mut(sib_right_id) {
486 right.links_mut().color = Color::Black;
487 }
488 }
489
490 self.rotate_left(parent_id, sibling_id, storage)?;
491 id = self.root;
492 break;
493 }
494 } else {
495 let mut sibling_opt = storage.get(parent_id).and_then(|n| n.links().left);
496
497 if is_red(sibling_opt, storage) {
498 let sibling_id = sibling_opt.unwrap_or_else(|| {
499 bug!("node linked from tree does not exist in storage.");
500 });
501 if let (Some(sib), Some(par)) = storage.get2_mut(sibling_id, parent_id) {
502 sib.links_mut().color = Color::Black;
503 par.links_mut().color = Color::Red;
504 } else {
505 bug!("node linked from tree does not exist in storage.");
506 }
507 self.rotate_right(parent_id, sibling_id, storage)?;
508 sibling_opt = storage.get(parent_id).and_then(|n| n.links().left);
509 }
510
511 let sibling_id = sibling_opt.unwrap_or_else(|| {
513 bug!("node linked from tree does not exist in storage.");
514 });
515 let sib_left = storage.get(sibling_id).and_then(|n| n.links().left);
516 let sib_right = storage.get(sibling_id).and_then(|n| n.links().right);
517
518 if is_black(sib_left, storage) && is_black(sib_right, storage) {
519 if let Some(sib) = storage.get_mut(sibling_id) {
520 sib.links_mut().color = Color::Red;
521 } else {
522 bug!("node linked from tree does not exist in storage.");
523 }
524 id = Some(parent_id);
525 parent = storage.get(parent_id).and_then(|n| n.links().parent);
526 } else {
527 if is_black(sib_left, storage) {
529 let sib_right_id = sib_right.unwrap_or_else(|| {
530 bug!("node linked from tree does not exist in storage.");
531 });
532 if let (Some(sib), Some(right)) = storage.get2_mut(sibling_id, sib_right_id)
533 {
534 sib.links_mut().color = Color::Red;
535 right.links_mut().color = Color::Black;
536 } else {
537 bug!("node linked from tree does not exist in storage.");
538 }
539 self.rotate_left(sibling_id, sib_right_id, storage)?;
540 sibling_opt = storage.get(parent_id).and_then(|n| n.links().left);
541 }
542
543 let sibling_id = sibling_opt.unwrap_or_else(|| {
545 bug!("node linked from tree does not exist in storage.");
546 });
547 let parent_is_red = storage
548 .get(parent_id)
549 .map_or(false, |n| matches!(n.links().color, Color::Red));
550
551 if let Some(sib) = storage.get_mut(sibling_id) {
552 sib.links_mut().color = if parent_is_red {
553 Color::Red
554 } else {
555 Color::Black
556 };
557 }
558 if let Some(par) = storage.get_mut(parent_id) {
559 par.links_mut().color = Color::Black;
560 }
561
562 let sib_left = storage.get(sibling_id).and_then(|n| n.links().left);
563 if let Some(sib_left_id) = sib_left {
564 if let Some(left) = storage.get_mut(sib_left_id) {
565 left.links_mut().color = Color::Black;
566 }
567 }
568
569 self.rotate_right(parent_id, sibling_id, storage)?;
570 id = self.root;
571 break;
572 }
573 }
574 }
575
576 if let Some(id) = id {
578 if let Some(node) = storage.get_mut(id) {
579 node.links_mut().color = Color::Black;
580 }
581 }
582
583 Ok(())
584 }
585
586 fn minimum<S: Get<T>>(&self, mut id: T, storage: &S) -> Result<T>
587 where
588 <S as Get<T>>::Output: Linkable<Tag, T> + Compare<Tag, T>,
589 {
590 loop {
591 let left = storage.get(id).ok_or(kerr!(NotFound))?.links().left;
592 match left {
593 Some(left_id) => id = left_id,
594 None => return Ok(id),
595 }
596 }
597 }
598
599 fn transplant<S: Get<T> + GetMut<T>>(
600 &mut self,
601 u: T,
602 v: Option<T>,
603 storage: &mut S,
604 ) -> Result<()>
605 where
606 <S as Get<T>>::Output: Linkable<Tag, T> + Compare<Tag, T>,
607 {
608 let u_parent = storage.get(u).and_then(|n| n.links().parent);
609
610 match u_parent {
611 None => self.root = v,
612 Some(parent_id) => {
613 if let Some(parent_node) = storage.get_mut(parent_id) {
614 if parent_node.links().left == Some(u) {
615 parent_node.links_mut().left = v;
616 } else {
617 parent_node.links_mut().right = v;
618 }
619 } else {
620 bug!("node linked from tree does not exist in storage.");
621 }
622 }
623 }
624
625 if let Some(v_id) = v {
626 if let Some(v_node) = storage.get_mut(v_id) {
627 v_node.links_mut().parent = u_parent;
628 } else {
629 bug!("node linked from tree does not exist in storage.");
630 }
631 }
632
633 Ok(())
634 }
635
636 fn rotate_right<S: Get<T> + GetMut<T>>(
637 &mut self,
638 pivot: T,
639 left: T,
640 storage: &mut S,
641 ) -> Result<()>
642 where
643 <S as Get<T>>::Output: Linkable<Tag, T> + Compare<Tag, T>,
644 {
645 if pivot == left {
646 return Err(kerr!(NotFound));
647 }
648
649 let (right, parent) =
650 if let (Some(pivot_node), Some(left_node)) = storage.get2_mut(pivot, left) {
651 pivot_node.links_mut().left = left_node.links().right;
653
654 left_node.links_mut().parent = pivot_node.links().parent;
656
657 let old_right = left_node.links().right;
658
659 left_node.links_mut().right = Some(pivot);
661
662 let old_parent = pivot_node.links().parent;
663
664 pivot_node.links_mut().parent = Some(left);
666
667 (old_right, old_parent)
668 } else {
669 bug!("node linked from tree does not exist in storage.");
670 };
671
672 if let Some(right_id) = right {
673 if let Some(right_node) = storage.get_mut(right_id) {
674 right_node.links_mut().parent = Some(pivot);
675 }
676 }
677
678 match parent {
679 None => self.root = Some(left),
680 Some(parent_id) => {
681 if let Some(parent_node) = storage.get_mut(parent_id) {
682 if parent_node.links().left == Some(pivot) {
683 parent_node.links_mut().left = Some(left);
684 } else {
685 parent_node.links_mut().right = Some(left);
686 }
687 } else {
688 bug!("node linked from tree does not exist in storage.");
689 }
690 }
691 }
692
693 Ok(())
694 }
695
696 fn rotate_left<S: Get<T> + GetMut<T>>(
697 &mut self,
698 pivot: T,
699 right: T,
700 storage: &mut S,
701 ) -> Result<()>
702 where
703 <S as Get<T>>::Output: Linkable<Tag, T> + Compare<Tag, T>,
704 {
705 if pivot == right {
706 return Err(kerr!(NotFound));
707 }
708
709 let (left, parent) =
710 if let (Some(pivot_node), Some(right_node)) = storage.get2_mut(pivot, right) {
711 pivot_node.links_mut().right = right_node.links().left;
713
714 right_node.links_mut().parent = pivot_node.links().parent;
716
717 let old_left = right_node.links().left;
718
719 right_node.links_mut().left = Some(pivot);
721
722 let old_parent = pivot_node.links().parent;
723
724 pivot_node.links_mut().parent = Some(right);
726
727 (old_left, old_parent)
728 } else {
729 bug!("node linked from tree does not exist in storage.");
730 };
731
732 if let Some(left_id) = left {
733 if let Some(left_node) = storage.get_mut(left_id) {
734 left_node.links_mut().parent = Some(pivot);
735 }
736 }
737
738 match parent {
739 None => self.root = Some(right),
740 Some(parent_id) => {
741 if let Some(parent_node) = storage.get_mut(parent_id) {
742 if parent_node.links().left == Some(pivot) {
743 parent_node.links_mut().left = Some(right);
744 } else {
745 parent_node.links_mut().right = Some(right);
746 }
747 } else {
748 bug!("node linked from tree does not exist in storage.");
749 }
750 }
751 }
752 Ok(())
753 }
754}
755
756#[cfg(test)]
759mod tests {
760 use super::*;
761 use super::{Get, GetMut};
762 use std::borrow::Borrow;
763 use std::collections::HashSet;
764
765 struct Tree;
766
767 struct Node {
768 key: i32,
769 links: Links<Tree, usize>,
770 }
771
772 impl Node {
773 fn new(key: i32) -> Self {
774 Self {
775 key,
776 links: Links::new(),
777 }
778 }
779 }
780
781 impl Compare<Tree, usize> for Node {
782 fn cmp(&self, other: &Self) -> core::cmp::Ordering {
783 self.key.cmp(&other.key)
784 }
785 }
786
787 impl Linkable<Tree, usize> for Node {
788 fn links(&self) -> &Links<Tree, usize> {
789 &self.links
790 }
791
792 fn links_mut(&mut self) -> &mut Links<Tree, usize> {
793 &mut self.links
794 }
795 }
796
797 struct NodeStore {
798 nodes: Vec<Node>,
799 }
800
801 impl NodeStore {
802 fn new(keys: &[i32]) -> Self {
803 Self {
804 nodes: keys.iter().copied().map(Node::new).collect(),
805 }
806 }
807 }
808
809 impl Get<usize> for NodeStore {
810 type Output = Node;
811
812 fn get<K: Borrow<usize>>(&self, index: K) -> Option<&Self::Output> {
813 self.nodes.get(*index.borrow())
814 }
815 }
816
817 impl GetMut<usize> for NodeStore {
818 fn get_mut<K: Borrow<usize>>(&mut self, index: K) -> Option<&mut Self::Output> {
819 self.nodes.get_mut(*index.borrow())
820 }
821
822 fn get2_mut<K: Borrow<usize>>(
823 &mut self,
824 index1: K,
825 index2: K,
826 ) -> (Option<&mut Self::Output>, Option<&mut Self::Output>) {
827 if *index1.borrow() == *index2.borrow() {
828 return (None, None);
829 }
830
831 let ptr = self.nodes.as_ptr();
832
833 return unsafe {
834 (
835 Some(&mut *(ptr.add(*index1.borrow()) as *mut Self::Output)),
836 Some(&mut *(ptr.add(*index2.borrow()) as *mut Self::Output)),
837 )
838 };
839 }
840
841 fn get3_mut<K: Borrow<usize>>(
842 &mut self,
843 index1: K,
844 index2: K,
845 index3: K,
846 ) -> (
847 Option<&mut Self::Output>,
848 Option<&mut Self::Output>,
849 Option<&mut Self::Output>,
850 ) {
851 if *index1.borrow() == *index2.borrow()
852 || *index1.borrow() == *index3.borrow()
853 || *index2.borrow() == *index3.borrow()
854 {
855 return (None, None, None);
856 }
857
858 let ptr = self.nodes.as_ptr();
859 return unsafe {
860 (
861 Some(&mut *(ptr.add(*index1.borrow()) as *mut Self::Output)),
862 Some(&mut *(ptr.add(*index2.borrow()) as *mut Self::Output)),
863 Some(&mut *(ptr.add(*index3.borrow()) as *mut Self::Output)),
864 )
865 };
866 }
867 }
868
869 fn validate_tree(tree: &RbTree<Tree, usize>, store: &NodeStore, expected: &[i32]) {
870 let mut visited = HashSet::new();
871
872 if let Some(root_id) = tree.root {
873 let root = store.get(root_id).expect("root missing from store");
874 assert!(matches!(root.links().color, Color::Black));
875 assert_eq!(root.links().parent, None);
876 }
877
878 let (count, _) = validate_node(tree.root, store, &mut visited, expected);
879 assert_eq!(count, expected.len());
880
881 if !expected.is_empty() {
882 let min = tree_min_key(tree, store).expect("non-empty tree must contain a min.");
883 assert_eq!(min, expected[0]);
884 }
885 }
886
887 fn tree_min_key(tree: &RbTree<Tree, usize>, store: &NodeStore) -> Option<i32> {
888 tree.min().map(|id| store.get(id).expect("min missing").key)
889 }
890
891 fn validate_node(
892 id: Option<usize>,
893 store: &NodeStore,
894 visited: &mut HashSet<usize>,
895 expected: &[i32],
896 ) -> (usize, usize) {
897 let Some(id) = id else {
898 return (0, 1);
899 };
900
901 assert!(visited.insert(id));
902
903 let node = store.get(id).expect("node missing from store");
904
905 let left = node.links().left;
906 let right = node.links().right;
907
908 if matches!(node.links().color, Color::Red) {
909 if let Some(left_id) = left {
910 let left_node = store.get(left_id).expect("left missing");
911 assert!(matches!(left_node.links().color, Color::Black));
912 }
913 if let Some(right_id) = right {
914 let right_node = store.get(right_id).expect("right missing");
915 assert!(matches!(right_node.links().color, Color::Black));
916 }
917 }
918
919 if let Some(left_id) = left {
920 let left_node = store.get(left_id).expect("left missing");
921 assert_eq!(left_node.links().parent, Some(id));
922 }
923 if let Some(right_id) = right {
924 let right_node = store.get(right_id).expect("right missing");
925 assert_eq!(right_node.links().parent, Some(id));
926 }
927
928 let (left_count, left_bh) = validate_node(left, store, visited, &expected);
929 assert_eq!(
930 node.key, expected[left_count],
931 "expected key {}, found {}",
932 expected[left_count], node.key
933 );
934 let (right_count, right_bh) =
935 validate_node(right, store, visited, &expected[1 + left_count..]);
936
937 assert_eq!(
938 left_bh, right_bh,
939 "black height mismatch at node with key {}",
940 node.key
941 );
942
943 let self_bh = if matches!(node.links().color, Color::Black) {
944 left_bh + 1
945 } else {
946 left_bh
947 };
948
949 (1 + left_count + right_count, self_bh)
950 }
951
952 fn lcg(seed: &mut u64) -> u64 {
953 *seed = seed.wrapping_mul(6364136223846793005).wrapping_add(1);
954 *seed
955 }
956
957 fn shuffle(ids: &mut [usize]) {
958 let mut seed = 0x6b8b_4567_9a1c_def0u64;
959 for i in (1..ids.len()).rev() {
960 let j = (lcg(&mut seed) % (i as u64 + 1)) as usize;
961 ids.swap(i, j);
962 }
963 }
964
965 #[test]
966 fn insert_validates() {
967 let keys: Vec<i32> = (0..200).collect();
968 let mut store = NodeStore::new(&keys);
969 let mut tree = RbTree::new();
970 let mut order: Vec<usize> = (0..keys.len()).collect();
971
972 shuffle(&mut order);
973 for id in order {
974 tree.insert(id, &mut store).unwrap();
975 }
976
977 validate_tree(&tree, &store, &keys);
978 }
979
980 #[test]
981 fn reinsert_same_id_is_stable() {
982 let keys = vec![10, 5, 15];
983 let mut store = NodeStore::new(&keys);
984 let mut tree = RbTree::new();
985
986 tree.insert(0, &mut store).unwrap();
987 tree.insert(1, &mut store).unwrap();
988 tree.insert(2, &mut store).unwrap();
989
990 tree.insert(1, &mut store).unwrap();
992
993 let mut expected = keys.clone();
994 expected.sort();
995 validate_tree(&tree, &store, &expected);
996 }
997
998 #[test]
999 fn min_updates_on_insert_and_remove() {
1000 let keys = vec![10, 5, 15, 3, 7, 12, 18, 1, 6];
1001 let mut store = NodeStore::new(&keys);
1002 let mut tree = RbTree::new();
1003
1004 for id in 0..keys.len() {
1005 tree.insert(id, &mut store).unwrap();
1006 }
1007
1008 let mut sorted_keys = keys.clone();
1009 sorted_keys.sort();
1010
1011 validate_tree(&tree, &store, &sorted_keys);
1012 assert_eq!(tree_min_key(&tree, &store), Some(1));
1013
1014 tree.remove(7, &mut store).unwrap();
1016 sorted_keys.retain(|&x| x != 1);
1017 validate_tree(&tree, &store, &sorted_keys);
1018 assert_eq!(tree_min_key(&tree, &store), Some(3));
1019
1020 tree.remove(8, &mut store).unwrap();
1022 sorted_keys.retain(|&x| x != 6);
1023 validate_tree(&tree, &store, &sorted_keys);
1024 assert_eq!(tree_min_key(&tree, &store), Some(3));
1025
1026 tree.remove(3, &mut store).unwrap();
1028 sorted_keys.retain(|&x| x != 3);
1029 validate_tree(&tree, &store, &sorted_keys);
1030 assert_eq!(tree_min_key(&tree, &store), Some(5));
1031 }
1032
1033 #[test]
1034 fn remove_leaf_one_child_two_children() {
1035 let keys = vec![10, 5, 15, 3, 7, 12, 18, 1, 6];
1036 let mut store = NodeStore::new(&keys);
1037 let mut tree = RbTree::new();
1038
1039 for id in 0..keys.len() {
1040 tree.insert(id, &mut store).unwrap();
1041 }
1042
1043 let mut sorted_keys = keys.clone();
1044 sorted_keys.sort();
1045 validate_tree(&tree, &store, &sorted_keys);
1046
1047 tree.remove(4, &mut store).unwrap();
1049 sorted_keys.retain(|&x| x != 7);
1050 validate_tree(&tree, &store, &sorted_keys);
1051
1052 tree.remove(3, &mut store).unwrap();
1054 sorted_keys.retain(|&x| x != 3);
1055 validate_tree(&tree, &store, &sorted_keys);
1056
1057 tree.remove(7, &mut store).unwrap();
1059 sorted_keys.retain(|&x| x != 1);
1060 validate_tree(&tree, &store, &sorted_keys);
1061 }
1062
1063 #[test]
1064 fn remove_root_with_two_children() {
1065 let keys = [8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13, 15];
1066 let mut store = NodeStore::new(&keys);
1067 let mut tree = RbTree::new();
1068
1069 for id in 0..keys.len() {
1070 tree.insert(id, &mut store).unwrap();
1071 }
1072
1073 let mut sorted_keys: Vec<i32> = keys.to_vec();
1074 sorted_keys.sort();
1075 validate_tree(&tree, &store, &sorted_keys);
1076
1077 let root_id = tree.root.expect("root missing");
1078 let root_key = store.get(root_id).expect("root missing").key;
1079
1080 tree.remove(root_id, &mut store).unwrap();
1081 sorted_keys.retain(|&x| x != root_key);
1082 validate_tree(&tree, &store, &sorted_keys);
1083 }
1084
1085 #[test]
1086 fn remove_all_nodes() {
1087 let keys: Vec<i32> = (0..128).collect();
1088 let mut store = NodeStore::new(&keys);
1089 let mut tree = RbTree::new();
1090 let mut order: Vec<usize> = (0..keys.len()).collect();
1091 shuffle(&mut order);
1092
1093 for id in &order {
1094 tree.insert(*id, &mut store).unwrap();
1095 }
1096
1097 let mut remaining_keys = keys.clone();
1098 validate_tree(&tree, &store, &remaining_keys);
1099
1100 for id in order {
1101 let removed_key = keys[id];
1102 tree.remove(id, &mut store).unwrap();
1103 remaining_keys.retain(|&k| k != removed_key);
1104 validate_tree(&tree, &store, &remaining_keys);
1105 }
1106
1107 assert_eq!(tree.root, None);
1108 }
1109
1110 #[test]
1111 fn interleaved_operations() {
1112 let keys: Vec<i32> = (0..100).collect();
1113 let mut store = NodeStore::new(&keys);
1114 let mut tree = RbTree::new();
1115 let mut order: Vec<usize> = (0..keys.len()).collect();
1116 shuffle(&mut order);
1117
1118 let mut active_keys: Vec<i32> = Vec::new();
1120 for id in order.iter().take(50) {
1121 tree.insert(*id, &mut store).unwrap();
1122 active_keys.push(keys[*id]);
1123 }
1124 active_keys.sort();
1125 validate_tree(&tree, &store, &active_keys);
1126
1127 for i in 0..50 {
1129 let removed_key = keys[order[i]];
1130 tree.remove(order[i], &mut store).unwrap();
1131 active_keys.retain(|&k| k != removed_key);
1132 validate_tree(&tree, &store, &active_keys);
1133
1134 tree.insert(order[50 + i], &mut store).unwrap();
1135 active_keys.push(keys[order[50 + i]]);
1136 active_keys.sort();
1137 validate_tree(&tree, &store, &active_keys);
1138 }
1139 }
1140
1141 #[test]
1142 fn stress_test() {
1143 let keys: Vec<i32> = (0..500).collect();
1144 let mut store = NodeStore::new(&keys);
1145 let mut tree = RbTree::new();
1146 let mut order: Vec<usize> = (0..keys.len()).collect();
1147 shuffle(&mut order);
1148
1149 let mut seed = 0x6b8b_4567_9a1c_def0u64;
1150 let mut active_nodes = Vec::new();
1151 let mut available_nodes = order.clone();
1152
1153 for _ in 0..10000 {
1154 let do_insert = if active_nodes.is_empty() {
1155 true
1156 } else if available_nodes.is_empty() {
1157 false
1158 } else {
1159 (lcg(&mut seed) % 10) < 7
1160 };
1161
1162 if do_insert {
1163 let idx = (lcg(&mut seed) as usize) % available_nodes.len();
1164 let node_id = available_nodes.swap_remove(idx);
1165 tree.insert(node_id, &mut store).unwrap();
1166 active_nodes.push(node_id);
1167 } else {
1168 let idx = (lcg(&mut seed) as usize) % active_nodes.len();
1169 let node_id = active_nodes.swap_remove(idx);
1170 tree.remove(node_id, &mut store).unwrap();
1171 available_nodes.push(node_id);
1172 }
1173
1174 let mut expected_keys: Vec<i32> = active_nodes.iter().map(|&id| keys[id]).collect();
1175 expected_keys.sort();
1176 validate_tree(&tree, &store, &expected_keys);
1177 }
1178
1179 let mut expected_keys: Vec<i32> = active_nodes.iter().map(|&id| keys[id]).collect();
1180 expected_keys.sort();
1181 validate_tree(&tree, &store, &expected_keys);
1182 }
1183}
1184
1185