intrusive_collections/
rbtree.rs

1// Copyright 2016 Amanieu d'Antras
2// Copyright 2020 Amari Robinson
3//
4// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
5// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
6// http://opensource.org/licenses/MIT>, at your option. This file may not be
7// copied, modified, or distributed except according to those terms.
8
9//! Intrusive red-black tree.
10
11use core::borrow::Borrow;
12use core::cell::Cell;
13use core::cmp::Ordering;
14use core::fmt;
15use core::mem;
16use core::ptr::NonNull;
17use core::sync::atomic::{self, AtomicUsize};
18
19use crate::Bound::{self, Excluded, Included, Unbounded};
20
21use crate::link_ops::{self, DefaultLinkOps};
22use crate::linked_list::LinkedListOps;
23use crate::pointer_ops::PointerOps;
24use crate::singly_linked_list::SinglyLinkedListOps;
25use crate::xor_linked_list::XorLinkedListOps;
26use crate::Adapter;
27use crate::KeyAdapter;
28// Necessary for Rust 1.56 compatability
29#[allow(unused_imports)]
30use crate::unchecked_option::UncheckedOptionExt;
31
32// =============================================================================
33// RBTreeOps
34// =============================================================================
35
36/// The color of a red-black tree node.
37#[derive(Copy, Clone, PartialEq, Eq, Debug)]
38#[allow(missing_docs)]
39pub enum Color {
40    Red,
41    Black,
42}
43
44/// Link operations for `RBTree`.
45pub unsafe trait RBTreeOps: link_ops::LinkOps {
46    /// Returns the left child of `ptr`.
47    ///
48    /// # Safety
49    /// An implementation of `left` must not panic.
50    unsafe fn left(&self, ptr: Self::LinkPtr) -> Option<Self::LinkPtr>;
51
52    /// Returns the right child of `ptr`.
53    ///
54    /// # Safety
55    /// An implementation of `right` must not panic.
56    unsafe fn right(&self, ptr: Self::LinkPtr) -> Option<Self::LinkPtr>;
57
58    /// Returns the parent of `ptr`.
59    ///
60    /// # Safety
61    /// An implementation of `parent` must not panic.
62    unsafe fn parent(&self, ptr: Self::LinkPtr) -> Option<Self::LinkPtr>;
63
64    /// Returns the color of `ptr`.
65    ///
66    /// # Safety
67    /// An implementation of `color` must not panic.
68    unsafe fn color(&self, ptr: Self::LinkPtr) -> Color;
69
70    /// Sets the left child of `ptr`.
71    ///
72    /// # Safety
73    /// An implementation of `set_left` must not panic.
74    unsafe fn set_left(&mut self, ptr: Self::LinkPtr, left: Option<Self::LinkPtr>);
75
76    /// Sets the right child of `ptr`.
77    ///
78    /// # Safety
79    /// An implementation of `set_right` must not panic.
80    unsafe fn set_right(&mut self, ptr: Self::LinkPtr, right: Option<Self::LinkPtr>);
81
82    /// Sets the parent of `ptr`.
83    ///
84    /// # Safety
85    /// An implementation of `set_parent` must not panic.
86    unsafe fn set_parent(&mut self, ptr: Self::LinkPtr, parent: Option<Self::LinkPtr>);
87
88    /// Sets the color of `ptr`.
89    ///
90    /// # Safety
91    /// An implementation of `set_color` must not panic.
92    unsafe fn set_color(&mut self, ptr: Self::LinkPtr, color: Color);
93}
94
95// =============================================================================
96// Link
97// =============================================================================
98
99/// Intrusive link that allows an object to be inserted into a
100/// `RBTree`.
101#[repr(align(2))]
102pub struct Link {
103    left: Cell<Option<NonNull<Link>>>,
104    right: Cell<Option<NonNull<Link>>>,
105    parent_color: Cell<usize>,
106}
107
108// Use a special value to indicate an unlinked node. This value represents a
109// red root node, which is impossible in a valid red-black tree.
110const UNLINKED_MARKER: usize = 0;
111
112impl Link {
113    /// Creates a new `Link`.
114    #[inline]
115    pub const fn new() -> Link {
116        Link {
117            left: Cell::new(None),
118            right: Cell::new(None),
119            parent_color: Cell::new(UNLINKED_MARKER),
120        }
121    }
122
123    /// Checks whether the `Link` is linked into a `RBTree`.
124    #[inline]
125    pub fn is_linked(&self) -> bool {
126        self.parent_color.get() != UNLINKED_MARKER
127    }
128
129    /// Forcibly unlinks an object from a `RBTree`.
130    ///
131    /// # Safety
132    ///
133    /// It is undefined behavior to call this function while still linked into a
134    /// `RBTree`. The only situation where this function is useful is
135    /// after calling `fast_clear` on a `RBTree`, since this clears
136    /// the collection without marking the nodes as unlinked.
137    #[inline]
138    pub unsafe fn force_unlink(&self) {
139        self.parent_color.set(UNLINKED_MARKER);
140    }
141}
142
143impl DefaultLinkOps for Link {
144    type Ops = LinkOps;
145
146    const NEW: Self::Ops = LinkOps;
147}
148
149// An object containing a link can be sent to another thread if it is unlinked.
150unsafe impl Send for Link {}
151
152// Provide an implementation of Clone which simply initializes the new link as
153// unlinked. This allows structs containing a link to derive Clone.
154impl Clone for Link {
155    #[inline]
156    fn clone(&self) -> Link {
157        Link::new()
158    }
159}
160
161// Same as above
162impl Default for Link {
163    #[inline]
164    fn default() -> Link {
165        Link::new()
166    }
167}
168
169// Provide an implementation of Debug so that structs containing a link can
170// still derive Debug.
171impl fmt::Debug for Link {
172    #[inline]
173    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
174        // There isn't anything sensible to print here except whether the link
175        // is currently in a tree.
176        if self.is_linked() {
177            write!(f, "linked")
178        } else {
179            write!(f, "unlinked")
180        }
181    }
182}
183
184// =============================================================================
185// LinkOps
186// =============================================================================
187
188/// Default `LinkOps` implementation for `RBTree`.
189#[derive(Clone, Copy, Default)]
190pub struct LinkOps;
191
192impl LinkOps {
193    #[inline]
194    unsafe fn set_parent_color(
195        self,
196        ptr: <Self as link_ops::LinkOps>::LinkPtr,
197        parent: Option<<Self as link_ops::LinkOps>::LinkPtr>,
198        color: Color,
199    ) {
200        assert!(mem::align_of::<Link>() >= 2);
201        let bit = match color {
202            Color::Red => 0,
203            Color::Black => 1,
204        };
205        let parent_usize = parent.map(|x| x.as_ptr() as usize).unwrap_or(0);
206        ptr.as_ref().parent_color.set((parent_usize & !1) | bit);
207    }
208}
209
210unsafe impl link_ops::LinkOps for LinkOps {
211    type LinkPtr = NonNull<Link>;
212
213    #[inline]
214    unsafe fn acquire_link(&mut self, ptr: Self::LinkPtr) -> bool {
215        if ptr.as_ref().is_linked() {
216            false
217        } else {
218            self.set_parent_color(ptr, None, Color::Black);
219            true
220        }
221    }
222
223    #[inline]
224    unsafe fn release_link(&mut self, ptr: Self::LinkPtr) {
225        ptr.as_ref().parent_color.set(UNLINKED_MARKER);
226    }
227}
228
229unsafe impl RBTreeOps for LinkOps {
230    #[inline]
231    unsafe fn left(&self, ptr: Self::LinkPtr) -> Option<Self::LinkPtr> {
232        ptr.as_ref().left.get()
233    }
234
235    #[inline]
236    unsafe fn right(&self, ptr: Self::LinkPtr) -> Option<Self::LinkPtr> {
237        ptr.as_ref().right.get()
238    }
239
240    #[inline]
241    unsafe fn parent(&self, ptr: Self::LinkPtr) -> Option<Self::LinkPtr> {
242        let parent_usize = ptr.as_ref().parent_color.get() & !1;
243        NonNull::new(parent_usize as *mut Link)
244    }
245
246    #[inline]
247    unsafe fn color(&self, ptr: Self::LinkPtr) -> Color {
248        if ptr.as_ref().parent_color.get() & 1 == 1 {
249            Color::Black
250        } else {
251            Color::Red
252        }
253    }
254
255    #[inline]
256    unsafe fn set_left(&mut self, ptr: Self::LinkPtr, left: Option<Self::LinkPtr>) {
257        ptr.as_ref().left.set(left);
258    }
259
260    #[inline]
261    unsafe fn set_right(&mut self, ptr: Self::LinkPtr, right: Option<Self::LinkPtr>) {
262        ptr.as_ref().right.set(right);
263    }
264
265    #[inline]
266    unsafe fn set_parent(&mut self, ptr: Self::LinkPtr, parent: Option<Self::LinkPtr>) {
267        self.set_parent_color(ptr, parent, self.color(ptr));
268    }
269
270    #[inline]
271    unsafe fn set_color(&mut self, ptr: Self::LinkPtr, color: Color) {
272        self.set_parent_color(ptr, self.parent(ptr), color);
273    }
274}
275
276unsafe impl SinglyLinkedListOps for LinkOps {
277    #[inline]
278    unsafe fn next(&self, ptr: Self::LinkPtr) -> Option<Self::LinkPtr> {
279        self.right(ptr)
280    }
281
282    #[inline]
283    unsafe fn set_next(&mut self, ptr: Self::LinkPtr, next: Option<Self::LinkPtr>) {
284        self.set_right(ptr, next);
285    }
286}
287
288unsafe impl LinkedListOps for LinkOps {
289    #[inline]
290    unsafe fn next(&self, ptr: Self::LinkPtr) -> Option<Self::LinkPtr> {
291        self.right(ptr)
292    }
293
294    #[inline]
295    unsafe fn prev(&self, ptr: Self::LinkPtr) -> Option<Self::LinkPtr> {
296        self.left(ptr)
297    }
298
299    #[inline]
300    unsafe fn set_next(&mut self, ptr: Self::LinkPtr, next: Option<Self::LinkPtr>) {
301        self.set_right(ptr, next);
302    }
303
304    #[inline]
305    unsafe fn set_prev(&mut self, ptr: Self::LinkPtr, prev: Option<Self::LinkPtr>) {
306        self.set_left(ptr, prev);
307    }
308}
309
310unsafe impl XorLinkedListOps for LinkOps {
311    #[inline]
312    unsafe fn next(
313        &self,
314        ptr: Self::LinkPtr,
315        prev: Option<Self::LinkPtr>,
316    ) -> Option<Self::LinkPtr> {
317        let packed = self.right(ptr).map(|x| x.as_ptr() as usize).unwrap_or(0);
318        let raw = packed ^ prev.map(|x| x.as_ptr() as usize).unwrap_or(0);
319        NonNull::new(raw as *mut _)
320    }
321
322    #[inline]
323    unsafe fn prev(
324        &self,
325        ptr: Self::LinkPtr,
326        next: Option<Self::LinkPtr>,
327    ) -> Option<Self::LinkPtr> {
328        let packed = self.right(ptr).map(|x| x.as_ptr() as usize).unwrap_or(0);
329        let raw = packed ^ next.map(|x| x.as_ptr() as usize).unwrap_or(0);
330        NonNull::new(raw as *mut _)
331    }
332
333    #[inline]
334    unsafe fn set(
335        &mut self,
336        ptr: Self::LinkPtr,
337        prev: Option<Self::LinkPtr>,
338        next: Option<Self::LinkPtr>,
339    ) {
340        let new_packed = prev.map(|x| x.as_ptr() as usize).unwrap_or(0)
341            ^ next.map(|x| x.as_ptr() as usize).unwrap_or(0);
342
343        let new_next = NonNull::new(new_packed as *mut _);
344        self.set_right(ptr, new_next);
345    }
346
347    #[inline]
348    unsafe fn replace_next_or_prev(
349        &mut self,
350        ptr: Self::LinkPtr,
351        old: Option<Self::LinkPtr>,
352        new: Option<Self::LinkPtr>,
353    ) {
354        let packed = self.right(ptr).map(|x| x.as_ptr() as usize).unwrap_or(0);
355        let new_packed = packed
356            ^ old.map(|x| x.as_ptr() as usize).unwrap_or(0)
357            ^ new.map(|x| x.as_ptr() as usize).unwrap_or(0);
358
359        let new_next = NonNull::new(new_packed as *mut _);
360        self.set_right(ptr, new_next);
361    }
362}
363
364// =============================================================================
365// AtomicLink
366// =============================================================================
367
368/// Intrusive link that allows an object to be inserted into a
369/// `RBTree`. This link allows the structure to be shared between threads.
370
371#[repr(align(2))]
372pub struct AtomicLink {
373    left: Cell<Option<NonNull<AtomicLink>>>,
374    right: Cell<Option<NonNull<AtomicLink>>>,
375    parent_color: AtomicUsize,
376}
377
378impl AtomicLink {
379    #[inline]
380    /// Creates a new `AtomicLink`.
381    pub const fn new() -> AtomicLink {
382        AtomicLink {
383            left: Cell::new(None),
384            right: Cell::new(None),
385            parent_color: AtomicUsize::new(UNLINKED_MARKER),
386        }
387    }
388
389    /// Checks whether the `AtomicLink` is linked into a `RBTree`.
390    #[inline]
391    pub fn is_linked(&self) -> bool {
392        self.parent_color.load(atomic::Ordering::Relaxed) != UNLINKED_MARKER
393    }
394
395    /// Forcibly unlinks an object from a `RBTree`.
396    ///
397    /// # Safety
398    ///
399    /// It is undefined behavior to call this function while still linked into a
400    /// `RBTree`. The only situation where this function is useful is
401    /// after calling `fast_clear` on a `RBTree`, since this clears
402    /// the collection without marking the nodes as unlinked.
403    #[inline]
404    pub unsafe fn force_unlink(&self) {
405        self.parent_color
406            .store(UNLINKED_MARKER, atomic::Ordering::Release);
407    }
408
409    /// Access `parent_color` in an exclusive context.
410    ///
411    /// # Safety
412    ///
413    /// This can only be called after `acquire_link` has been succesfully called.
414    #[inline]
415    unsafe fn parent_color_exclusive(&self) -> &Cell<usize> {
416        // This is safe because currently AtomicUsize has the same representation Cell<usize>.
417        core::mem::transmute(&self.parent_color)
418    }
419}
420
421impl DefaultLinkOps for AtomicLink {
422    type Ops = AtomicLinkOps;
423
424    const NEW: Self::Ops = AtomicLinkOps;
425}
426
427// An object containing a link can be sent to another thread since `acquire_link` is atomic.
428unsafe impl Send for AtomicLink {}
429
430// An object containing a link can be shared between threads since `acquire_link` is atomic.
431unsafe impl Sync for AtomicLink {}
432
433impl Clone for AtomicLink {
434    #[inline]
435    fn clone(&self) -> AtomicLink {
436        AtomicLink::new()
437    }
438}
439
440impl Default for AtomicLink {
441    #[inline]
442    fn default() -> AtomicLink {
443        AtomicLink::new()
444    }
445}
446
447// Provide an implementation of Debug so that structs containing a link can
448// still derive Debug.
449impl fmt::Debug for AtomicLink {
450    #[inline]
451    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
452        // There isn't anything sensible to print here except whether the link
453        // is currently in a list.
454        if self.is_linked() {
455            write!(f, "linked")
456        } else {
457            write!(f, "unlinked")
458        }
459    }
460}
461
462// =============================================================================
463// AtomicLinkOps
464// =============================================================================
465
466/// Default `LinkOps` implementation for `RBTree`.
467#[derive(Clone, Copy, Default)]
468pub struct AtomicLinkOps;
469
470impl AtomicLinkOps {
471    #[inline]
472    unsafe fn set_parent_color(
473        self,
474        ptr: <Self as link_ops::LinkOps>::LinkPtr,
475        parent: Option<<Self as link_ops::LinkOps>::LinkPtr>,
476        color: Color,
477    ) {
478        assert!(mem::align_of::<Link>() >= 2);
479        let bit = match color {
480            Color::Red => 0,
481            Color::Black => 1,
482        };
483        let parent_usize = parent.map(|x| x.as_ptr() as usize).unwrap_or(0);
484        ptr.as_ref()
485            .parent_color_exclusive()
486            .set((parent_usize & !1) | bit);
487    }
488}
489
490const LINKED_DEFAULT_VALUE: usize = 1;
491
492unsafe impl link_ops::LinkOps for AtomicLinkOps {
493    type LinkPtr = NonNull<AtomicLink>;
494
495    #[inline]
496    unsafe fn acquire_link(&mut self, ptr: Self::LinkPtr) -> bool {
497        ptr.as_ref()
498            .parent_color
499            .compare_exchange(
500                UNLINKED_MARKER,
501                LINKED_DEFAULT_VALUE,
502                atomic::Ordering::Acquire,
503                atomic::Ordering::Relaxed,
504            )
505            .is_ok()
506    }
507
508    #[inline]
509    unsafe fn release_link(&mut self, ptr: Self::LinkPtr) {
510        ptr.as_ref()
511            .parent_color
512            .store(UNLINKED_MARKER, atomic::Ordering::Release)
513    }
514}
515
516unsafe impl RBTreeOps for AtomicLinkOps {
517    #[inline]
518    unsafe fn left(&self, ptr: Self::LinkPtr) -> Option<Self::LinkPtr> {
519        ptr.as_ref().left.get()
520    }
521
522    #[inline]
523    unsafe fn right(&self, ptr: Self::LinkPtr) -> Option<Self::LinkPtr> {
524        ptr.as_ref().right.get()
525    }
526
527    #[inline]
528    unsafe fn parent(&self, ptr: Self::LinkPtr) -> Option<Self::LinkPtr> {
529        let parent_usize = ptr.as_ref().parent_color_exclusive().get() & !1;
530        NonNull::new(parent_usize as *mut AtomicLink)
531    }
532
533    #[inline]
534    unsafe fn color(&self, ptr: Self::LinkPtr) -> Color {
535        if ptr.as_ref().parent_color_exclusive().get() & 1 == 1 {
536            Color::Black
537        } else {
538            Color::Red
539        }
540    }
541
542    #[inline]
543    unsafe fn set_left(&mut self, ptr: Self::LinkPtr, left: Option<Self::LinkPtr>) {
544        ptr.as_ref().left.set(left);
545    }
546
547    #[inline]
548    unsafe fn set_right(&mut self, ptr: Self::LinkPtr, right: Option<Self::LinkPtr>) {
549        ptr.as_ref().right.set(right);
550    }
551
552    #[inline]
553    unsafe fn set_parent(&mut self, ptr: Self::LinkPtr, parent: Option<Self::LinkPtr>) {
554        self.set_parent_color(ptr, parent, self.color(ptr));
555    }
556
557    #[inline]
558    unsafe fn set_color(&mut self, ptr: Self::LinkPtr, color: Color) {
559        self.set_parent_color(ptr, self.parent(ptr), color);
560    }
561}
562
563unsafe impl SinglyLinkedListOps for AtomicLinkOps {
564    #[inline]
565    unsafe fn next(&self, ptr: Self::LinkPtr) -> Option<Self::LinkPtr> {
566        self.right(ptr)
567    }
568
569    #[inline]
570    unsafe fn set_next(&mut self, ptr: Self::LinkPtr, next: Option<Self::LinkPtr>) {
571        self.set_right(ptr, next);
572    }
573}
574
575unsafe impl LinkedListOps for AtomicLinkOps {
576    #[inline]
577    unsafe fn next(&self, ptr: Self::LinkPtr) -> Option<Self::LinkPtr> {
578        self.right(ptr)
579    }
580
581    #[inline]
582    unsafe fn prev(&self, ptr: Self::LinkPtr) -> Option<Self::LinkPtr> {
583        self.left(ptr)
584    }
585
586    #[inline]
587    unsafe fn set_next(&mut self, ptr: Self::LinkPtr, next: Option<Self::LinkPtr>) {
588        self.set_right(ptr, next);
589    }
590
591    #[inline]
592    unsafe fn set_prev(&mut self, ptr: Self::LinkPtr, prev: Option<Self::LinkPtr>) {
593        self.set_left(ptr, prev);
594    }
595}
596
597unsafe impl XorLinkedListOps for AtomicLinkOps {
598    #[inline]
599    unsafe fn next(
600        &self,
601        ptr: Self::LinkPtr,
602        prev: Option<Self::LinkPtr>,
603    ) -> Option<Self::LinkPtr> {
604        let packed = self.right(ptr).map(|x| x.as_ptr() as usize).unwrap_or(0);
605        let raw = packed ^ prev.map(|x| x.as_ptr() as usize).unwrap_or(0);
606        NonNull::new(raw as *mut _)
607    }
608
609    #[inline]
610    unsafe fn prev(
611        &self,
612        ptr: Self::LinkPtr,
613        next: Option<Self::LinkPtr>,
614    ) -> Option<Self::LinkPtr> {
615        let packed = self.right(ptr).map(|x| x.as_ptr() as usize).unwrap_or(0);
616        let raw = packed ^ next.map(|x| x.as_ptr() as usize).unwrap_or(0);
617        NonNull::new(raw as *mut _)
618    }
619
620    #[inline]
621    unsafe fn set(
622        &mut self,
623        ptr: Self::LinkPtr,
624        prev: Option<Self::LinkPtr>,
625        next: Option<Self::LinkPtr>,
626    ) {
627        let new_packed = prev.map(|x| x.as_ptr() as usize).unwrap_or(0)
628            ^ next.map(|x| x.as_ptr() as usize).unwrap_or(0);
629
630        let new_next = NonNull::new(new_packed as *mut _);
631        self.set_right(ptr, new_next);
632    }
633
634    #[inline]
635    unsafe fn replace_next_or_prev(
636        &mut self,
637        ptr: Self::LinkPtr,
638        old: Option<Self::LinkPtr>,
639        new: Option<Self::LinkPtr>,
640    ) {
641        let packed = self.right(ptr).map(|x| x.as_ptr() as usize).unwrap_or(0);
642        let new_packed = packed
643            ^ old.map(|x| x.as_ptr() as usize).unwrap_or(0)
644            ^ new.map(|x| x.as_ptr() as usize).unwrap_or(0);
645
646        let new_next = NonNull::new(new_packed as *mut _);
647        self.set_right(ptr, new_next);
648    }
649}
650
651#[inline]
652unsafe fn is_left_child<T: RBTreeOps>(link_ops: &T, ptr: T::LinkPtr, parent: T::LinkPtr) -> bool {
653    link_ops.left(parent) == Some(ptr)
654}
655
656#[inline]
657unsafe fn first_child<T: RBTreeOps>(link_ops: &T, ptr: T::LinkPtr) -> T::LinkPtr {
658    let mut x = ptr;
659    while let Some(y) = link_ops.left(x) {
660        x = y;
661    }
662    x
663}
664
665#[inline]
666unsafe fn last_child<T: RBTreeOps>(link_ops: &T, ptr: T::LinkPtr) -> T::LinkPtr {
667    let mut x = ptr;
668    while let Some(y) = link_ops.right(x) {
669        x = y;
670    }
671    x
672}
673
674#[inline]
675unsafe fn next<T: RBTreeOps>(link_ops: &T, ptr: T::LinkPtr) -> Option<T::LinkPtr> {
676    if let Some(right) = link_ops.right(ptr) {
677        Some(first_child(link_ops, right))
678    } else {
679        let mut x = ptr;
680        loop {
681            if let Some(parent) = link_ops.parent(x) {
682                if is_left_child(link_ops, x, parent) {
683                    return Some(parent);
684                }
685
686                x = parent;
687            } else {
688                return None;
689            }
690        }
691    }
692}
693
694#[inline]
695unsafe fn prev<T: RBTreeOps>(link_ops: &T, ptr: T::LinkPtr) -> Option<T::LinkPtr> {
696    if let Some(left) = link_ops.left(ptr) {
697        Some(last_child(link_ops, left))
698    } else {
699        let mut x = ptr;
700        loop {
701            if let Some(parent) = link_ops.parent(x) {
702                if !is_left_child(link_ops, x, parent) {
703                    return Some(parent);
704                }
705
706                x = parent;
707            } else {
708                return None;
709            }
710        }
711    }
712}
713
714#[inline]
715unsafe fn replace_with<T: RBTreeOps>(
716    link_ops: &mut T,
717    ptr: T::LinkPtr,
718    new: T::LinkPtr,
719    root: &mut Option<T::LinkPtr>,
720) {
721    if let Some(parent) = link_ops.parent(ptr) {
722        if is_left_child(link_ops, ptr, parent) {
723            link_ops.set_left(parent, Some(new));
724        } else {
725            link_ops.set_right(parent, Some(new));
726        }
727    } else {
728        *root = Some(new);
729    }
730    if let Some(left) = link_ops.left(ptr) {
731        link_ops.set_parent(left, Some(new));
732    }
733    if let Some(right) = link_ops.right(ptr) {
734        link_ops.set_parent(right, Some(new));
735    }
736    link_ops.set_left(new, link_ops.left(ptr));
737    link_ops.set_right(new, link_ops.right(ptr));
738    link_ops.set_parent(new, link_ops.parent(ptr));
739    link_ops.set_color(new, link_ops.color(ptr));
740    link_ops.release_link(ptr);
741}
742
743#[inline]
744unsafe fn insert_left<T: RBTreeOps>(
745    link_ops: &mut T,
746    ptr: T::LinkPtr,
747    new: T::LinkPtr,
748    root: &mut Option<T::LinkPtr>,
749) {
750    link_ops.set_parent(new, Some(ptr));
751    link_ops.set_color(new, Color::Red);
752    link_ops.set_left(new, None);
753    link_ops.set_right(new, None);
754    link_ops.set_left(ptr, Some(new));
755    post_insert(link_ops, new, root);
756}
757
758#[inline]
759unsafe fn insert_right<T: RBTreeOps>(
760    link_ops: &mut T,
761    ptr: T::LinkPtr,
762    new: T::LinkPtr,
763    root: &mut Option<T::LinkPtr>,
764) {
765    link_ops.set_parent(new, Some(ptr));
766    link_ops.set_color(new, Color::Red);
767    link_ops.set_left(new, None);
768    link_ops.set_right(new, None);
769    link_ops.set_right(ptr, Some(new));
770    post_insert(link_ops, new, root);
771}
772
773unsafe fn rotate_left<T: RBTreeOps>(
774    link_ops: &mut T,
775    ptr: T::LinkPtr,
776    root: &mut Option<T::LinkPtr>,
777) {
778    let y = link_ops.right(ptr).unwrap_unchecked();
779    link_ops.set_right(ptr, link_ops.left(y));
780    if let Some(right) = link_ops.right(ptr) {
781        link_ops.set_parent(right, Some(ptr));
782    }
783    link_ops.set_parent(y, link_ops.parent(ptr));
784    if let Some(parent) = link_ops.parent(ptr) {
785        if is_left_child(link_ops, ptr, parent) {
786            link_ops.set_left(parent, Some(y));
787        } else {
788            link_ops.set_right(parent, Some(y));
789        }
790    } else {
791        *root = Some(y);
792    }
793    link_ops.set_left(y, Some(ptr));
794    link_ops.set_parent(ptr, Some(y));
795}
796
797unsafe fn rotate_right<T: RBTreeOps>(
798    link_ops: &mut T,
799    ptr: T::LinkPtr,
800    root: &mut Option<T::LinkPtr>,
801) {
802    let y = link_ops.left(ptr).unwrap_unchecked();
803    link_ops.set_left(ptr, link_ops.right(y));
804    if let Some(left) = link_ops.left(ptr) {
805        link_ops.set_parent(left, Some(ptr));
806    }
807    link_ops.set_parent(y, link_ops.parent(ptr));
808    if let Some(parent) = link_ops.parent(ptr) {
809        if is_left_child(link_ops, ptr, parent) {
810            link_ops.set_left(parent, Some(y));
811        } else {
812            link_ops.set_right(parent, Some(y));
813        }
814    } else {
815        *root = Some(y);
816    }
817    link_ops.set_right(y, Some(ptr));
818    link_ops.set_parent(ptr, Some(y));
819}
820
821// This code is based on the red-black tree implementation in libc++
822unsafe fn post_insert<T: RBTreeOps>(
823    link_ops: &mut T,
824    ptr: T::LinkPtr,
825    root: &mut Option<T::LinkPtr>,
826) {
827    let mut x = ptr;
828    while let Some(parent) = link_ops.parent(x) {
829        if link_ops.color(parent) != Color::Red {
830            break;
831        }
832        // SAFETY: The root of the tree must be black, and `parent` cannot be the root if it is red.
833        let grandparent = link_ops.parent(parent).unwrap_unchecked();
834
835        if is_left_child(link_ops, parent, grandparent) {
836            let y = link_ops.right(grandparent);
837            if let Some(y) = y {
838                if link_ops.color(y) == Color::Red {
839                    x = parent;
840                    link_ops.set_color(x, Color::Black);
841                    x = grandparent;
842
843                    if link_ops.parent(x).is_none() {
844                        link_ops.set_color(x, Color::Black);
845                    } else {
846                        link_ops.set_color(x, Color::Red);
847                    }
848                    link_ops.set_color(y, Color::Black);
849                    continue;
850                }
851            }
852            if !is_left_child(link_ops, x, parent) {
853                x = parent;
854                rotate_left(link_ops, x, root);
855            }
856            x = link_ops.parent(x).unwrap_unchecked();
857            link_ops.set_color(x, Color::Black);
858            x = link_ops.parent(x).unwrap_unchecked();
859            link_ops.set_color(x, Color::Red);
860            rotate_right(link_ops, x, root);
861        } else {
862            let y = link_ops.left(grandparent);
863            if let Some(y) = y {
864                if link_ops.color(y) == Color::Red {
865                    x = parent;
866                    link_ops.set_color(x, Color::Black);
867                    x = grandparent;
868                    if link_ops.parent(x).is_none() {
869                        link_ops.set_color(x, Color::Black);
870                    } else {
871                        link_ops.set_color(x, Color::Red);
872                    }
873                    link_ops.set_color(y, Color::Black);
874                    continue;
875                }
876            }
877            if is_left_child(link_ops, x, parent) {
878                x = parent;
879                rotate_right(link_ops, x, root);
880            }
881            x = link_ops.parent(x).unwrap_unchecked();
882            link_ops.set_color(x, Color::Black);
883            x = link_ops.parent(x).unwrap_unchecked();
884            link_ops.set_color(x, Color::Red);
885            rotate_left(link_ops, x, root);
886        }
887        break;
888    }
889}
890
891// This code is based on the red-black tree implementation in libc++
892unsafe fn remove<T: RBTreeOps>(link_ops: &mut T, ptr: T::LinkPtr, root: &mut Option<T::LinkPtr>) {
893    let y = if link_ops.left(ptr).is_none() || link_ops.right(ptr).is_none() {
894        ptr
895    } else {
896        next(link_ops, ptr).unwrap_unchecked()
897    };
898    let x = if link_ops.left(y).is_some() {
899        link_ops.left(y)
900    } else {
901        link_ops.right(y)
902    };
903    let mut w = None;
904    if let Some(x) = x {
905        link_ops.set_parent(x, link_ops.parent(y));
906    }
907    if let Some(y_parent) = link_ops.parent(y) {
908        if is_left_child(link_ops, y, y_parent) {
909            link_ops.set_left(y_parent, x);
910            w = link_ops.right(y_parent);
911        } else {
912            link_ops.set_right(y_parent, x);
913            w = link_ops.left(y_parent);
914        }
915    } else {
916        *root = x;
917    }
918    let removed_black = link_ops.color(y) == Color::Black;
919    if y != ptr {
920        if let Some(parent) = link_ops.parent(ptr) {
921            link_ops.set_parent(y, Some(parent));
922            if is_left_child(link_ops, ptr, parent) {
923                link_ops.set_left(parent, Some(y));
924            } else {
925                link_ops.set_right(parent, Some(y));
926            }
927        } else {
928            link_ops.set_parent(y, None);
929            *root = Some(y);
930        }
931        link_ops.set_left(y, link_ops.left(ptr));
932        link_ops.set_parent(link_ops.left(y).unwrap_unchecked(), Some(y));
933        link_ops.set_right(y, link_ops.right(ptr));
934        if let Some(y_right) = link_ops.right(y) {
935            link_ops.set_parent(y_right, Some(y));
936        }
937        link_ops.set_color(y, link_ops.color(ptr));
938    }
939    if removed_black && !root.is_none() {
940        if let Some(x) = x {
941            link_ops.set_color(x, Color::Black);
942        } else {
943            let mut w = w.unwrap_unchecked();
944            loop {
945                let mut w_parent = link_ops.parent(w).unwrap_unchecked();
946                if !is_left_child(link_ops, w, w_parent) {
947                    if link_ops.color(w) == Color::Red {
948                        link_ops.set_color(w, Color::Black);
949                        link_ops.set_color(w_parent, Color::Red);
950                        rotate_left(link_ops, w_parent, root);
951                        w = link_ops
952                            .right(link_ops.left(w).unwrap_unchecked())
953                            .unwrap_unchecked();
954                        w_parent = link_ops.parent(w).unwrap_unchecked();
955                    }
956
957                    let left_color = link_ops.left(w).map(|x| link_ops.color(x));
958                    let right_color = link_ops.right(w).map(|x| link_ops.color(x));
959                    if (left_color != Some(Color::Red)) && (right_color != Some(Color::Red)) {
960                        link_ops.set_color(w, Color::Red);
961                        if link_ops.parent(w_parent).is_none()
962                            || link_ops.color(w_parent) == Color::Red
963                        {
964                            link_ops.set_color(w_parent, Color::Black);
965                            break;
966                        }
967                        let w_grandparent = link_ops.parent(w_parent).unwrap_unchecked();
968                        w = if is_left_child(link_ops, w_parent, w_grandparent) {
969                            link_ops.right(w_grandparent).unwrap_unchecked()
970                        } else {
971                            link_ops.left(w_grandparent).unwrap_unchecked()
972                        };
973                    } else {
974                        if link_ops.right(w).map(|x| link_ops.color(x)) != Some(Color::Red) {
975                            link_ops.set_color(link_ops.left(w).unwrap_unchecked(), Color::Black);
976                            link_ops.set_color(w, Color::Red);
977                            rotate_right(link_ops, w, root);
978                            w = link_ops.parent(w).unwrap_unchecked();
979                            w_parent = link_ops.parent(w).unwrap_unchecked();
980                        }
981                        link_ops.set_color(w, link_ops.color(w_parent));
982                        link_ops.set_color(w_parent, Color::Black);
983                        link_ops.set_color(link_ops.right(w).unwrap_unchecked(), Color::Black);
984                        rotate_left(link_ops, w_parent, root);
985                        break;
986                    }
987                } else {
988                    if link_ops.color(w) == Color::Red {
989                        link_ops.set_color(w, Color::Black);
990                        link_ops.set_color(w_parent, Color::Red);
991                        rotate_right(link_ops, w_parent, root);
992                        w = link_ops
993                            .left(link_ops.right(w).unwrap_unchecked())
994                            .unwrap_unchecked();
995                        w_parent = link_ops.parent(w).unwrap_unchecked();
996                    }
997                    let left_color = link_ops.left(w).map(|x| link_ops.color(x));
998                    let right_color = link_ops.right(w).map(|x| link_ops.color(x));
999                    if (left_color != Some(Color::Red)) && (right_color != Some(Color::Red)) {
1000                        link_ops.set_color(w, Color::Red);
1001                        if link_ops.parent(w_parent).is_none()
1002                            || link_ops.color(w_parent) == Color::Red
1003                        {
1004                            link_ops.set_color(w_parent, Color::Black);
1005                            break;
1006                        }
1007                        w = if is_left_child(
1008                            link_ops,
1009                            w_parent,
1010                            link_ops.parent(w_parent).unwrap_unchecked(),
1011                        ) {
1012                            link_ops
1013                                .right(link_ops.parent(w_parent).unwrap_unchecked())
1014                                .unwrap_unchecked()
1015                        } else {
1016                            link_ops
1017                                .left(link_ops.parent(w_parent).unwrap_unchecked())
1018                                .unwrap_unchecked()
1019                        };
1020                    } else {
1021                        if link_ops.left(w).map(|x| link_ops.color(x)) != Some(Color::Red) {
1022                            link_ops.set_color(link_ops.right(w).unwrap_unchecked(), Color::Black);
1023                            link_ops.set_color(w, Color::Red);
1024                            rotate_left(link_ops, w, root);
1025                            w = link_ops.parent(w).unwrap_unchecked();
1026                            w_parent = link_ops.parent(w).unwrap_unchecked();
1027                        }
1028                        link_ops.set_color(w, link_ops.color(w_parent));
1029                        link_ops.set_color(w_parent, Color::Black);
1030                        link_ops.set_color(link_ops.left(w).unwrap_unchecked(), Color::Black);
1031                        rotate_right(link_ops, w_parent, root);
1032                        break;
1033                    }
1034                }
1035            }
1036        }
1037    }
1038    link_ops.release_link(ptr);
1039}
1040
1041// =============================================================================
1042// Cursor, CursorMut, CursorOwning
1043// =============================================================================
1044
1045/// A cursor which provides read-only access to a `RBTree`.
1046pub struct Cursor<'a, A: Adapter>
1047where
1048    A::LinkOps: RBTreeOps,
1049{
1050    current: Option<<A::LinkOps as link_ops::LinkOps>::LinkPtr>,
1051    tree: &'a RBTree<A>,
1052}
1053
1054impl<'a, A: Adapter> Clone for Cursor<'a, A>
1055where
1056    A::LinkOps: RBTreeOps,
1057{
1058    #[inline]
1059    fn clone(&self) -> Cursor<'a, A> {
1060        Cursor {
1061            current: self.current,
1062            tree: self.tree,
1063        }
1064    }
1065}
1066
1067impl<'a, A: Adapter> Cursor<'a, A>
1068where
1069    A::LinkOps: RBTreeOps,
1070{
1071    /// Checks if the cursor is currently pointing to the null object.
1072    #[inline]
1073    pub fn is_null(&self) -> bool {
1074        self.current.is_none()
1075    }
1076
1077    /// Returns a reference to the object that the cursor is currently
1078    /// pointing to.
1079    ///
1080    /// This returns `None` if the cursor is currently pointing to the null
1081    /// object.
1082    #[inline]
1083    pub fn get(&self) -> Option<&'a <A::PointerOps as PointerOps>::Value> {
1084        Some(unsafe { &*self.tree.adapter.get_value(self.current?) })
1085    }
1086
1087    /// Clones and returns the pointer that points to the element that the
1088    /// cursor is referencing.
1089    ///
1090    /// This returns `None` if the cursor is currently pointing to the null
1091    /// object.
1092    #[inline]
1093    pub fn clone_pointer(&self) -> Option<<A::PointerOps as PointerOps>::Pointer>
1094    where
1095        <A::PointerOps as PointerOps>::Pointer: Clone,
1096    {
1097        let raw_pointer = unsafe { self.tree.adapter.get_value(self.current?) };
1098        Some(unsafe {
1099            crate::pointer_ops::clone_pointer_from_raw(self.tree.adapter.pointer_ops(), raw_pointer)
1100        })
1101    }
1102
1103    /// Moves the cursor to the next element of the `RBTree`.
1104    ///
1105    /// If the cursor is pointer to the null object then this will move it to
1106    /// the first element of the `RBTree`. If it is pointing to the last
1107    /// element of the `RBTree` then this will move it to the null object.
1108    #[inline]
1109    pub fn move_next(&mut self) {
1110        if let Some(current) = self.current {
1111            self.current = unsafe { next(self.tree.adapter.link_ops(), current) };
1112        } else if let Some(root) = self.tree.root {
1113            self.current = Some(unsafe { first_child(self.tree.adapter.link_ops(), root) });
1114        } else {
1115            self.current = None;
1116        }
1117    }
1118
1119    /// Moves the cursor to the previous element of the `RBTree`.
1120    ///
1121    /// If the cursor is pointer to the null object then this will move it to
1122    /// the last element of the `RBTree`. If it is pointing to the first
1123    /// element of the `RBTree` then this will move it to the null object.
1124    #[inline]
1125    pub fn move_prev(&mut self) {
1126        if let Some(current) = self.current {
1127            self.current = unsafe { prev(self.tree.adapter.link_ops(), current) };
1128        } else if let Some(root) = self.tree.root {
1129            self.current = Some(unsafe { last_child(self.tree.adapter.link_ops(), root) });
1130        } else {
1131            self.current = None;
1132        }
1133    }
1134
1135    /// Returns a cursor pointing to the next element of the `RBTree`.
1136    ///
1137    /// If the cursor is pointer to the null object then this will return the
1138    /// first element of the `RBTree`. If it is pointing to the last
1139    /// element of the `RBTree` then this will return a null cursor.
1140    #[inline]
1141    pub fn peek_next(&self) -> Cursor<'_, A> {
1142        let mut next = self.clone();
1143        next.move_next();
1144        next
1145    }
1146
1147    /// Returns a cursor pointing to the previous element of the `RBTree`.
1148    ///
1149    /// If the cursor is pointer to the null object then this will return the
1150    /// last element of the `RBTree`. If it is pointing to the first
1151    /// element of the `RBTree` then this will return a null cursor.
1152    #[inline]
1153    pub fn peek_prev(&self) -> Cursor<'_, A> {
1154        let mut prev = self.clone();
1155        prev.move_prev();
1156        prev
1157    }
1158}
1159
1160/// A cursor which provides mutable access to a `RBTree`.
1161pub struct CursorMut<'a, A: Adapter>
1162where
1163    A::LinkOps: RBTreeOps,
1164{
1165    current: Option<<A::LinkOps as link_ops::LinkOps>::LinkPtr>,
1166    tree: &'a mut RBTree<A>,
1167}
1168
1169impl<'a, A: Adapter> CursorMut<'a, A>
1170where
1171    A::LinkOps: RBTreeOps,
1172{
1173    /// Checks if the cursor is currently pointing to the null object.
1174    #[inline]
1175    pub fn is_null(&self) -> bool {
1176        self.current.is_none()
1177    }
1178
1179    /// Returns a reference to the object that the cursor is currently
1180    /// pointing to.
1181    ///
1182    /// This returns None if the cursor is currently pointing to the null
1183    /// object.
1184    #[inline]
1185    pub fn get(&self) -> Option<&<A::PointerOps as PointerOps>::Value> {
1186        Some(unsafe { &*self.tree.adapter.get_value(self.current?) })
1187    }
1188
1189    /// Returns a read-only cursor pointing to the current element.
1190    ///
1191    /// The lifetime of the returned `Cursor` is bound to that of the
1192    /// `CursorMut`, which means it cannot outlive the `CursorMut` and that the
1193    /// `CursorMut` is frozen for the lifetime of the `Cursor`.
1194    #[inline]
1195    pub fn as_cursor(&self) -> Cursor<'_, A> {
1196        Cursor {
1197            current: self.current,
1198            tree: self.tree,
1199        }
1200    }
1201
1202    /// Moves the cursor to the next element of the `RBTree`.
1203    ///
1204    /// If the cursor is pointer to the null object then this will move it to
1205    /// the first element of the `RBTree`. If it is pointing to the last
1206    /// element of the `RBTree` then this will move it to the null object.
1207    #[inline]
1208    pub fn move_next(&mut self) {
1209        if let Some(current) = self.current {
1210            self.current = unsafe { next(self.tree.adapter.link_ops(), current) };
1211        } else if let Some(root) = self.tree.root {
1212            self.current = Some(unsafe { first_child(self.tree.adapter.link_ops(), root) });
1213        } else {
1214            self.current = None;
1215        }
1216    }
1217
1218    /// Moves the cursor to the previous element of the `RBTree`.
1219    ///
1220    /// If the cursor is pointer to the null object then this will move it to
1221    /// the last element of the `RBTree`. If it is pointing to the first
1222    /// element of the `RBTree` then this will move it to the null object.
1223    #[inline]
1224    pub fn move_prev(&mut self) {
1225        if let Some(current) = self.current {
1226            self.current = unsafe { prev(self.tree.adapter.link_ops(), current) };
1227        } else if let Some(root) = self.tree.root {
1228            self.current = Some(unsafe { last_child(self.tree.adapter.link_ops(), root) });
1229        } else {
1230            self.current = None;
1231        }
1232    }
1233
1234    /// Returns a cursor pointing to the next element of the `RBTree`.
1235    ///
1236    /// If the cursor is pointer to the null object then this will return the
1237    /// first element of the `RBTree`. If it is pointing to the last
1238    /// element of the `RBTree` then this will return a null cursor.
1239    #[inline]
1240    pub fn peek_next(&self) -> Cursor<'_, A> {
1241        let mut next = self.as_cursor();
1242        next.move_next();
1243        next
1244    }
1245
1246    /// Returns a cursor pointing to the previous element of the `RBTree`.
1247    ///
1248    /// If the cursor is pointer to the null object then this will return the
1249    /// last element of the `RBTree`. If it is pointing to the first
1250    /// element of the `RBTree` then this will return a null cursor.
1251    #[inline]
1252    pub fn peek_prev(&self) -> Cursor<'_, A> {
1253        let mut prev = self.as_cursor();
1254        prev.move_prev();
1255        prev
1256    }
1257
1258    /// Removes the current element from the `RBTree`.
1259    ///
1260    /// A pointer to the element that was removed is returned, and the cursor is
1261    /// moved to point to the next element in the `RBTree`.
1262    ///
1263    /// If the cursor is currently pointing to the null object then no element
1264    /// is removed and `None` is returned.
1265    #[inline]
1266    pub fn remove(&mut self) -> Option<<A::PointerOps as PointerOps>::Pointer> {
1267        unsafe {
1268            if let Some(current) = self.current {
1269                let next = next(self.tree.adapter.link_ops(), current);
1270                let result = current;
1271                remove(
1272                    self.tree.adapter.link_ops_mut(),
1273                    current,
1274                    &mut self.tree.root,
1275                );
1276                self.current = next;
1277                Some(
1278                    self.tree
1279                        .adapter
1280                        .pointer_ops()
1281                        .from_raw(self.tree.adapter.get_value(result)),
1282                )
1283            } else {
1284                None
1285            }
1286        }
1287    }
1288
1289    /// Removes the current element from the `RBTree` and inserts another
1290    /// object in its place.
1291    ///
1292    /// A pointer to the element that was removed is returned, and the cursor is
1293    /// modified to point to the newly added element.
1294    ///
1295    /// When using this function you must ensure that the elements in the
1296    /// collection are maintained in increasing order. Failure to do this may
1297    /// lead to `find`, `upper_bound`, `lower_bound` and `range` returning
1298    /// incorrect results.
1299    ///
1300    /// If the cursor is currently pointing to the null object then an error is
1301    /// returned containing the given `val` parameter.
1302    ///
1303    /// # Panics
1304    ///
1305    /// Panics if the new element is already linked to a different intrusive
1306    /// collection.
1307    #[inline]
1308    pub fn replace_with(
1309        &mut self,
1310        val: <A::PointerOps as PointerOps>::Pointer,
1311    ) -> Result<<A::PointerOps as PointerOps>::Pointer, <A::PointerOps as PointerOps>::Pointer>
1312    {
1313        unsafe {
1314            if let Some(current) = self.current {
1315                let new = self.tree.node_from_value(val);
1316                let result = current;
1317                replace_with(
1318                    self.tree.adapter.link_ops_mut(),
1319                    current,
1320                    new,
1321                    &mut self.tree.root,
1322                );
1323                self.current = Some(new);
1324                Ok(self
1325                    .tree
1326                    .adapter
1327                    .pointer_ops()
1328                    .from_raw(self.tree.adapter.get_value(result)))
1329            } else {
1330                Err(val)
1331            }
1332        }
1333    }
1334
1335    /// Inserts a new element into the `RBTree` after the current one.
1336    ///
1337    /// When using this function you must ensure that the elements in the
1338    /// collection are maintained in increasing order. Failure to do this may
1339    /// lead to `find`, `upper_bound`, `lower_bound` and `range` returning
1340    /// incorrect results.
1341    ///
1342    /// If the cursor is pointing at the null object then the new element is
1343    /// inserted at the start of the `RBTree`.
1344    ///
1345    /// # Panics
1346    ///
1347    /// Panics if the new element is already linked to a different intrusive
1348    /// collection.
1349    #[inline]
1350    pub fn insert_after(&mut self, val: <A::PointerOps as PointerOps>::Pointer) {
1351        unsafe {
1352            let new = self.tree.node_from_value(val);
1353            let link_ops = self.tree.adapter.link_ops_mut();
1354
1355            if let Some(root) = self.tree.root {
1356                if let Some(current) = self.current {
1357                    if link_ops.right(current).is_some() {
1358                        let next = next(link_ops, current).unwrap_unchecked();
1359                        insert_left(link_ops, next, new, &mut self.tree.root);
1360                    } else {
1361                        insert_right(link_ops, current, new, &mut self.tree.root);
1362                    }
1363                } else {
1364                    insert_left(
1365                        link_ops,
1366                        first_child(link_ops, root),
1367                        new,
1368                        &mut self.tree.root,
1369                    );
1370                }
1371            } else {
1372                self.tree.insert_root(new);
1373            }
1374        }
1375    }
1376
1377    /// Inserts a new element into the `RBTree` before the current one.
1378    ///
1379    /// When using this function you must ensure that the elements in the
1380    /// collection are maintained in increasing order. Failure to do this may
1381    /// lead to `find`, `upper_bound`, `lower_bound` and `range` returning
1382    /// incorrect results.
1383    ///
1384    /// If the cursor is pointing at the null object then the new element is
1385    /// inserted at the end of the `RBTree`.
1386    ///
1387    /// # Panics
1388    ///
1389    /// Panics if the new element is already linked to a different intrusive
1390    /// collection.
1391    #[inline]
1392    pub fn insert_before(&mut self, val: <A::PointerOps as PointerOps>::Pointer) {
1393        unsafe {
1394            let new = self.tree.node_from_value(val);
1395            let link_ops = self.tree.adapter.link_ops_mut();
1396
1397            if let Some(root) = self.tree.root {
1398                if let Some(current) = self.current {
1399                    if link_ops.left(current).is_some() {
1400                        let prev = prev(link_ops, current).unwrap_unchecked();
1401                        insert_right(link_ops, prev, new, &mut self.tree.root);
1402                    } else {
1403                        insert_left(link_ops, current, new, &mut self.tree.root);
1404                    }
1405                } else {
1406                    insert_right(
1407                        link_ops,
1408                        last_child(link_ops, root),
1409                        new,
1410                        &mut self.tree.root,
1411                    );
1412                }
1413            } else {
1414                self.tree.insert_root(new);
1415            }
1416        }
1417    }
1418
1419    /// Consumes `CursorMut` and returns a reference to the object that
1420    /// the cursor is currently pointing to. Unlike [get](Self::get),
1421    /// the returned reference's lifetime is tied to `RBTree`'s lifetime.
1422    ///
1423    /// This returns None if the cursor is currently pointing to the null object.
1424    #[inline]
1425    pub fn into_ref(self) -> Option<&'a <A::PointerOps as PointerOps>::Value> {
1426        Some(unsafe { &*self.tree.adapter.get_value(self.current?) })
1427    }
1428}
1429
1430impl<'a, A: for<'b> KeyAdapter<'b>> CursorMut<'a, A>
1431where
1432    <A as Adapter>::LinkOps: RBTreeOps,
1433{
1434    /// Inserts a new element into the `RBTree`.
1435    ///
1436    /// The new element will be inserted at the correct position in the tree
1437    /// based on its key, regardless of the current cursor position.
1438    ///
1439    /// # Panics
1440    ///
1441    /// Panics if the new element is already linked to a different intrusive
1442    /// collection.
1443    #[inline]
1444    pub fn insert<'c>(&'c mut self, val: <A::PointerOps as PointerOps>::Pointer)
1445    where
1446        <A as KeyAdapter<'c>>::Key: Ord,
1447    {
1448        // We explicitly drop the returned CursorMut here, otherwise we would
1449        // end up with multiple CursorMut in the same collection.
1450        self.tree.insert(val);
1451    }
1452}
1453
1454/// A cursor with ownership over the `RBTree` it points into.
1455pub struct CursorOwning<A: Adapter>
1456where
1457    A::LinkOps: RBTreeOps,
1458{
1459    current: Option<<A::LinkOps as link_ops::LinkOps>::LinkPtr>,
1460    tree: RBTree<A>,
1461}
1462
1463impl<A: Adapter> CursorOwning<A>
1464where
1465    A::LinkOps: RBTreeOps,
1466{
1467    /// Consumes self and returns the inner `RBTree`.
1468    #[inline]
1469    pub fn into_inner(self) -> RBTree<A> {
1470        self.tree
1471    }
1472
1473    /// Returns a read-only cursor pointing to the current element.
1474    ///
1475    /// The lifetime of the returned `Cursor` is bound to that of the
1476    /// `CursorOwning`, which means it cannot outlive the `CursorOwning` and that the
1477    /// `CursorOwning` is frozen for the lifetime of the `Cursor`.
1478    ///
1479    /// Mutations of the returned cursor are _not_ reflected in the original.
1480    #[inline]
1481    pub fn as_cursor(&self) -> Cursor<'_, A> {
1482        Cursor {
1483            current: self.current,
1484            tree: &self.tree,
1485        }
1486    }
1487
1488    /// Perform action with mutable reference to the cursor.
1489    ///
1490    /// All mutations of the cursor are reflected in the original.
1491    #[inline]
1492    pub fn with_cursor_mut<T>(&mut self, f: impl FnOnce(&mut CursorMut<'_, A>) -> T) -> T {
1493        let mut cursor = CursorMut {
1494            current: self.current,
1495            tree: &mut self.tree,
1496        };
1497        let ret = f(&mut cursor);
1498        self.current = cursor.current;
1499        ret
1500    }
1501}
1502unsafe impl<A: Adapter> Send for CursorOwning<A>
1503where
1504    RBTree<A>: Send,
1505    A::LinkOps: RBTreeOps,
1506{
1507}
1508
1509// =============================================================================
1510// RBTree
1511// =============================================================================
1512
1513/// An intrusive red-black tree.
1514///
1515/// When this collection is dropped, all elements linked into it will be
1516/// converted back to owned pointers and dropped.
1517///
1518/// Note that you are responsible for ensuring that the elements in a `RBTree`
1519/// remain in ascending key order. This property can be violated, either because
1520/// the key of an element was modified, or because the
1521/// `insert_before`/`insert_after` methods of `CursorMut` were incorrectly used.
1522/// If this situation occurs, memory safety will not be violated but the `find`,
1523/// `upper_bound`, `lower_bound` and `range` may return incorrect results.
1524pub struct RBTree<A: Adapter>
1525where
1526    A::LinkOps: RBTreeOps,
1527{
1528    root: Option<<A::LinkOps as link_ops::LinkOps>::LinkPtr>,
1529    adapter: A,
1530}
1531
1532impl<A: Adapter> RBTree<A>
1533where
1534    A::LinkOps: RBTreeOps,
1535{
1536    #[inline]
1537    fn node_from_value(
1538        &mut self,
1539        val: <A::PointerOps as PointerOps>::Pointer,
1540    ) -> <A::LinkOps as link_ops::LinkOps>::LinkPtr {
1541        use link_ops::LinkOps;
1542
1543        unsafe {
1544            let raw = self.adapter.pointer_ops().into_raw(val);
1545            let link = self.adapter.get_link(raw);
1546
1547            if !self.adapter.link_ops_mut().acquire_link(link) {
1548                // convert the node back into a pointer
1549                self.adapter.pointer_ops().from_raw(raw);
1550
1551                panic!("attempted to insert an object that is already linked");
1552            }
1553
1554            link
1555        }
1556    }
1557
1558    /// Creates an empty `RBTree`.
1559    #[cfg(not(feature = "nightly"))]
1560    #[inline]
1561    pub fn new(adapter: A) -> RBTree<A> {
1562        RBTree {
1563            root: None,
1564            adapter,
1565        }
1566    }
1567
1568    /// Creates an empty `RBTree`.
1569    #[cfg(feature = "nightly")]
1570    #[inline]
1571    pub const fn new(adapter: A) -> RBTree<A> {
1572        RBTree {
1573            root: None,
1574            adapter,
1575        }
1576    }
1577
1578    /// Returns `true` if the `RBTree` is empty.
1579    #[inline]
1580    pub fn is_empty(&self) -> bool {
1581        self.root.is_none()
1582    }
1583
1584    /// Returns a null `Cursor` for this tree.
1585    #[inline]
1586    pub fn cursor(&self) -> Cursor<'_, A> {
1587        Cursor {
1588            current: None,
1589            tree: self,
1590        }
1591    }
1592
1593    /// Returns a null `CursorMut` for this tree.
1594    #[inline]
1595    pub fn cursor_mut(&mut self) -> CursorMut<'_, A> {
1596        CursorMut {
1597            current: None,
1598            tree: self,
1599        }
1600    }
1601
1602    /// Returns a null `CursorOwning` for this tree.
1603    #[inline]
1604    pub fn cursor_owning(self) -> CursorOwning<A> {
1605        CursorOwning {
1606            current: None,
1607            tree: self,
1608        }
1609    }
1610
1611    /// Creates a `Cursor` from a pointer to an element.
1612    ///
1613    /// # Safety
1614    ///
1615    /// `ptr` must be a pointer to an object that is part of this tree.
1616    #[inline]
1617    pub unsafe fn cursor_from_ptr(
1618        &self,
1619        ptr: *const <A::PointerOps as PointerOps>::Value,
1620    ) -> Cursor<'_, A> {
1621        Cursor {
1622            current: Some(self.adapter.get_link(ptr)),
1623            tree: self,
1624        }
1625    }
1626
1627    /// Creates a `CursorMut` from a pointer to an element.
1628    ///
1629    /// # Safety
1630    ///
1631    /// `ptr` must be a pointer to an object that is part of this tree.
1632    #[inline]
1633    pub unsafe fn cursor_mut_from_ptr(
1634        &mut self,
1635        ptr: *const <A::PointerOps as PointerOps>::Value,
1636    ) -> CursorMut<'_, A> {
1637        CursorMut {
1638            current: Some(self.adapter.get_link(ptr)),
1639            tree: self,
1640        }
1641    }
1642
1643    /// Creates a `CursorOwning` from a pointer to an element.
1644    ///
1645    /// # Safety
1646    ///
1647    /// `ptr` must be a pointer to an object that is part of this tree.
1648    #[inline]
1649    pub unsafe fn cursor_owning_from_ptr(
1650        self,
1651        ptr: *const <A::PointerOps as PointerOps>::Value,
1652    ) -> CursorOwning<A> {
1653        CursorOwning {
1654            current: Some(self.adapter.get_link(ptr)),
1655            tree: self,
1656        }
1657    }
1658
1659    /// Returns a `Cursor` pointing to the first element of the tree. If the
1660    /// tree is empty then a null cursor is returned.
1661    #[inline]
1662    pub fn front(&self) -> Cursor<'_, A> {
1663        let mut cursor = self.cursor();
1664        cursor.move_next();
1665        cursor
1666    }
1667
1668    /// Returns a `CursorMut` pointing to the first element of the tree. If the
1669    /// the tree is empty then a null cursor is returned.
1670    #[inline]
1671    pub fn front_mut(&mut self) -> CursorMut<'_, A> {
1672        let mut cursor = self.cursor_mut();
1673        cursor.move_next();
1674        cursor
1675    }
1676
1677    /// Returns a `CursorOwning` pointing to the first element of the tree. If the
1678    /// the tree is empty then a null cursor is returned.
1679    #[inline]
1680    pub fn front_owning(self) -> CursorOwning<A> {
1681        let mut cursor = self.cursor_owning();
1682        cursor.with_cursor_mut(|c| c.move_next());
1683        cursor
1684    }
1685
1686    /// Returns a `Cursor` pointing to the last element of the tree. If the tree
1687    /// is empty then a null cursor is returned.
1688    #[inline]
1689    pub fn back(&self) -> Cursor<'_, A> {
1690        let mut cursor = self.cursor();
1691        cursor.move_prev();
1692        cursor
1693    }
1694
1695    /// Returns a `CursorMut` pointing to the last element of the tree. If the
1696    /// tree is empty then a null cursor is returned.
1697    #[inline]
1698    pub fn back_mut(&mut self) -> CursorMut<'_, A> {
1699        let mut cursor = self.cursor_mut();
1700        cursor.move_prev();
1701        cursor
1702    }
1703
1704    /// Returns a `CursorOwning` pointing to the last element of the tree. If the
1705    /// tree is empty then a null cursor is returned.
1706    #[inline]
1707    pub fn back_owning(self) -> CursorOwning<A> {
1708        let mut cursor = self.cursor_owning();
1709        cursor.with_cursor_mut(|c| c.move_prev());
1710        cursor
1711    }
1712
1713    #[inline]
1714    unsafe fn insert_root(&mut self, node: <A::LinkOps as link_ops::LinkOps>::LinkPtr) {
1715        self.adapter.link_ops_mut().set_parent(node, None);
1716        self.adapter.link_ops_mut().set_color(node, Color::Black);
1717        self.adapter.link_ops_mut().set_left(node, None);
1718        self.adapter.link_ops_mut().set_right(node, None);
1719        self.root = Some(node);
1720    }
1721
1722    /// Gets an iterator over the objects in the `RBTree`.
1723    #[inline]
1724    pub fn iter(&self) -> Iter<'_, A> {
1725        let link_ops = self.adapter.link_ops();
1726
1727        if let Some(root) = self.root {
1728            Iter {
1729                head: Some(unsafe { first_child(link_ops, root) }),
1730                tail: Some(unsafe { last_child(link_ops, root) }),
1731                tree: self,
1732            }
1733        } else {
1734            Iter {
1735                head: None,
1736                tail: None,
1737                tree: self,
1738            }
1739        }
1740    }
1741
1742    #[inline]
1743    fn clear_recurse(&mut self, current: Option<<A::LinkOps as link_ops::LinkOps>::LinkPtr>) {
1744        use link_ops::LinkOps;
1745        // If adapter.get_value or Pointer::from_raw panic here, it will leak
1746        // the nodes and keep them linked. However this is harmless since there
1747        // is nothing you can do with just a Link.
1748        if let Some(current) = current {
1749            unsafe {
1750                let left = self.adapter.link_ops_mut().left(current);
1751                let right = self.adapter.link_ops_mut().right(current);
1752                self.clear_recurse(left);
1753                self.clear_recurse(right);
1754                self.adapter.link_ops_mut().release_link(current);
1755                self.adapter
1756                    .pointer_ops()
1757                    .from_raw(self.adapter.get_value(current));
1758            }
1759        }
1760    }
1761
1762    /// Removes all elements from the `RBTree`.
1763    ///
1764    /// This will unlink all object currently in the tree, which requires
1765    /// iterating through all elements in the `RBTree`. Each element is
1766    /// converted back to an owned pointer and then dropped.
1767    #[inline]
1768    pub fn clear(&mut self) {
1769        let root = self.root.take();
1770        self.clear_recurse(root);
1771    }
1772
1773    /// Empties the `RBTree` without unlinking or freeing objects in it.
1774    ///
1775    /// Since this does not unlink any objects, any attempts to link these
1776    /// objects into another `RBTree` will fail but will not cause any
1777    /// memory unsafety. To unlink those objects manually, you must call the
1778    /// `force_unlink` function on them.
1779    #[inline]
1780    pub fn fast_clear(&mut self) {
1781        self.root = None;
1782    }
1783
1784    /// Takes all the elements out of the `RBTree`, leaving it empty. The
1785    /// taken elements are returned as a new `RBTree`.
1786    #[inline]
1787    pub fn take(&mut self) -> RBTree<A>
1788    where
1789        A: Clone,
1790    {
1791        let tree = RBTree {
1792            root: self.root,
1793            adapter: self.adapter.clone(),
1794        };
1795        self.root = None;
1796        tree
1797    }
1798}
1799
1800impl<A: for<'a> KeyAdapter<'a>> RBTree<A>
1801where
1802    <A as Adapter>::LinkOps: RBTreeOps,
1803{
1804    #[inline]
1805    fn find_internal<'a, Q: ?Sized + Ord>(
1806        &self,
1807        key: &Q,
1808    ) -> Option<<A::LinkOps as link_ops::LinkOps>::LinkPtr>
1809    where
1810        <A as KeyAdapter<'a>>::Key: Borrow<Q>,
1811        <A::PointerOps as PointerOps>::Value: 'a,
1812    {
1813        let link_ops = self.adapter.link_ops();
1814
1815        let mut tree = self.root;
1816        while let Some(x) = tree {
1817            let current = unsafe { &*self.adapter.get_value(x) };
1818            match key.cmp(self.adapter.get_key(current).borrow()) {
1819                Ordering::Less => tree = unsafe { link_ops.left(x) },
1820                Ordering::Equal => return tree,
1821                Ordering::Greater => tree = unsafe { link_ops.right(x) },
1822            }
1823        }
1824        None
1825    }
1826
1827    /// Returns a `Cursor` pointing to an element with the given key. If no such
1828    /// element is found then a null cursor is returned.
1829    ///
1830    /// If multiple elements with an identical key are found then an arbitrary
1831    /// one is returned.
1832    #[inline]
1833    pub fn find<'a, 'b, Q: ?Sized + Ord>(&'a self, key: &Q) -> Cursor<'a, A>
1834    where
1835        <A as KeyAdapter<'b>>::Key: Borrow<Q>,
1836        'a: 'b,
1837    {
1838        Cursor {
1839            current: self.find_internal(key),
1840            tree: self,
1841        }
1842    }
1843
1844    /// Returns a `CursorMut` pointing to an element with the given key. If no
1845    /// such element is found then a null cursor is returned.
1846    ///
1847    /// If multiple elements with an identical key are found then an arbitrary
1848    /// one is returned.
1849    #[inline]
1850    pub fn find_mut<'a, 'b, Q: ?Sized + Ord>(&'a mut self, key: &Q) -> CursorMut<'a, A>
1851    where
1852        <A as KeyAdapter<'b>>::Key: Borrow<Q>,
1853        'a: 'b,
1854    {
1855        CursorMut {
1856            current: self.find_internal(key),
1857            tree: self,
1858        }
1859    }
1860
1861    // Returns a `CursorOwning` pointing to an element with the given key. If no
1862    /// such element is found then a null cursor is returned.
1863    ///
1864    /// If multiple elements with an identical key are found then an arbitrary
1865    /// one is returned.
1866    #[inline]
1867    pub fn find_owning<'a, Q: ?Sized + Ord>(self, key: &Q) -> CursorOwning<A>
1868    where
1869        <A as KeyAdapter<'a>>::Key: Borrow<Q>,
1870        Self: 'a,
1871    {
1872        CursorOwning {
1873            current: self.find_internal(key),
1874            tree: self,
1875        }
1876    }
1877
1878    #[inline]
1879    fn lower_bound_internal<'a, Q: ?Sized + Ord>(
1880        &self,
1881        bound: Bound<&Q>,
1882    ) -> Option<<A::LinkOps as link_ops::LinkOps>::LinkPtr>
1883    where
1884        <A as KeyAdapter<'a>>::Key: Borrow<Q>,
1885        <A::PointerOps as PointerOps>::Value: 'a,
1886    {
1887        let link_ops = self.adapter.link_ops();
1888
1889        let mut tree = self.root;
1890        let mut result = None;
1891        while let Some(x) = tree {
1892            let current = unsafe { &*self.adapter.get_value(x) };
1893            let cond = match bound {
1894                Unbounded => true,
1895                Included(key) => key <= self.adapter.get_key(current).borrow(),
1896                Excluded(key) => key < self.adapter.get_key(current).borrow(),
1897            };
1898            if cond {
1899                result = tree;
1900                tree = unsafe { link_ops.left(x) };
1901            } else {
1902                tree = unsafe { link_ops.right(x) };
1903            }
1904        }
1905        result
1906    }
1907
1908    /// Returns a `Cursor` pointing to the lowest element whose key is above
1909    /// the given bound. If no such element is found then a null cursor is
1910    /// returned.
1911    #[inline]
1912    pub fn lower_bound<'a, 'b, Q: ?Sized + Ord>(&'a self, bound: Bound<&Q>) -> Cursor<'a, A>
1913    where
1914        <A as KeyAdapter<'b>>::Key: Borrow<Q>,
1915        'a: 'b,
1916    {
1917        Cursor {
1918            current: self.lower_bound_internal(bound),
1919            tree: self,
1920        }
1921    }
1922
1923    /// Returns a `CursorMut` pointing to the first element whose key is
1924    /// above the given bound. If no such element is found then a null
1925    /// cursor is returned.
1926    #[inline]
1927    pub fn lower_bound_mut<'a, 'b, Q: ?Sized + Ord>(
1928        &'a mut self,
1929        bound: Bound<&Q>,
1930    ) -> CursorMut<'a, A>
1931    where
1932        <A as KeyAdapter<'b>>::Key: Borrow<Q>,
1933        'a: 'b,
1934    {
1935        CursorMut {
1936            current: self.lower_bound_internal(bound),
1937            tree: self,
1938        }
1939    }
1940
1941    /// Returns a `CursorOwning` pointing to the first element whose key is
1942    /// above the given bound. If no such element is found then a null
1943    /// cursor is returned.
1944    #[inline]
1945    pub fn lower_bound_owning<'a, Q: ?Sized + Ord>(self, bound: Bound<&Q>) -> CursorOwning<A>
1946    where
1947        <A as KeyAdapter<'a>>::Key: Borrow<Q>,
1948        Self: 'a,
1949    {
1950        CursorOwning {
1951            current: self.lower_bound_internal(bound),
1952            tree: self,
1953        }
1954    }
1955
1956    #[inline]
1957    fn upper_bound_internal<'a, Q: ?Sized + Ord>(
1958        &self,
1959        bound: Bound<&Q>,
1960    ) -> Option<<A::LinkOps as link_ops::LinkOps>::LinkPtr>
1961    where
1962        <A as KeyAdapter<'a>>::Key: Borrow<Q>,
1963        <A::PointerOps as PointerOps>::Value: 'a,
1964    {
1965        let link_ops = self.adapter.link_ops();
1966
1967        let mut tree = self.root;
1968        let mut result = None;
1969        while let Some(x) = tree {
1970            let current = unsafe { &*self.adapter.get_value(x) };
1971            let cond = match bound {
1972                Unbounded => false,
1973                Included(key) => key < self.adapter.get_key(current).borrow(),
1974                Excluded(key) => key <= self.adapter.get_key(current).borrow(),
1975            };
1976            if cond {
1977                tree = unsafe { link_ops.left(x) };
1978            } else {
1979                result = tree;
1980                tree = unsafe { link_ops.right(x) };
1981            }
1982        }
1983        result
1984    }
1985
1986    /// Returns a `Cursor` pointing to the last element whose key is below
1987    /// the given bound. If no such element is found then a null cursor is
1988    /// returned.
1989    #[inline]
1990    pub fn upper_bound<'a, 'b, Q: ?Sized + Ord>(&'a self, bound: Bound<&Q>) -> Cursor<'a, A>
1991    where
1992        <A as KeyAdapter<'b>>::Key: Borrow<Q>,
1993        'a: 'b,
1994    {
1995        Cursor {
1996            current: self.upper_bound_internal(bound),
1997            tree: self,
1998        }
1999    }
2000
2001    /// Returns a `CursorMut` pointing to the last element whose key is
2002    /// below the given bound. If no such element is found then a null
2003    /// cursor is returned.
2004    #[inline]
2005    pub fn upper_bound_mut<'a, 'b, Q: ?Sized + Ord>(
2006        &'a mut self,
2007        bound: Bound<&Q>,
2008    ) -> CursorMut<'a, A>
2009    where
2010        <A as KeyAdapter<'b>>::Key: Borrow<Q>,
2011        'a: 'b,
2012    {
2013        CursorMut {
2014            current: self.upper_bound_internal(bound),
2015            tree: self,
2016        }
2017    }
2018
2019    /// Returns a `CursorOwning` pointing to the last element whose key is
2020    /// below the given bound. If no such element is found then a null
2021    /// cursor is returned.
2022    #[inline]
2023    pub fn upper_bound_owning<'a, Q: ?Sized + Ord>(self, bound: Bound<&Q>) -> CursorOwning<A>
2024    where
2025        <A as KeyAdapter<'a>>::Key: Borrow<Q>,
2026        Self: 'a,
2027    {
2028        CursorOwning {
2029            current: self.upper_bound_internal(bound),
2030            tree: self,
2031        }
2032    }
2033
2034    /// Inserts a new element into the `RBTree`.
2035    ///
2036    /// The new element will be inserted at the correct position in the tree
2037    /// based on its key.
2038    ///
2039    /// Returns a mutable cursor pointing to the newly added element.
2040    ///
2041    /// # Panics
2042    ///
2043    /// Panics if the new element is already linked to a different intrusive
2044    /// collection.
2045    #[inline]
2046    pub fn insert<'a>(&'a mut self, val: <A::PointerOps as PointerOps>::Pointer) -> CursorMut<'_, A>
2047    where
2048        <A as KeyAdapter<'a>>::Key: Ord,
2049    {
2050        unsafe {
2051            let new = self.node_from_value(val);
2052            let raw = self.adapter.get_value(new);
2053            if let Some(root) = self.root {
2054                let key = self.adapter.get_key(&*raw);
2055                let mut tree = root;
2056                loop {
2057                    let current = &*self.adapter.get_value(tree);
2058                    if key < self.adapter.get_key(current) {
2059                        if let Some(left) = self.adapter.link_ops().left(tree) {
2060                            tree = left;
2061                        } else {
2062                            insert_left(self.adapter.link_ops_mut(), tree, new, &mut self.root);
2063                            break;
2064                        }
2065                    } else {
2066                        if let Some(right) = self.adapter.link_ops().right(tree) {
2067                            tree = right;
2068                        } else {
2069                            insert_right(self.adapter.link_ops_mut(), tree, new, &mut self.root);
2070                            break;
2071                        }
2072                    }
2073                }
2074            } else {
2075                self.insert_root(new);
2076            }
2077
2078            CursorMut {
2079                current: Some(new),
2080                tree: self,
2081            }
2082        }
2083    }
2084
2085    /// Returns an `Entry` for the given key which contains a `CursorMut` to an
2086    /// element with the given key or an `InsertCursor` which points to a place
2087    /// in which to insert a new element with the given key.
2088    ///
2089    /// This is more efficient than calling `find` followed by `insert` since
2090    /// the tree does not have to be searched a second time to find a place to
2091    /// insert the new element.
2092    ///
2093    /// If multiple elements with an identical key are found then an arbitrary
2094    /// one is returned.
2095    #[inline]
2096    pub fn entry<'a, Q: ?Sized + Ord>(&'a mut self, key: &Q) -> Entry<'a, A>
2097    where
2098        <A as KeyAdapter<'a>>::Key: Borrow<Q>,
2099    {
2100        unsafe {
2101            if let Some(root) = self.root {
2102                let mut tree = root;
2103                loop {
2104                    let current = &*self.adapter.get_value(tree);
2105                    match key.cmp(self.adapter.get_key(current).borrow()) {
2106                        Ordering::Less => {
2107                            if let Some(left) = self.adapter.link_ops().left(tree) {
2108                                tree = left;
2109                            } else {
2110                                return Entry::Vacant(InsertCursor {
2111                                    parent: Some(tree),
2112                                    insert_left: true,
2113                                    tree: self,
2114                                });
2115                            }
2116                        }
2117                        Ordering::Equal => {
2118                            return Entry::Occupied(CursorMut {
2119                                current: Some(tree),
2120                                tree: self,
2121                            });
2122                        }
2123                        Ordering::Greater => {
2124                            if let Some(right) = self.adapter.link_ops().right(tree) {
2125                                tree = right;
2126                            } else {
2127                                return Entry::Vacant(InsertCursor {
2128                                    parent: Some(tree),
2129                                    insert_left: false,
2130                                    tree: self,
2131                                });
2132                            }
2133                        }
2134                    }
2135                }
2136            } else {
2137                Entry::Vacant(InsertCursor {
2138                    parent: None,
2139                    insert_left: false,
2140                    tree: self,
2141                })
2142            }
2143        }
2144    }
2145
2146    /// Constructs a double-ended iterator over a sub-range of elements in the
2147    /// tree, starting at min, and ending at max. If min is `Unbounded`, then it
2148    /// will be treated as "negative infinity", and if max is `Unbounded`, then
2149    /// it will be treated as "positive infinity". Thus
2150    /// `range(Unbounded, Unbounded)` will yield the whole collection.
2151    #[inline]
2152    pub fn range<'a, Min: ?Sized + Ord, Max: ?Sized + Ord>(
2153        &'a self,
2154        min: Bound<&Min>,
2155        max: Bound<&Max>,
2156    ) -> Iter<'a, A>
2157    where
2158        <A as KeyAdapter<'a>>::Key: Borrow<Min> + Borrow<Max>,
2159        <A as KeyAdapter<'a>>::Key: Ord,
2160    {
2161        let lower = self.lower_bound_internal(min);
2162        let upper = self.upper_bound_internal(max);
2163
2164        if let (Some(lower), Some(upper)) = (lower, upper) {
2165            let lower_key = unsafe { self.adapter.get_key(&*self.adapter.get_value(lower)) };
2166            let upper_key = unsafe { self.adapter.get_key(&*self.adapter.get_value(upper)) };
2167            if upper_key >= lower_key {
2168                return Iter {
2169                    head: Some(lower),
2170                    tail: Some(upper),
2171                    tree: self,
2172                };
2173            }
2174        }
2175        Iter {
2176            head: None,
2177            tail: None,
2178            tree: self,
2179        }
2180    }
2181}
2182
2183// Allow read-only access to values from multiple threads
2184unsafe impl<A: Adapter + Sync> Sync for RBTree<A>
2185where
2186    <A::PointerOps as PointerOps>::Value: Sync,
2187    A::LinkOps: RBTreeOps,
2188{
2189}
2190
2191// Allow sending to another thread if the ownership (represented by the <A::PointerOps as PointerOps>::Pointer owned
2192// pointer type) can be transferred to another thread.
2193unsafe impl<A: Adapter + Send> Send for RBTree<A>
2194where
2195    <A::PointerOps as PointerOps>::Pointer: Send,
2196    A::LinkOps: RBTreeOps,
2197{
2198}
2199
2200// Drop all owned pointers if the collection is dropped
2201impl<A: Adapter> Drop for RBTree<A>
2202where
2203    A::LinkOps: RBTreeOps,
2204{
2205    #[inline]
2206    fn drop(&mut self) {
2207        self.clear();
2208    }
2209}
2210
2211impl<A: Adapter> IntoIterator for RBTree<A>
2212where
2213    A::LinkOps: RBTreeOps,
2214{
2215    type Item = <A::PointerOps as PointerOps>::Pointer;
2216    type IntoIter = IntoIter<A>;
2217
2218    #[inline]
2219    fn into_iter(self) -> IntoIter<A> {
2220        let link_ops = self.adapter.link_ops();
2221
2222        if let Some(root) = self.root {
2223            IntoIter {
2224                head: Some(unsafe { first_child(link_ops, root) }),
2225                tail: Some(unsafe { last_child(link_ops, root) }),
2226                tree: self,
2227            }
2228        } else {
2229            IntoIter {
2230                head: None,
2231                tail: None,
2232                tree: self,
2233            }
2234        }
2235    }
2236}
2237
2238impl<'a, A: Adapter + 'a> IntoIterator for &'a RBTree<A>
2239where
2240    A::LinkOps: RBTreeOps,
2241{
2242    type Item = &'a <A::PointerOps as PointerOps>::Value;
2243    type IntoIter = Iter<'a, A>;
2244
2245    #[inline]
2246    fn into_iter(self) -> Iter<'a, A> {
2247        self.iter()
2248    }
2249}
2250
2251impl<A: Adapter + Default> Default for RBTree<A>
2252where
2253    A::LinkOps: RBTreeOps,
2254{
2255    fn default() -> RBTree<A> {
2256        RBTree::new(A::default())
2257    }
2258}
2259
2260impl<A: Adapter> fmt::Debug for RBTree<A>
2261where
2262    A::LinkOps: RBTreeOps,
2263    <A::PointerOps as PointerOps>::Value: fmt::Debug,
2264{
2265    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2266        f.debug_set().entries(self.iter()).finish()
2267    }
2268}
2269
2270// =============================================================================
2271// InsertCursor, Entry
2272// =============================================================================
2273
2274/// A cursor pointing to a slot in which an element can be inserted into a
2275/// `RBTree`.
2276pub struct InsertCursor<'a, A: Adapter>
2277where
2278    A::LinkOps: RBTreeOps,
2279{
2280    parent: Option<<A::LinkOps as link_ops::LinkOps>::LinkPtr>,
2281    insert_left: bool,
2282    tree: &'a mut RBTree<A>,
2283}
2284
2285impl<'a, A: Adapter + 'a> InsertCursor<'a, A>
2286where
2287    A::LinkOps: RBTreeOps,
2288{
2289    /// Inserts a new element into the `RBTree` at the location indicated by
2290    /// this `InsertCursor`.
2291    ///
2292    /// # Panics
2293    ///
2294    /// Panics if the new element is already linked to a different intrusive
2295    /// collection.
2296    pub fn insert(self, val: <A::PointerOps as PointerOps>::Pointer) -> CursorMut<'a, A> {
2297        unsafe {
2298            let new = self.tree.node_from_value(val);
2299            let link_ops = self.tree.adapter.link_ops_mut();
2300            if let Some(parent) = self.parent {
2301                if self.insert_left {
2302                    insert_left(link_ops, parent, new, &mut self.tree.root);
2303                } else {
2304                    insert_right(link_ops, parent, new, &mut self.tree.root);
2305                }
2306            } else {
2307                self.tree.insert_root(new);
2308            }
2309            CursorMut {
2310                current: Some(new),
2311                tree: self.tree,
2312            }
2313        }
2314    }
2315}
2316
2317/// An entry in a `RBTree`.
2318///
2319/// See the documentation for `RBTree::entry`.
2320pub enum Entry<'a, A: Adapter>
2321where
2322    A::LinkOps: RBTreeOps,
2323{
2324    /// An occupied entry.
2325    Occupied(CursorMut<'a, A>),
2326
2327    /// A vacant entry.
2328    Vacant(InsertCursor<'a, A>),
2329}
2330
2331impl<'a, A: Adapter + 'a> Entry<'a, A>
2332where
2333    A::LinkOps: RBTreeOps,
2334{
2335    /// Inserts an element into the `RBTree` if the entry is vacant, returning
2336    /// a `CursorMut` to the resulting value. If the entry is occupied then a
2337    /// `CursorMut` pointing to the element is returned.
2338    ///
2339    /// # Panics
2340    ///
2341    /// Panics if the `Entry` is vacant and the new element is already linked to
2342    /// a different intrusive collection.
2343    pub fn or_insert(self, val: <A::PointerOps as PointerOps>::Pointer) -> CursorMut<'a, A> {
2344        match self {
2345            Entry::Occupied(entry) => entry,
2346            Entry::Vacant(entry) => entry.insert(val),
2347        }
2348    }
2349
2350    /// Calls the given function and inserts the result into the `RBTree` if the
2351    /// entry is vacant, returning a `CursorMut` to the resulting value. If the
2352    /// entry is occupied then a `CursorMut` pointing to the element is
2353    /// returned and the function is not executed.
2354    ///
2355    /// # Panics
2356    ///
2357    /// Panics if the `Entry` is vacant and the new element is already linked to
2358    /// a different intrusive collection.
2359    pub fn or_insert_with<F>(self, default: F) -> CursorMut<'a, A>
2360    where
2361        F: FnOnce() -> <A::PointerOps as PointerOps>::Pointer,
2362    {
2363        match self {
2364            Entry::Occupied(entry) => entry,
2365            Entry::Vacant(entry) => entry.insert(default()),
2366        }
2367    }
2368}
2369
2370// =============================================================================
2371// Iter
2372// =============================================================================
2373
2374/// An iterator over references to the items of a `RBTree`.
2375pub struct Iter<'a, A: Adapter>
2376where
2377    A::LinkOps: RBTreeOps,
2378{
2379    head: Option<<A::LinkOps as link_ops::LinkOps>::LinkPtr>,
2380    tail: Option<<A::LinkOps as link_ops::LinkOps>::LinkPtr>,
2381    tree: &'a RBTree<A>,
2382}
2383impl<'a, A: Adapter + 'a> Iterator for Iter<'a, A>
2384where
2385    A::LinkOps: RBTreeOps,
2386{
2387    type Item = &'a <A::PointerOps as PointerOps>::Value;
2388
2389    #[inline]
2390    fn next(&mut self) -> Option<&'a <A::PointerOps as PointerOps>::Value> {
2391        let head = self.head?;
2392
2393        if Some(head) == self.tail {
2394            self.head = None;
2395            self.tail = None;
2396        } else {
2397            self.head = unsafe { next(self.tree.adapter.link_ops(), head) };
2398        }
2399        Some(unsafe { &*self.tree.adapter.get_value(head) })
2400    }
2401}
2402impl<'a, A: Adapter + 'a> DoubleEndedIterator for Iter<'a, A>
2403where
2404    A::LinkOps: RBTreeOps,
2405{
2406    #[inline]
2407    fn next_back(&mut self) -> Option<&'a <A::PointerOps as PointerOps>::Value> {
2408        let tail = self.tail?;
2409
2410        if Some(tail) == self.head {
2411            self.head = None;
2412            self.tail = None;
2413        } else {
2414            self.tail = unsafe { prev(self.tree.adapter.link_ops(), tail) };
2415        }
2416        Some(unsafe { &*self.tree.adapter.get_value(tail) })
2417    }
2418}
2419impl<'a, A: Adapter + 'a> Clone for Iter<'a, A>
2420where
2421    A::LinkOps: RBTreeOps,
2422{
2423    #[inline]
2424    fn clone(&self) -> Iter<'a, A> {
2425        Iter {
2426            head: self.head,
2427            tail: self.tail,
2428            tree: self.tree,
2429        }
2430    }
2431}
2432
2433// =============================================================================
2434// IntoIter
2435// =============================================================================
2436
2437/// An iterator which consumes a `RBTree`.
2438pub struct IntoIter<A: Adapter>
2439where
2440    A::LinkOps: RBTreeOps,
2441{
2442    head: Option<<A::LinkOps as link_ops::LinkOps>::LinkPtr>,
2443    tail: Option<<A::LinkOps as link_ops::LinkOps>::LinkPtr>,
2444    tree: RBTree<A>,
2445}
2446impl<A: Adapter> Iterator for IntoIter<A>
2447where
2448    A::LinkOps: RBTreeOps,
2449{
2450    type Item = <A::PointerOps as PointerOps>::Pointer;
2451
2452    #[inline]
2453    fn next(&mut self) -> Option<<A::PointerOps as PointerOps>::Pointer> {
2454        use link_ops::LinkOps;
2455
2456        let head = self.head?;
2457        let link_ops = self.tree.adapter.link_ops_mut();
2458        unsafe {
2459            // Remove the node from the tree. Since head is always the
2460            // left-most node, we can infer the following:
2461            // - head.left is null.
2462            // - head is a left child of its parent (or the root node).
2463            if let Some(parent) = link_ops.parent(head) {
2464                link_ops.set_left(parent, link_ops.right(head));
2465            } else {
2466                self.tree.root = link_ops.right(head);
2467                if link_ops.right(head).is_none() {
2468                    self.tail = None;
2469                }
2470            }
2471            if let Some(right) = link_ops.right(head) {
2472                link_ops.set_parent(right, link_ops.parent(head));
2473                self.head = Some(first_child(link_ops, right));
2474            } else {
2475                self.head = link_ops.parent(head);
2476            }
2477            link_ops.release_link(head);
2478            Some(
2479                self.tree
2480                    .adapter
2481                    .pointer_ops()
2482                    .from_raw(self.tree.adapter.get_value(head)),
2483            )
2484        }
2485    }
2486}
2487impl<A: Adapter> DoubleEndedIterator for IntoIter<A>
2488where
2489    A::LinkOps: RBTreeOps,
2490{
2491    #[inline]
2492    fn next_back(&mut self) -> Option<<A::PointerOps as PointerOps>::Pointer> {
2493        use link_ops::LinkOps;
2494
2495        let tail = self.tail?;
2496        let link_ops = self.tree.adapter.link_ops_mut();
2497        unsafe {
2498            // Remove the node from the tree. Since tail is always the
2499            // right-most node, we can infer the following:
2500            // - tail.right is null.
2501            // - tail is a right child of its parent (or the root node).
2502            if let Some(parent) = link_ops.parent(tail) {
2503                link_ops.set_right(parent, link_ops.left(tail));
2504            } else {
2505                self.tree.root = link_ops.left(tail);
2506                if link_ops.left(tail).is_none() {
2507                    self.tail = None;
2508                }
2509            }
2510            if let Some(left) = link_ops.left(tail) {
2511                link_ops.set_parent(left, link_ops.parent(tail));
2512                self.tail = Some(last_child(link_ops, left));
2513            } else {
2514                self.tail = link_ops.parent(tail);
2515            }
2516            link_ops.release_link(tail);
2517            Some(
2518                self.tree
2519                    .adapter
2520                    .pointer_ops()
2521                    .from_raw(self.tree.adapter.get_value(tail)),
2522            )
2523        }
2524    }
2525}
2526
2527// =============================================================================
2528// Tests
2529// =============================================================================
2530
2531#[cfg(test)]
2532mod tests {
2533    use super::{CursorOwning, Entry, KeyAdapter, Link, PointerOps, RBTree};
2534    use crate::{Bound::*, UnsafeRef};
2535    use alloc::boxed::Box;
2536    use rand::prelude::*;
2537    use rand_xorshift::XorShiftRng;
2538    use std::fmt;
2539    use std::rc::Rc;
2540    use std::vec::Vec;
2541    use std::{format, vec};
2542
2543    #[derive(Clone)]
2544    struct Obj {
2545        link: Link,
2546        value: i32,
2547    }
2548    impl fmt::Debug for Obj {
2549        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2550            write!(f, "{}", self.value)
2551        }
2552    }
2553    intrusive_adapter!(RcObjAdapter = Rc<Obj>: Obj { link: Link });
2554
2555    impl<'a> KeyAdapter<'a> for RcObjAdapter {
2556        type Key = i32;
2557        fn get_key(&self, value: &'a <Self::PointerOps as PointerOps>::Value) -> i32 {
2558            value.value
2559        }
2560    }
2561
2562    intrusive_adapter!(UnsafeRefObjAdapter = UnsafeRef<Obj>: Obj { link: Link });
2563
2564    impl<'a> KeyAdapter<'a> for UnsafeRefObjAdapter {
2565        type Key = i32;
2566        fn get_key(&self, value: &'a <Self::PointerOps as PointerOps>::Value) -> i32 {
2567            value.value
2568        }
2569    }
2570
2571    fn make_rc_obj(value: i32) -> Rc<Obj> {
2572        Rc::new(make_obj(value))
2573    }
2574
2575    fn make_obj(value: i32) -> Obj {
2576        Obj {
2577            link: Link::new(),
2578            value,
2579        }
2580    }
2581
2582    #[test]
2583    fn test_link() {
2584        let a = make_rc_obj(1);
2585        assert!(!a.link.is_linked());
2586        assert_eq!(format!("{:?}", a.link), "unlinked");
2587
2588        let mut b = RBTree::<RcObjAdapter>::default();
2589        assert!(b.is_empty());
2590
2591        assert_eq!(b.insert(a.clone()).get().unwrap().value, 1);
2592        assert!(!b.is_empty());
2593        assert!(a.link.is_linked());
2594        assert_eq!(format!("{:?}", a.link), "linked");
2595
2596        let c = a.as_ref().clone();
2597        assert!(!c.link.is_linked());
2598
2599        unsafe {
2600            assert_eq!(b.cursor_from_ptr(a.as_ref()).get().unwrap().value, 1);
2601            assert_eq!(b.cursor_mut_from_ptr(a.as_ref()).get().unwrap().value, 1);
2602        }
2603
2604        assert_eq!(
2605            b.front_mut().remove().unwrap().as_ref() as *const _,
2606            a.as_ref() as *const _
2607        );
2608        assert!(b.is_empty());
2609        assert!(!a.link.is_linked());
2610    }
2611
2612    #[test]
2613    fn test_cursor() {
2614        let a = make_rc_obj(1);
2615        let b = make_rc_obj(2);
2616        let c = make_rc_obj(3);
2617        let mut t = RBTree::new(RcObjAdapter::new());
2618        let mut cur = t.cursor_mut();
2619        assert!(cur.is_null());
2620        assert!(cur.get().is_none());
2621        assert!(cur.remove().is_none());
2622
2623        cur.insert_before(a.clone());
2624        cur.insert_before(c.clone());
2625        cur.move_prev();
2626        cur.insert(b.clone());
2627        assert!(cur.peek_next().is_null());
2628        cur.move_next();
2629        assert!(cur.is_null());
2630
2631        cur.move_next();
2632        assert!(cur.peek_prev().is_null());
2633        assert!(!cur.is_null());
2634        assert_eq!(cur.get().unwrap() as *const _, a.as_ref() as *const _);
2635
2636        {
2637            let mut cur2 = cur.as_cursor();
2638            assert_eq!(cur2.get().unwrap() as *const _, a.as_ref() as *const _);
2639            assert_eq!(cur2.peek_next().get().unwrap().value, 2);
2640            cur2.move_next();
2641            assert_eq!(cur2.get().unwrap().value, 2);
2642            cur2.move_next();
2643            assert_eq!(cur2.peek_prev().get().unwrap().value, 2);
2644            assert_eq!(cur2.get().unwrap() as *const _, c.as_ref() as *const _);
2645            cur2.move_prev();
2646            assert_eq!(cur2.get().unwrap() as *const _, b.as_ref() as *const _);
2647            cur2.move_next();
2648            assert_eq!(cur2.get().unwrap() as *const _, c.as_ref() as *const _);
2649            cur2.move_next();
2650            assert!(cur2.is_null());
2651            assert!(cur2.clone().get().is_none());
2652        }
2653        assert_eq!(cur.get().unwrap() as *const _, a.as_ref() as *const _);
2654
2655        let a2 = make_rc_obj(1);
2656        let b2 = make_rc_obj(2);
2657        let c2 = make_rc_obj(3);
2658        assert_eq!(
2659            cur.replace_with(a2).unwrap().as_ref() as *const _,
2660            a.as_ref() as *const _
2661        );
2662        assert!(!a.link.is_linked());
2663        cur.move_next();
2664        assert_eq!(
2665            cur.replace_with(b2).unwrap().as_ref() as *const _,
2666            b.as_ref() as *const _
2667        );
2668        assert!(!b.link.is_linked());
2669        cur.move_next();
2670        assert_eq!(
2671            cur.replace_with(c2).unwrap().as_ref() as *const _,
2672            c.as_ref() as *const _
2673        );
2674        assert!(!c.link.is_linked());
2675        cur.move_next();
2676        assert_eq!(
2677            cur.replace_with(c.clone()).unwrap_err().as_ref() as *const _,
2678            c.as_ref() as *const _
2679        );
2680    }
2681
2682    #[test]
2683    fn test_cursor_owning() {
2684        struct Container {
2685            cur: CursorOwning<RcObjAdapter>,
2686        }
2687
2688        let mut t = RBTree::new(RcObjAdapter::new());
2689        t.insert(make_rc_obj(1));
2690        t.insert(make_rc_obj(2));
2691        t.insert(make_rc_obj(3));
2692        t.insert(make_rc_obj(4));
2693        let mut con = Container {
2694            cur: t.cursor_owning(),
2695        };
2696        assert!(con.cur.as_cursor().is_null());
2697
2698        con.cur = con.cur.into_inner().front_owning();
2699        assert_eq!(con.cur.as_cursor().get().unwrap().value, 1);
2700
2701        con.cur = con.cur.into_inner().back_owning();
2702        assert_eq!(con.cur.as_cursor().get().unwrap().value, 4);
2703
2704        con.cur = con.cur.into_inner().find_owning(&2);
2705        assert_eq!(con.cur.as_cursor().get().unwrap().value, 2);
2706
2707        con.cur.with_cursor_mut(|c| c.move_next());
2708        assert_eq!(con.cur.as_cursor().get().unwrap().value, 3);
2709    }
2710
2711    #[test]
2712    fn test_insert_remove() {
2713        let len = if cfg!(miri) { 10 } else { 100 };
2714        let v = (0..len).map(make_rc_obj).collect::<Vec<_>>();
2715        assert!(v.iter().all(|x| !x.link.is_linked()));
2716        let mut t = RBTree::new(RcObjAdapter::new());
2717        assert!(t.is_empty());
2718        let mut rng = XorShiftRng::seed_from_u64(0);
2719
2720        {
2721            let mut expected = Vec::new();
2722            for x in v.iter() {
2723                t.insert(x.clone());
2724                expected.push(x.value);
2725                assert_eq!(t.iter().map(|x| x.value).collect::<Vec<_>>(), expected);
2726            }
2727
2728            while let Some(x) = t.front_mut().remove() {
2729                assert_eq!(x.value, expected.remove(0));
2730                assert_eq!(t.iter().map(|x| x.value).collect::<Vec<_>>(), expected);
2731            }
2732            assert!(expected.is_empty());
2733            assert!(t.is_empty());
2734        }
2735
2736        {
2737            let mut expected = Vec::new();
2738            for x in v.iter().rev() {
2739                t.insert(x.clone());
2740                expected.insert(0, x.value);
2741                assert_eq!(t.iter().map(|x| x.value).collect::<Vec<_>>(), expected);
2742            }
2743
2744            while let Some(x) = t.back_mut().remove() {
2745                assert_eq!(x.value, expected.pop().unwrap());
2746                assert_eq!(t.iter().map(|x| x.value).collect::<Vec<_>>(), expected);
2747            }
2748            assert!(expected.is_empty());
2749            assert!(t.is_empty());
2750        }
2751
2752        {
2753            let mut indices = (0..v.len()).collect::<Vec<_>>();
2754            indices.shuffle(&mut rng);
2755            let mut expected = Vec::new();
2756            for i in indices {
2757                t.insert(v[i].clone());
2758                expected.push(v[i].value);
2759                expected[..].sort_unstable();
2760                assert_eq!(t.iter().map(|x| x.value).collect::<Vec<_>>(), expected);
2761            }
2762
2763            while !expected.is_empty() {
2764                {
2765                    let index = rng.gen_range(0..expected.len());
2766                    let mut c = t.cursor_mut();
2767                    for _ in 0..(index + 1) {
2768                        c.move_next();
2769                    }
2770                    assert_eq!(c.remove().unwrap().value, expected.remove(index));
2771                }
2772                assert_eq!(t.iter().map(|x| x.value).collect::<Vec<_>>(), expected);
2773            }
2774            assert!(t.is_empty());
2775        }
2776
2777        {
2778            let mut indices = (0..v.len()).collect::<Vec<_>>();
2779            indices.shuffle(&mut rng);
2780            let mut expected = Vec::new();
2781            for i in indices {
2782                {
2783                    let mut c = t.front_mut();
2784                    loop {
2785                        if let Some(x) = c.get() {
2786                            if x.value > v[i].value {
2787                                break;
2788                            }
2789                        } else {
2790                            break;
2791                        }
2792                        c.move_next();
2793                    }
2794                    c.insert_before(v[i].clone());
2795                }
2796                expected.push(v[i].value);
2797                expected[..].sort_unstable();
2798                assert_eq!(t.iter().map(|x| x.value).collect::<Vec<_>>(), expected);
2799            }
2800
2801            t.clear();
2802            assert!(t.is_empty());
2803        }
2804
2805        {
2806            let mut indices = (0..v.len()).collect::<Vec<_>>();
2807            indices.shuffle(&mut rng);
2808            let mut expected = Vec::new();
2809            for i in indices {
2810                {
2811                    let mut c = t.back_mut();
2812                    loop {
2813                        if let Some(x) = c.get() {
2814                            if x.value < v[i].value {
2815                                break;
2816                            }
2817                        } else {
2818                            break;
2819                        }
2820                        c.move_prev();
2821                    }
2822                    c.insert_after(v[i].clone());
2823                }
2824                expected.push(v[i].value);
2825                expected[..].sort_unstable();
2826                assert_eq!(t.iter().map(|x| x.value).collect::<Vec<_>>(), expected);
2827            }
2828        }
2829    }
2830
2831    #[test]
2832    fn test_iter() {
2833        let v = (0..10).map(|x| make_rc_obj(x * 10)).collect::<Vec<_>>();
2834        let mut t = RBTree::new(RcObjAdapter::new());
2835        for x in v.iter() {
2836            t.insert(x.clone());
2837        }
2838
2839        assert_eq!(
2840            format!("{:?}", t),
2841            "{0, 10, 20, 30, 40, 50, 60, 70, 80, 90}"
2842        );
2843
2844        assert_eq!(
2845            t.iter().clone().map(|x| x.value).collect::<Vec<_>>(),
2846            vec![0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
2847        );
2848        assert_eq!(
2849            (&t).into_iter().rev().map(|x| x.value).collect::<Vec<_>>(),
2850            vec![90, 80, 70, 60, 50, 40, 30, 20, 10, 0]
2851        );
2852        assert_eq!(
2853            t.range(Unbounded, Unbounded)
2854                .map(|x| x.value)
2855                .collect::<Vec<_>>(),
2856            vec![0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
2857        );
2858
2859        assert_eq!(
2860            t.range(Included(&0), Unbounded)
2861                .map(|x| x.value)
2862                .collect::<Vec<_>>(),
2863            vec![0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
2864        );
2865        assert_eq!(
2866            t.range(Excluded(&0), Unbounded)
2867                .map(|x| x.value)
2868                .collect::<Vec<_>>(),
2869            vec![10, 20, 30, 40, 50, 60, 70, 80, 90]
2870        );
2871        assert_eq!(
2872            t.range(Included(&25), Unbounded)
2873                .map(|x| x.value)
2874                .collect::<Vec<_>>(),
2875            vec![30, 40, 50, 60, 70, 80, 90]
2876        );
2877        assert_eq!(
2878            t.range(Excluded(&25), Unbounded)
2879                .map(|x| x.value)
2880                .collect::<Vec<_>>(),
2881            vec![30, 40, 50, 60, 70, 80, 90]
2882        );
2883        assert_eq!(
2884            t.range(Included(&70), Unbounded)
2885                .map(|x| x.value)
2886                .collect::<Vec<_>>(),
2887            vec![70, 80, 90]
2888        );
2889        assert_eq!(
2890            t.range(Excluded(&70), Unbounded)
2891                .map(|x| x.value)
2892                .collect::<Vec<_>>(),
2893            vec![80, 90]
2894        );
2895        assert_eq!(
2896            t.range(Included(&100), Unbounded)
2897                .map(|x| x.value)
2898                .collect::<Vec<_>>(),
2899            vec![]
2900        );
2901        assert_eq!(
2902            t.range(Excluded(&100), Unbounded)
2903                .map(|x| x.value)
2904                .collect::<Vec<_>>(),
2905            vec![]
2906        );
2907
2908        assert_eq!(
2909            t.range(Unbounded, Included(&90))
2910                .map(|x| x.value)
2911                .collect::<Vec<_>>(),
2912            vec![0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
2913        );
2914        assert_eq!(
2915            t.range(Unbounded, Excluded(&90))
2916                .map(|x| x.value)
2917                .collect::<Vec<_>>(),
2918            vec![0, 10, 20, 30, 40, 50, 60, 70, 80]
2919        );
2920        assert_eq!(
2921            t.range(Unbounded, Included(&25))
2922                .map(|x| x.value)
2923                .collect::<Vec<_>>(),
2924            vec![0, 10, 20]
2925        );
2926        assert_eq!(
2927            t.range(Unbounded, Excluded(&25))
2928                .map(|x| x.value)
2929                .collect::<Vec<_>>(),
2930            vec![0, 10, 20]
2931        );
2932        assert_eq!(
2933            t.range(Unbounded, Included(&70))
2934                .map(|x| x.value)
2935                .collect::<Vec<_>>(),
2936            vec![0, 10, 20, 30, 40, 50, 60, 70]
2937        );
2938        assert_eq!(
2939            t.range(Unbounded, Excluded(&70))
2940                .map(|x| x.value)
2941                .collect::<Vec<_>>(),
2942            vec![0, 10, 20, 30, 40, 50, 60]
2943        );
2944        assert_eq!(
2945            t.range(Unbounded, Included(&-1))
2946                .map(|x| x.value)
2947                .collect::<Vec<_>>(),
2948            vec![]
2949        );
2950        assert_eq!(
2951            t.range(Unbounded, Excluded(&-1))
2952                .map(|x| x.value)
2953                .collect::<Vec<_>>(),
2954            vec![]
2955        );
2956
2957        assert_eq!(
2958            t.range(Included(&25), Included(&80))
2959                .map(|x| x.value)
2960                .collect::<Vec<_>>(),
2961            vec![30, 40, 50, 60, 70, 80]
2962        );
2963        assert_eq!(
2964            t.range(Included(&25), Excluded(&80))
2965                .map(|x| x.value)
2966                .collect::<Vec<_>>(),
2967            vec![30, 40, 50, 60, 70]
2968        );
2969        assert_eq!(
2970            t.range(Excluded(&25), Included(&80))
2971                .map(|x| x.value)
2972                .collect::<Vec<_>>(),
2973            vec![30, 40, 50, 60, 70, 80]
2974        );
2975        assert_eq!(
2976            t.range(Excluded(&25), Excluded(&80))
2977                .map(|x| x.value)
2978                .collect::<Vec<_>>(),
2979            vec![30, 40, 50, 60, 70]
2980        );
2981
2982        assert_eq!(
2983            t.range(Included(&25), Included(&25))
2984                .map(|x| x.value)
2985                .collect::<Vec<_>>(),
2986            vec![]
2987        );
2988        assert_eq!(
2989            t.range(Included(&25), Excluded(&25))
2990                .map(|x| x.value)
2991                .collect::<Vec<_>>(),
2992            vec![]
2993        );
2994        assert_eq!(
2995            t.range(Excluded(&25), Included(&25))
2996                .map(|x| x.value)
2997                .collect::<Vec<_>>(),
2998            vec![]
2999        );
3000        assert_eq!(
3001            t.range(Excluded(&25), Excluded(&25))
3002                .map(|x| x.value)
3003                .collect::<Vec<_>>(),
3004            vec![]
3005        );
3006
3007        assert_eq!(
3008            t.range(Included(&50), Included(&50))
3009                .map(|x| x.value)
3010                .collect::<Vec<_>>(),
3011            vec![50]
3012        );
3013        assert_eq!(
3014            t.range(Included(&50), Excluded(&50))
3015                .map(|x| x.value)
3016                .collect::<Vec<_>>(),
3017            vec![]
3018        );
3019        assert_eq!(
3020            t.range(Excluded(&50), Included(&50))
3021                .map(|x| x.value)
3022                .collect::<Vec<_>>(),
3023            vec![]
3024        );
3025        assert_eq!(
3026            t.range(Excluded(&50), Excluded(&50))
3027                .map(|x| x.value)
3028                .collect::<Vec<_>>(),
3029            vec![]
3030        );
3031
3032        assert_eq!(
3033            t.range(Included(&100), Included(&-2))
3034                .map(|x| x.value)
3035                .collect::<Vec<_>>(),
3036            vec![]
3037        );
3038        assert_eq!(
3039            t.range(Included(&100), Excluded(&-2))
3040                .map(|x| x.value)
3041                .collect::<Vec<_>>(),
3042            vec![]
3043        );
3044        assert_eq!(
3045            t.range(Excluded(&100), Included(&-2))
3046                .map(|x| x.value)
3047                .collect::<Vec<_>>(),
3048            vec![]
3049        );
3050        assert_eq!(
3051            t.range(Excluded(&100), Excluded(&-2))
3052                .map(|x| x.value)
3053                .collect::<Vec<_>>(),
3054            vec![]
3055        );
3056
3057        let mut v2 = Vec::new();
3058        for x in t.take() {
3059            v2.push(x.value);
3060        }
3061        assert_eq!(v2, vec![0, 10, 20, 30, 40, 50, 60, 70, 80, 90]);
3062        assert!(t.is_empty());
3063        for _ in t.take() {
3064            unreachable!();
3065        }
3066
3067        for x in v.iter() {
3068            t.insert(x.clone());
3069        }
3070        v2.clear();
3071        for x in t.into_iter().rev() {
3072            v2.push(x.value);
3073        }
3074        assert_eq!(v2, vec![90, 80, 70, 60, 50, 40, 30, 20, 10, 0]);
3075    }
3076
3077    #[test]
3078    fn test_find() {
3079        let v = (0..10).map(|x| make_rc_obj(x * 10)).collect::<Vec<_>>();
3080        let mut t = RBTree::new(RcObjAdapter::new());
3081        for x in v.iter() {
3082            t.insert(x.clone());
3083        }
3084
3085        for i in -9..100 {
3086            fn mod10(x: i32) -> i32 {
3087                if x < 0 {
3088                    10 + x % 10
3089                } else {
3090                    x % 10
3091                }
3092            }
3093            {
3094                let c = t.find(&i);
3095                assert_eq!(
3096                    c.get().map(|x| x.value),
3097                    if i % 10 == 0 { Some(i) } else { None }
3098                );
3099            }
3100            {
3101                let c = t.find_mut(&i);
3102                assert_eq!(
3103                    c.get().map(|x| x.value),
3104                    if i % 10 == 0 { Some(i) } else { None }
3105                );
3106            }
3107            {
3108                let c = t.upper_bound(Unbounded);
3109                assert_eq!(c.get().map(|x| x.value), Some(90));
3110            }
3111            {
3112                let c = t.upper_bound_mut(Unbounded);
3113                assert_eq!(c.get().map(|x| x.value), Some(90));
3114            }
3115            {
3116                let c = t.upper_bound(Included(&i));
3117                assert_eq!(
3118                    c.get().map(|x| x.value),
3119                    if i >= 0 { Some(i - mod10(i)) } else { None }
3120                );
3121            }
3122            {
3123                let c = t.upper_bound_mut(Included(&i));
3124                assert_eq!(
3125                    c.get().map(|x| x.value),
3126                    if i >= 0 { Some(i - mod10(i)) } else { None }
3127                );
3128            }
3129            {
3130                let c = t.upper_bound(Excluded(&i));
3131                assert_eq!(
3132                    c.get().map(|x| x.value),
3133                    if i > 0 {
3134                        Some(i - 1 - mod10(i - 1))
3135                    } else {
3136                        None
3137                    }
3138                );
3139            }
3140            {
3141                let c = t.upper_bound_mut(Excluded(&i));
3142                assert_eq!(
3143                    c.get().map(|x| x.value),
3144                    if i > 0 {
3145                        Some(i - 1 - mod10(i - 1))
3146                    } else {
3147                        None
3148                    }
3149                );
3150            }
3151            {
3152                let c = t.lower_bound(Unbounded);
3153                assert_eq!(c.get().map(|x| x.value), Some(0));
3154            }
3155            {
3156                let c = t.lower_bound_mut(Unbounded);
3157                assert_eq!(c.get().map(|x| x.value), Some(0));
3158            }
3159            {
3160                let c = t.lower_bound(Included(&i));
3161                assert_eq!(
3162                    c.get().map(|x| x.value),
3163                    if i <= 90 {
3164                        Some((i + 9) - mod10(i + 9))
3165                    } else {
3166                        None
3167                    }
3168                );
3169            }
3170            {
3171                let c = t.lower_bound_mut(Included(&i));
3172                assert_eq!(
3173                    c.get().map(|x| x.value),
3174                    if i <= 90 {
3175                        Some((i + 9) - mod10(i + 9))
3176                    } else {
3177                        None
3178                    }
3179                );
3180            }
3181            {
3182                let c = t.lower_bound(Excluded(&i));
3183                assert_eq!(
3184                    c.get().map(|x| x.value),
3185                    if i < 90 {
3186                        Some((i + 10) - mod10(i + 10))
3187                    } else {
3188                        None
3189                    }
3190                );
3191            }
3192            {
3193                let c = t.lower_bound_mut(Excluded(&i));
3194                assert_eq!(
3195                    c.get().map(|x| x.value),
3196                    if i < 90 {
3197                        Some((i + 10) - mod10(i + 10))
3198                    } else {
3199                        None
3200                    }
3201                );
3202            }
3203        }
3204    }
3205
3206    #[test]
3207    fn test_fast_clear_force_unlink() {
3208        let mut t = RBTree::new(UnsafeRefObjAdapter::new());
3209        let a = UnsafeRef::from_box(Box::new(make_obj(1)));
3210        let b = UnsafeRef::from_box(Box::new(make_obj(2)));
3211        let c = UnsafeRef::from_box(Box::new(make_obj(3)));
3212        t.insert(a.clone());
3213        t.insert(b.clone());
3214        t.insert(c.clone());
3215
3216        t.fast_clear();
3217        assert!(t.is_empty());
3218
3219        unsafe {
3220            assert!(a.link.is_linked());
3221            assert!(b.link.is_linked());
3222            assert!(c.link.is_linked());
3223
3224            a.link.force_unlink();
3225            b.link.force_unlink();
3226            c.link.force_unlink();
3227
3228            assert!(t.is_empty());
3229
3230            assert!(!a.link.is_linked());
3231            assert!(!b.link.is_linked());
3232            assert!(!c.link.is_linked());
3233        }
3234
3235        unsafe {
3236            UnsafeRef::into_box(a);
3237            UnsafeRef::into_box(b);
3238            UnsafeRef::into_box(c);
3239        }
3240    }
3241
3242    #[test]
3243    fn test_entry() {
3244        let mut t = RBTree::new(RcObjAdapter::new());
3245        let a = make_rc_obj(1);
3246        let b = make_rc_obj(2);
3247        let c = make_rc_obj(3);
3248        let d = make_rc_obj(4);
3249        let e = make_rc_obj(5);
3250        let f = make_rc_obj(6);
3251        t.entry(&3).or_insert(c);
3252        t.entry(&2).or_insert(b.clone());
3253        t.entry(&1).or_insert(a);
3254
3255        match t.entry(&2) {
3256            Entry::Vacant(_) => unreachable!(),
3257            Entry::Occupied(c) => assert_eq!(c.get().unwrap().value, 2),
3258        }
3259        assert_eq!(t.entry(&2).or_insert(b.clone()).get().unwrap().value, 2);
3260        assert_eq!(
3261            t.entry(&2)
3262                .or_insert_with(|| b.clone())
3263                .get()
3264                .unwrap()
3265                .value,
3266            2
3267        );
3268
3269        match t.entry(&5) {
3270            Entry::Vacant(c) => assert_eq!(c.insert(e.clone()).get().unwrap().value, 5),
3271            Entry::Occupied(_) => unreachable!(),
3272        }
3273        assert!(e.link.is_linked());
3274        assert_eq!(t.entry(&4).or_insert(d.clone()).get().unwrap().value, 4);
3275        assert!(d.link.is_linked());
3276        assert_eq!(
3277            t.entry(&6)
3278                .or_insert_with(|| f.clone())
3279                .get()
3280                .unwrap()
3281                .value,
3282            6
3283        );
3284        assert!(f.link.is_linked());
3285    }
3286
3287    #[test]
3288    fn test_non_static() {
3289        #[derive(Clone)]
3290        struct Obj<'a, T> {
3291            link: Link,
3292            value: &'a T,
3293        }
3294        intrusive_adapter!(RcObjAdapter<'a, T> = &'a Obj<'a, T>: Obj<'a, T> {link: Link} where T: 'a);
3295        impl<'a, 'b, T: 'a + 'b> KeyAdapter<'a> for RcObjAdapter<'b, T> {
3296            type Key = &'a T;
3297            fn get_key(&self, value: &'a Obj<'b, T>) -> &'a T {
3298                value.value
3299            }
3300        }
3301
3302        let v = 5;
3303        let a = Obj {
3304            link: Link::default(),
3305            value: &v,
3306        };
3307        let b = a.clone();
3308        let mut l = RBTree::new(RcObjAdapter::new());
3309        l.insert(&a);
3310        l.insert(&b);
3311        assert_eq!(*l.front().get().unwrap().value, 5);
3312        assert_eq!(*l.back().get().unwrap().value, 5);
3313    }
3314
3315    macro_rules! test_clone_pointer {
3316        ($ptr: ident, $ptr_import: path) => {
3317            use $ptr_import;
3318
3319            #[derive(Clone)]
3320            struct Obj {
3321                link: Link,
3322                value: usize,
3323            }
3324            intrusive_adapter!(RcObjAdapter = $ptr<Obj>: Obj { link: Link });
3325            impl<'a> KeyAdapter<'a> for RcObjAdapter {
3326                type Key = usize;
3327                fn get_key(&self, value: &'a Obj) -> usize {
3328                    value.value
3329                }
3330            }
3331
3332            let a = $ptr::new(Obj {
3333                link: Link::new(),
3334                value: 5,
3335            });
3336            let mut l = RBTree::new(RcObjAdapter::new());
3337            l.insert(a.clone());
3338            assert_eq!(2, $ptr::strong_count(&a));
3339
3340            let pointer = l.front().clone_pointer().unwrap();
3341            assert_eq!(pointer.value, 5);
3342            assert_eq!(3, $ptr::strong_count(&a));
3343
3344            l.front_mut().remove();
3345            assert!(l.front().clone_pointer().is_none());
3346        };
3347    }
3348
3349    #[test]
3350    fn test_clone_pointer_rc() {
3351        test_clone_pointer!(Rc, std::rc::Rc);
3352    }
3353
3354    #[test]
3355    fn test_clone_pointer_arc() {
3356        test_clone_pointer!(Arc, std::sync::Arc);
3357    }
3358}