osiris/types/
rbtree.rs

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    /// Inserts `id` into the tree. If `id` already exists in the tree, it is first removed and then re-inserted. Errors if `id` does not exist in `storage`.
66    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        // Fully detach the removed node so stale links cannot be observed on reinsertion.
234        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            // Is left child node
275            if storage
276                .get(grandparent)
277                .map_or(false, |n| n.links().left == Some(parent))
278            {
279                // Uncle node must be the right child node
280                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                    // Parent and uncle nodes are red
288                    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                    // Uncle node is black
298                    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                // Uncle node must be the left child
329                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                    // Parent and uncle nodes are red
337                    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                    // Uncle node is black
347                    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                    // Color sibling node black and parent node red, rotate
422                    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                // Sibling node is black
433                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                    // Color sibling node red and move up
441                    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                    // Sibling's left node is red
450                    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                    // Sibling's right child node is red
465                    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                // Sibling node is black
512                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                    // Sibling's right node is red
528                    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                    // Sibling's left child node is red
544                    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        // Color the root node black
577        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                // Add left child's right subtree as pivot's left subtree
652                pivot_node.links_mut().left = left_node.links().right;
653
654                // Add pivot's parent as left child's parent
655                left_node.links_mut().parent = pivot_node.links().parent;
656
657                let old_right = left_node.links().right;
658
659                // Set pivot as the right child of left child
660                left_node.links_mut().right = Some(pivot);
661
662                let old_parent = pivot_node.links().parent;
663
664                // Set pivot's parent to left child
665                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                // Add right child's left subtree as pivot's right subtree
712                pivot_node.links_mut().right = right_node.links().left;
713
714                // Add pivot's parent as right child's parent
715                right_node.links_mut().parent = pivot_node.links().parent;
716
717                let old_left = right_node.links().left;
718
719                // Set pivot as the left child of right child
720                right_node.links_mut().left = Some(pivot);
721
722                let old_parent = pivot_node.links().parent;
723
724                // Set pivot's parent to right child
725                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// TESTING ------------------------------------------------------------------------------------------------------------
757
758#[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        // Reinsert existing node id. This should not create duplicate structural links.
991        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        // Remove index 7 (key=1)
1015        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        // Remove index 8 (key=6)
1021        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        // Remove index 3 (key=3)
1027        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        // Remove node at index 4 (key=7)
1048        tree.remove(4, &mut store).unwrap();
1049        sorted_keys.retain(|&x| x != 7);
1050        validate_tree(&tree, &store, &sorted_keys);
1051
1052        // Remove node at index 3 (key=3)
1053        tree.remove(3, &mut store).unwrap();
1054        sorted_keys.retain(|&x| x != 3);
1055        validate_tree(&tree, &store, &sorted_keys);
1056
1057        // Remove node at index 7 (key=1)
1058        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        // Build initial tree with 50 nodes
1119        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        // Alternate: remove oldest, insert new
1128        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// END TESTING