Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
   1// SPDX-License-Identifier: GPL-2.0
   2
   3//! Red-black trees.
   4//!
   5//! C header: [`include/linux/rbtree.h`](srctree/include/linux/rbtree.h)
   6//!
   7//! Reference: <https://docs.kernel.org/core-api/rbtree.html>
   8
   9use crate::{alloc::Flags, bindings, container_of, error::Result, prelude::*};
  10use core::{
  11    cmp::{Ord, Ordering},
  12    marker::PhantomData,
  13    mem::MaybeUninit,
  14    ptr::{addr_of_mut, from_mut, NonNull},
  15};
  16
  17/// A red-black tree with owned nodes.
  18///
  19/// It is backed by the kernel C red-black trees.
  20///
  21/// # Examples
  22///
  23/// In the example below we do several operations on a tree. We note that insertions may fail if
  24/// the system is out of memory.
  25///
  26/// ```
  27/// use kernel::{alloc::flags, rbtree::{RBTree, RBTreeNode, RBTreeNodeReservation}};
  28///
  29/// // Create a new tree.
  30/// let mut tree = RBTree::new();
  31///
  32/// // Insert three elements.
  33/// tree.try_create_and_insert(20, 200, flags::GFP_KERNEL)?;
  34/// tree.try_create_and_insert(10, 100, flags::GFP_KERNEL)?;
  35/// tree.try_create_and_insert(30, 300, flags::GFP_KERNEL)?;
  36///
  37/// // Check the nodes we just inserted.
  38/// {
  39///     assert_eq!(tree.get(&10).unwrap(), &100);
  40///     assert_eq!(tree.get(&20).unwrap(), &200);
  41///     assert_eq!(tree.get(&30).unwrap(), &300);
  42/// }
  43///
  44/// // Iterate over the nodes we just inserted.
  45/// {
  46///     let mut iter = tree.iter();
  47///     assert_eq!(iter.next().unwrap(), (&10, &100));
  48///     assert_eq!(iter.next().unwrap(), (&20, &200));
  49///     assert_eq!(iter.next().unwrap(), (&30, &300));
  50///     assert!(iter.next().is_none());
  51/// }
  52///
  53/// // Print all elements.
  54/// for (key, value) in &tree {
  55///     pr_info!("{} = {}\n", key, value);
  56/// }
  57///
  58/// // Replace one of the elements.
  59/// tree.try_create_and_insert(10, 1000, flags::GFP_KERNEL)?;
  60///
  61/// // Check that the tree reflects the replacement.
  62/// {
  63///     let mut iter = tree.iter();
  64///     assert_eq!(iter.next().unwrap(), (&10, &1000));
  65///     assert_eq!(iter.next().unwrap(), (&20, &200));
  66///     assert_eq!(iter.next().unwrap(), (&30, &300));
  67///     assert!(iter.next().is_none());
  68/// }
  69///
  70/// // Change the value of one of the elements.
  71/// *tree.get_mut(&30).unwrap() = 3000;
  72///
  73/// // Check that the tree reflects the update.
  74/// {
  75///     let mut iter = tree.iter();
  76///     assert_eq!(iter.next().unwrap(), (&10, &1000));
  77///     assert_eq!(iter.next().unwrap(), (&20, &200));
  78///     assert_eq!(iter.next().unwrap(), (&30, &3000));
  79///     assert!(iter.next().is_none());
  80/// }
  81///
  82/// // Remove an element.
  83/// tree.remove(&10);
  84///
  85/// // Check that the tree reflects the removal.
  86/// {
  87///     let mut iter = tree.iter();
  88///     assert_eq!(iter.next().unwrap(), (&20, &200));
  89///     assert_eq!(iter.next().unwrap(), (&30, &3000));
  90///     assert!(iter.next().is_none());
  91/// }
  92///
  93/// # Ok::<(), Error>(())
  94/// ```
  95///
  96/// In the example below, we first allocate a node, acquire a spinlock, then insert the node into
  97/// the tree. This is useful when the insertion context does not allow sleeping, for example, when
  98/// holding a spinlock.
  99///
 100/// ```
 101/// use kernel::{alloc::flags, rbtree::{RBTree, RBTreeNode}, sync::SpinLock};
 102///
 103/// fn insert_test(tree: &SpinLock<RBTree<u32, u32>>) -> Result {
 104///     // Pre-allocate node. This may fail (as it allocates memory).
 105///     let node = RBTreeNode::new(10, 100, flags::GFP_KERNEL)?;
 106///
 107///     // Insert node while holding the lock. It is guaranteed to succeed with no allocation
 108///     // attempts.
 109///     let mut guard = tree.lock();
 110///     guard.insert(node);
 111///     Ok(())
 112/// }
 113/// ```
 114///
 115/// In the example below, we reuse an existing node allocation from an element we removed.
 116///
 117/// ```
 118/// use kernel::{alloc::flags, rbtree::{RBTree, RBTreeNodeReservation}};
 119///
 120/// // Create a new tree.
 121/// let mut tree = RBTree::new();
 122///
 123/// // Insert three elements.
 124/// tree.try_create_and_insert(20, 200, flags::GFP_KERNEL)?;
 125/// tree.try_create_and_insert(10, 100, flags::GFP_KERNEL)?;
 126/// tree.try_create_and_insert(30, 300, flags::GFP_KERNEL)?;
 127///
 128/// // Check the nodes we just inserted.
 129/// {
 130///     let mut iter = tree.iter();
 131///     assert_eq!(iter.next().unwrap(), (&10, &100));
 132///     assert_eq!(iter.next().unwrap(), (&20, &200));
 133///     assert_eq!(iter.next().unwrap(), (&30, &300));
 134///     assert!(iter.next().is_none());
 135/// }
 136///
 137/// // Remove a node, getting back ownership of it.
 138/// let existing = tree.remove(&30).unwrap();
 139///
 140/// // Check that the tree reflects the removal.
 141/// {
 142///     let mut iter = tree.iter();
 143///     assert_eq!(iter.next().unwrap(), (&10, &100));
 144///     assert_eq!(iter.next().unwrap(), (&20, &200));
 145///     assert!(iter.next().is_none());
 146/// }
 147///
 148/// // Create a preallocated reservation that we can re-use later.
 149/// let reservation = RBTreeNodeReservation::new(flags::GFP_KERNEL)?;
 150///
 151/// // Insert a new node into the tree, reusing the previous allocation. This is guaranteed to
 152/// // succeed (no memory allocations).
 153/// tree.insert(reservation.into_node(15, 150));
 154///
 155/// // Check that the tree reflect the new insertion.
 156/// {
 157///     let mut iter = tree.iter();
 158///     assert_eq!(iter.next().unwrap(), (&10, &100));
 159///     assert_eq!(iter.next().unwrap(), (&15, &150));
 160///     assert_eq!(iter.next().unwrap(), (&20, &200));
 161///     assert!(iter.next().is_none());
 162/// }
 163///
 164/// # Ok::<(), Error>(())
 165/// ```
 166///
 167/// # Invariants
 168///
 169/// Non-null parent/children pointers stored in instances of the `rb_node` C struct are always
 170/// valid, and pointing to a field of our internal representation of a node.
 171pub struct RBTree<K, V> {
 172    root: bindings::rb_root,
 173    _p: PhantomData<Node<K, V>>,
 174}
 175
 176// SAFETY: An [`RBTree`] allows the same kinds of access to its values that a struct allows to its
 177// fields, so we use the same Send condition as would be used for a struct with K and V fields.
 178unsafe impl<K: Send, V: Send> Send for RBTree<K, V> {}
 179
 180// SAFETY: An [`RBTree`] allows the same kinds of access to its values that a struct allows to its
 181// fields, so we use the same Sync condition as would be used for a struct with K and V fields.
 182unsafe impl<K: Sync, V: Sync> Sync for RBTree<K, V> {}
 183
 184impl<K, V> RBTree<K, V> {
 185    /// Creates a new and empty tree.
 186    pub fn new() -> Self {
 187        Self {
 188            // INVARIANT: There are no nodes in the tree, so the invariant holds vacuously.
 189            root: bindings::rb_root::default(),
 190            _p: PhantomData,
 191        }
 192    }
 193
 194    /// Returns an iterator over the tree nodes, sorted by key.
 195    pub fn iter(&self) -> Iter<'_, K, V> {
 196        Iter {
 197            _tree: PhantomData,
 198            // INVARIANT:
 199            //   - `self.root` is a valid pointer to a tree root.
 200            //   - `bindings::rb_first` produces a valid pointer to a node given `root` is valid.
 201            iter_raw: IterRaw {
 202                // SAFETY: by the invariants, all pointers are valid.
 203                next: unsafe { bindings::rb_first(&self.root) },
 204                _phantom: PhantomData,
 205            },
 206        }
 207    }
 208
 209    /// Returns a mutable iterator over the tree nodes, sorted by key.
 210    pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
 211        IterMut {
 212            _tree: PhantomData,
 213            // INVARIANT:
 214            //   - `self.root` is a valid pointer to a tree root.
 215            //   - `bindings::rb_first` produces a valid pointer to a node given `root` is valid.
 216            iter_raw: IterRaw {
 217                // SAFETY: by the invariants, all pointers are valid.
 218                next: unsafe { bindings::rb_first(from_mut(&mut self.root)) },
 219                _phantom: PhantomData,
 220            },
 221        }
 222    }
 223
 224    /// Returns an iterator over the keys of the nodes in the tree, in sorted order.
 225    pub fn keys(&self) -> impl Iterator<Item = &'_ K> {
 226        self.iter().map(|(k, _)| k)
 227    }
 228
 229    /// Returns an iterator over the values of the nodes in the tree, sorted by key.
 230    pub fn values(&self) -> impl Iterator<Item = &'_ V> {
 231        self.iter().map(|(_, v)| v)
 232    }
 233
 234    /// Returns a mutable iterator over the values of the nodes in the tree, sorted by key.
 235    pub fn values_mut(&mut self) -> impl Iterator<Item = &'_ mut V> {
 236        self.iter_mut().map(|(_, v)| v)
 237    }
 238
 239    /// Returns a cursor over the tree nodes, starting with the smallest key.
 240    pub fn cursor_front(&mut self) -> Option<Cursor<'_, K, V>> {
 241        let root = addr_of_mut!(self.root);
 242        // SAFETY: `self.root` is always a valid root node
 243        let current = unsafe { bindings::rb_first(root) };
 244        NonNull::new(current).map(|current| {
 245            // INVARIANT:
 246            // - `current` is a valid node in the [`RBTree`] pointed to by `self`.
 247            Cursor {
 248                current,
 249                tree: self,
 250            }
 251        })
 252    }
 253
 254    /// Returns a cursor over the tree nodes, starting with the largest key.
 255    pub fn cursor_back(&mut self) -> Option<Cursor<'_, K, V>> {
 256        let root = addr_of_mut!(self.root);
 257        // SAFETY: `self.root` is always a valid root node
 258        let current = unsafe { bindings::rb_last(root) };
 259        NonNull::new(current).map(|current| {
 260            // INVARIANT:
 261            // - `current` is a valid node in the [`RBTree`] pointed to by `self`.
 262            Cursor {
 263                current,
 264                tree: self,
 265            }
 266        })
 267    }
 268}
 269
 270impl<K, V> RBTree<K, V>
 271where
 272    K: Ord,
 273{
 274    /// Tries to insert a new value into the tree.
 275    ///
 276    /// It overwrites a node if one already exists with the same key and returns it (containing the
 277    /// key/value pair). Returns [`None`] if a node with the same key didn't already exist.
 278    ///
 279    /// Returns an error if it cannot allocate memory for the new node.
 280    pub fn try_create_and_insert(
 281        &mut self,
 282        key: K,
 283        value: V,
 284        flags: Flags,
 285    ) -> Result<Option<RBTreeNode<K, V>>> {
 286        Ok(self.insert(RBTreeNode::new(key, value, flags)?))
 287    }
 288
 289    /// Inserts a new node into the tree.
 290    ///
 291    /// It overwrites a node if one already exists with the same key and returns it (containing the
 292    /// key/value pair). Returns [`None`] if a node with the same key didn't already exist.
 293    ///
 294    /// This function always succeeds.
 295    pub fn insert(&mut self, node: RBTreeNode<K, V>) -> Option<RBTreeNode<K, V>> {
 296        match self.raw_entry(&node.node.key) {
 297            RawEntry::Occupied(entry) => Some(entry.replace(node)),
 298            RawEntry::Vacant(entry) => {
 299                entry.insert(node);
 300                None
 301            }
 302        }
 303    }
 304
 305    fn raw_entry(&mut self, key: &K) -> RawEntry<'_, K, V> {
 306        let raw_self: *mut RBTree<K, V> = self;
 307        // The returned `RawEntry` is used to call either `rb_link_node` or `rb_replace_node`.
 308        // The parameters of `bindings::rb_link_node` are as follows:
 309        // - `node`: A pointer to an uninitialized node being inserted.
 310        // - `parent`: A pointer to an existing node in the tree. One of its child pointers must be
 311        //          null, and `node` will become a child of `parent` by replacing that child pointer
 312        //          with a pointer to `node`.
 313        // - `rb_link`: A pointer to either the left-child or right-child field of `parent`. This
 314        //          specifies which child of `parent` should hold `node` after this call. The
 315        //          value of `*rb_link` must be null before the call to `rb_link_node`. If the
 316        //          red/black tree is empty, then it’s also possible for `parent` to be null. In
 317        //          this case, `rb_link` is a pointer to the `root` field of the red/black tree.
 318        //
 319        // We will traverse the tree looking for a node that has a null pointer as its child,
 320        // representing an empty subtree where we can insert our new node. We need to make sure
 321        // that we preserve the ordering of the nodes in the tree. In each iteration of the loop
 322        // we store `parent` and `child_field_of_parent`, and the new `node` will go somewhere
 323        // in the subtree of `parent` that `child_field_of_parent` points at. Once
 324        // we find an empty subtree, we can insert the new node using `rb_link_node`.
 325        let mut parent = core::ptr::null_mut();
 326        let mut child_field_of_parent: &mut *mut bindings::rb_node =
 327            // SAFETY: `raw_self` is a valid pointer to the `RBTree` (created from `self` above).
 328            unsafe { &mut (*raw_self).root.rb_node };
 329        while !(*child_field_of_parent).is_null() {
 330            let curr = *child_field_of_parent;
 331            // SAFETY: All links fields we create are in a `Node<K, V>`.
 332            let node = unsafe { container_of!(curr, Node<K, V>, links) };
 333
 334            // SAFETY: `node` is a non-null node so it is valid by the type invariants.
 335            match key.cmp(unsafe { &(*node).key }) {
 336                // SAFETY: `curr` is a non-null node so it is valid by the type invariants.
 337                Ordering::Less => child_field_of_parent = unsafe { &mut (*curr).rb_left },
 338                // SAFETY: `curr` is a non-null node so it is valid by the type invariants.
 339                Ordering::Greater => child_field_of_parent = unsafe { &mut (*curr).rb_right },
 340                Ordering::Equal => {
 341                    return RawEntry::Occupied(OccupiedEntry {
 342                        rbtree: self,
 343                        node_links: curr,
 344                    })
 345                }
 346            }
 347            parent = curr;
 348        }
 349
 350        RawEntry::Vacant(RawVacantEntry {
 351            rbtree: raw_self,
 352            parent,
 353            child_field_of_parent,
 354            _phantom: PhantomData,
 355        })
 356    }
 357
 358    /// Gets the given key's corresponding entry in the map for in-place manipulation.
 359    pub fn entry(&mut self, key: K) -> Entry<'_, K, V> {
 360        match self.raw_entry(&key) {
 361            RawEntry::Occupied(entry) => Entry::Occupied(entry),
 362            RawEntry::Vacant(entry) => Entry::Vacant(VacantEntry { raw: entry, key }),
 363        }
 364    }
 365
 366    /// Used for accessing the given node, if it exists.
 367    pub fn find_mut(&mut self, key: &K) -> Option<OccupiedEntry<'_, K, V>> {
 368        match self.raw_entry(key) {
 369            RawEntry::Occupied(entry) => Some(entry),
 370            RawEntry::Vacant(_entry) => None,
 371        }
 372    }
 373
 374    /// Returns a reference to the value corresponding to the key.
 375    pub fn get(&self, key: &K) -> Option<&V> {
 376        let mut node = self.root.rb_node;
 377        while !node.is_null() {
 378            // SAFETY: By the type invariant of `Self`, all non-null `rb_node` pointers stored in `self`
 379            // point to the links field of `Node<K, V>` objects.
 380            let this = unsafe { container_of!(node, Node<K, V>, links) };
 381            // SAFETY: `this` is a non-null node so it is valid by the type invariants.
 382            node = match key.cmp(unsafe { &(*this).key }) {
 383                // SAFETY: `node` is a non-null node so it is valid by the type invariants.
 384                Ordering::Less => unsafe { (*node).rb_left },
 385                // SAFETY: `node` is a non-null node so it is valid by the type invariants.
 386                Ordering::Greater => unsafe { (*node).rb_right },
 387                // SAFETY: `node` is a non-null node so it is valid by the type invariants.
 388                Ordering::Equal => return Some(unsafe { &(*this).value }),
 389            }
 390        }
 391        None
 392    }
 393
 394    /// Returns a mutable reference to the value corresponding to the key.
 395    pub fn get_mut(&mut self, key: &K) -> Option<&mut V> {
 396        self.find_mut(key).map(|node| node.into_mut())
 397    }
 398
 399    /// Removes the node with the given key from the tree.
 400    ///
 401    /// It returns the node that was removed if one exists, or [`None`] otherwise.
 402    pub fn remove_node(&mut self, key: &K) -> Option<RBTreeNode<K, V>> {
 403        self.find_mut(key).map(OccupiedEntry::remove_node)
 404    }
 405
 406    /// Removes the node with the given key from the tree.
 407    ///
 408    /// It returns the value that was removed if one exists, or [`None`] otherwise.
 409    pub fn remove(&mut self, key: &K) -> Option<V> {
 410        self.find_mut(key).map(OccupiedEntry::remove)
 411    }
 412
 413    /// Returns a cursor over the tree nodes based on the given key.
 414    ///
 415    /// If the given key exists, the cursor starts there.
 416    /// Otherwise it starts with the first larger key in sort order.
 417    /// If there is no larger key, it returns [`None`].
 418    pub fn cursor_lower_bound(&mut self, key: &K) -> Option<Cursor<'_, K, V>>
 419    where
 420        K: Ord,
 421    {
 422        let mut node = self.root.rb_node;
 423        let mut best_match: Option<NonNull<Node<K, V>>> = None;
 424        while !node.is_null() {
 425            // SAFETY: By the type invariant of `Self`, all non-null `rb_node` pointers stored in `self`
 426            // point to the links field of `Node<K, V>` objects.
 427            let this = unsafe { container_of!(node, Node<K, V>, links) }.cast_mut();
 428            // SAFETY: `this` is a non-null node so it is valid by the type invariants.
 429            let this_key = unsafe { &(*this).key };
 430            // SAFETY: `node` is a non-null node so it is valid by the type invariants.
 431            let left_child = unsafe { (*node).rb_left };
 432            // SAFETY: `node` is a non-null node so it is valid by the type invariants.
 433            let right_child = unsafe { (*node).rb_right };
 434            match key.cmp(this_key) {
 435                Ordering::Equal => {
 436                    best_match = NonNull::new(this);
 437                    break;
 438                }
 439                Ordering::Greater => {
 440                    node = right_child;
 441                }
 442                Ordering::Less => {
 443                    let is_better_match = match best_match {
 444                        None => true,
 445                        Some(best) => {
 446                            // SAFETY: `best` is a non-null node so it is valid by the type invariants.
 447                            let best_key = unsafe { &(*best.as_ptr()).key };
 448                            best_key > this_key
 449                        }
 450                    };
 451                    if is_better_match {
 452                        best_match = NonNull::new(this);
 453                    }
 454                    node = left_child;
 455                }
 456            };
 457        }
 458
 459        let best = best_match?;
 460
 461        // SAFETY: `best` is a non-null node so it is valid by the type invariants.
 462        let links = unsafe { addr_of_mut!((*best.as_ptr()).links) };
 463
 464        NonNull::new(links).map(|current| {
 465            // INVARIANT:
 466            // - `current` is a valid node in the [`RBTree`] pointed to by `self`.
 467            Cursor {
 468                current,
 469                tree: self,
 470            }
 471        })
 472    }
 473}
 474
 475impl<K, V> Default for RBTree<K, V> {
 476    fn default() -> Self {
 477        Self::new()
 478    }
 479}
 480
 481impl<K, V> Drop for RBTree<K, V> {
 482    fn drop(&mut self) {
 483        // SAFETY: `root` is valid as it's embedded in `self` and we have a valid `self`.
 484        let mut next = unsafe { bindings::rb_first_postorder(&self.root) };
 485
 486        // INVARIANT: The loop invariant is that all tree nodes from `next` in postorder are valid.
 487        while !next.is_null() {
 488            // SAFETY: All links fields we create are in a `Node<K, V>`.
 489            let this = unsafe { container_of!(next, Node<K, V>, links) };
 490
 491            // Find out what the next node is before disposing of the current one.
 492            // SAFETY: `next` and all nodes in postorder are still valid.
 493            next = unsafe { bindings::rb_next_postorder(next) };
 494
 495            // INVARIANT: This is the destructor, so we break the type invariant during clean-up,
 496            // but it is not observable. The loop invariant is still maintained.
 497
 498            // SAFETY: `this` is valid per the loop invariant.
 499            unsafe { drop(KBox::from_raw(this.cast_mut())) };
 500        }
 501    }
 502}
 503
 504/// A bidirectional cursor over the tree nodes, sorted by key.
 505///
 506/// # Examples
 507///
 508/// In the following example, we obtain a cursor to the first element in the tree.
 509/// The cursor allows us to iterate bidirectionally over key/value pairs in the tree.
 510///
 511/// ```
 512/// use kernel::{alloc::flags, rbtree::RBTree};
 513///
 514/// // Create a new tree.
 515/// let mut tree = RBTree::new();
 516///
 517/// // Insert three elements.
 518/// tree.try_create_and_insert(10, 100, flags::GFP_KERNEL)?;
 519/// tree.try_create_and_insert(20, 200, flags::GFP_KERNEL)?;
 520/// tree.try_create_and_insert(30, 300, flags::GFP_KERNEL)?;
 521///
 522/// // Get a cursor to the first element.
 523/// let mut cursor = tree.cursor_front().unwrap();
 524/// let mut current = cursor.current();
 525/// assert_eq!(current, (&10, &100));
 526///
 527/// // Move the cursor, updating it to the 2nd element.
 528/// cursor = cursor.move_next().unwrap();
 529/// current = cursor.current();
 530/// assert_eq!(current, (&20, &200));
 531///
 532/// // Peek at the next element without impacting the cursor.
 533/// let next = cursor.peek_next().unwrap();
 534/// assert_eq!(next, (&30, &300));
 535/// current = cursor.current();
 536/// assert_eq!(current, (&20, &200));
 537///
 538/// // Moving past the last element causes the cursor to return [`None`].
 539/// cursor = cursor.move_next().unwrap();
 540/// current = cursor.current();
 541/// assert_eq!(current, (&30, &300));
 542/// let cursor = cursor.move_next();
 543/// assert!(cursor.is_none());
 544///
 545/// # Ok::<(), Error>(())
 546/// ```
 547///
 548/// A cursor can also be obtained at the last element in the tree.
 549///
 550/// ```
 551/// use kernel::{alloc::flags, rbtree::RBTree};
 552///
 553/// // Create a new tree.
 554/// let mut tree = RBTree::new();
 555///
 556/// // Insert three elements.
 557/// tree.try_create_and_insert(10, 100, flags::GFP_KERNEL)?;
 558/// tree.try_create_and_insert(20, 200, flags::GFP_KERNEL)?;
 559/// tree.try_create_and_insert(30, 300, flags::GFP_KERNEL)?;
 560///
 561/// let mut cursor = tree.cursor_back().unwrap();
 562/// let current = cursor.current();
 563/// assert_eq!(current, (&30, &300));
 564///
 565/// # Ok::<(), Error>(())
 566/// ```
 567///
 568/// Obtaining a cursor returns [`None`] if the tree is empty.
 569///
 570/// ```
 571/// use kernel::rbtree::RBTree;
 572///
 573/// let mut tree: RBTree<u16, u16> = RBTree::new();
 574/// assert!(tree.cursor_front().is_none());
 575///
 576/// # Ok::<(), Error>(())
 577/// ```
 578///
 579/// [`RBTree::cursor_lower_bound`] can be used to start at an arbitrary node in the tree.
 580///
 581/// ```
 582/// use kernel::{alloc::flags, rbtree::RBTree};
 583///
 584/// // Create a new tree.
 585/// let mut tree = RBTree::new();
 586///
 587/// // Insert five elements.
 588/// tree.try_create_and_insert(10, 100, flags::GFP_KERNEL)?;
 589/// tree.try_create_and_insert(20, 200, flags::GFP_KERNEL)?;
 590/// tree.try_create_and_insert(30, 300, flags::GFP_KERNEL)?;
 591/// tree.try_create_and_insert(40, 400, flags::GFP_KERNEL)?;
 592/// tree.try_create_and_insert(50, 500, flags::GFP_KERNEL)?;
 593///
 594/// // If the provided key exists, a cursor to that key is returned.
 595/// let cursor = tree.cursor_lower_bound(&20).unwrap();
 596/// let current = cursor.current();
 597/// assert_eq!(current, (&20, &200));
 598///
 599/// // If the provided key doesn't exist, a cursor to the first larger element in sort order is returned.
 600/// let cursor = tree.cursor_lower_bound(&25).unwrap();
 601/// let current = cursor.current();
 602/// assert_eq!(current, (&30, &300));
 603///
 604/// // If there is no larger key, [`None`] is returned.
 605/// let cursor = tree.cursor_lower_bound(&55);
 606/// assert!(cursor.is_none());
 607///
 608/// # Ok::<(), Error>(())
 609/// ```
 610///
 611/// The cursor allows mutation of values in the tree.
 612///
 613/// ```
 614/// use kernel::{alloc::flags, rbtree::RBTree};
 615///
 616/// // Create a new tree.
 617/// let mut tree = RBTree::new();
 618///
 619/// // Insert three elements.
 620/// tree.try_create_and_insert(10, 100, flags::GFP_KERNEL)?;
 621/// tree.try_create_and_insert(20, 200, flags::GFP_KERNEL)?;
 622/// tree.try_create_and_insert(30, 300, flags::GFP_KERNEL)?;
 623///
 624/// // Retrieve a cursor.
 625/// let mut cursor = tree.cursor_front().unwrap();
 626///
 627/// // Get a mutable reference to the current value.
 628/// let (k, v) = cursor.current_mut();
 629/// *v = 1000;
 630///
 631/// // The updated value is reflected in the tree.
 632/// let updated = tree.get(&10).unwrap();
 633/// assert_eq!(updated, &1000);
 634///
 635/// # Ok::<(), Error>(())
 636/// ```
 637///
 638/// It also allows node removal. The following examples demonstrate the behavior of removing the current node.
 639///
 640/// ```
 641/// use kernel::{alloc::flags, rbtree::RBTree};
 642///
 643/// // Create a new tree.
 644/// let mut tree = RBTree::new();
 645///
 646/// // Insert three elements.
 647/// tree.try_create_and_insert(10, 100, flags::GFP_KERNEL)?;
 648/// tree.try_create_and_insert(20, 200, flags::GFP_KERNEL)?;
 649/// tree.try_create_and_insert(30, 300, flags::GFP_KERNEL)?;
 650///
 651/// // Remove the first element.
 652/// let mut cursor = tree.cursor_front().unwrap();
 653/// let mut current = cursor.current();
 654/// assert_eq!(current, (&10, &100));
 655/// cursor = cursor.remove_current().0.unwrap();
 656///
 657/// // If a node exists after the current element, it is returned.
 658/// current = cursor.current();
 659/// assert_eq!(current, (&20, &200));
 660///
 661/// // Get a cursor to the last element, and remove it.
 662/// cursor = tree.cursor_back().unwrap();
 663/// current = cursor.current();
 664/// assert_eq!(current, (&30, &300));
 665///
 666/// // Since there is no next node, the previous node is returned.
 667/// cursor = cursor.remove_current().0.unwrap();
 668/// current = cursor.current();
 669/// assert_eq!(current, (&20, &200));
 670///
 671/// // Removing the last element in the tree returns [`None`].
 672/// assert!(cursor.remove_current().0.is_none());
 673///
 674/// # Ok::<(), Error>(())
 675/// ```
 676///
 677/// Nodes adjacent to the current node can also be removed.
 678///
 679/// ```
 680/// use kernel::{alloc::flags, rbtree::RBTree};
 681///
 682/// // Create a new tree.
 683/// let mut tree = RBTree::new();
 684///
 685/// // Insert three elements.
 686/// tree.try_create_and_insert(10, 100, flags::GFP_KERNEL)?;
 687/// tree.try_create_and_insert(20, 200, flags::GFP_KERNEL)?;
 688/// tree.try_create_and_insert(30, 300, flags::GFP_KERNEL)?;
 689///
 690/// // Get a cursor to the first element.
 691/// let mut cursor = tree.cursor_front().unwrap();
 692/// let mut current = cursor.current();
 693/// assert_eq!(current, (&10, &100));
 694///
 695/// // Calling `remove_prev` from the first element returns [`None`].
 696/// assert!(cursor.remove_prev().is_none());
 697///
 698/// // Get a cursor to the last element.
 699/// cursor = tree.cursor_back().unwrap();
 700/// current = cursor.current();
 701/// assert_eq!(current, (&30, &300));
 702///
 703/// // Calling `remove_prev` removes and returns the middle element.
 704/// assert_eq!(cursor.remove_prev().unwrap().to_key_value(), (20, 200));
 705///
 706/// // Calling `remove_next` from the last element returns [`None`].
 707/// assert!(cursor.remove_next().is_none());
 708///
 709/// // Move to the first element
 710/// cursor = cursor.move_prev().unwrap();
 711/// current = cursor.current();
 712/// assert_eq!(current, (&10, &100));
 713///
 714/// // Calling `remove_next` removes and returns the last element.
 715/// assert_eq!(cursor.remove_next().unwrap().to_key_value(), (30, 300));
 716///
 717/// # Ok::<(), Error>(())
 718///
 719/// ```
 720///
 721/// # Invariants
 722/// - `current` points to a node that is in the same [`RBTree`] as `tree`.
 723pub struct Cursor<'a, K, V> {
 724    tree: &'a mut RBTree<K, V>,
 725    current: NonNull<bindings::rb_node>,
 726}
 727
 728// SAFETY: The [`Cursor`] has exclusive access to both `K` and `V`, so it is sufficient to require them to be `Send`.
 729// The cursor only gives out immutable references to the keys, but since it has excusive access to those same
 730// keys, `Send` is sufficient. `Sync` would be okay, but it is more restrictive to the user.
 731unsafe impl<'a, K: Send, V: Send> Send for Cursor<'a, K, V> {}
 732
 733// SAFETY: The [`Cursor`] gives out immutable references to K and mutable references to V,
 734// so it has the same thread safety requirements as mutable references.
 735unsafe impl<'a, K: Sync, V: Sync> Sync for Cursor<'a, K, V> {}
 736
 737impl<'a, K, V> Cursor<'a, K, V> {
 738    /// The current node
 739    pub fn current(&self) -> (&K, &V) {
 740        // SAFETY:
 741        // - `self.current` is a valid node by the type invariants.
 742        // - We have an immutable reference by the function signature.
 743        unsafe { Self::to_key_value(self.current) }
 744    }
 745
 746    /// The current node, with a mutable value
 747    pub fn current_mut(&mut self) -> (&K, &mut V) {
 748        // SAFETY:
 749        // - `self.current` is a valid node by the type invariants.
 750        // - We have an mutable reference by the function signature.
 751        unsafe { Self::to_key_value_mut(self.current) }
 752    }
 753
 754    /// Remove the current node from the tree.
 755    ///
 756    /// Returns a tuple where the first element is a cursor to the next node, if it exists,
 757    /// else the previous node, else [`None`] (if the tree becomes empty). The second element
 758    /// is the removed node.
 759    pub fn remove_current(self) -> (Option<Self>, RBTreeNode<K, V>) {
 760        let prev = self.get_neighbor_raw(Direction::Prev);
 761        let next = self.get_neighbor_raw(Direction::Next);
 762        // SAFETY: By the type invariant of `Self`, all non-null `rb_node` pointers stored in `self`
 763        // point to the links field of `Node<K, V>` objects.
 764        let this = unsafe { container_of!(self.current.as_ptr(), Node<K, V>, links) }.cast_mut();
 765        // SAFETY: `this` is valid by the type invariants as described above.
 766        let node = unsafe { KBox::from_raw(this) };
 767        let node = RBTreeNode { node };
 768        // SAFETY: The reference to the tree used to create the cursor outlives the cursor, so
 769        // the tree cannot change. By the tree invariant, all nodes are valid.
 770        unsafe { bindings::rb_erase(&mut (*this).links, addr_of_mut!(self.tree.root)) };
 771
 772        let current = match (prev, next) {
 773            (_, Some(next)) => next,
 774            (Some(prev), None) => prev,
 775            (None, None) => {
 776                return (None, node);
 777            }
 778        };
 779
 780        (
 781            // INVARIANT:
 782            // - `current` is a valid node in the [`RBTree`] pointed to by `self.tree`.
 783            Some(Self {
 784                current,
 785                tree: self.tree,
 786            }),
 787            node,
 788        )
 789    }
 790
 791    /// Remove the previous node, returning it if it exists.
 792    pub fn remove_prev(&mut self) -> Option<RBTreeNode<K, V>> {
 793        self.remove_neighbor(Direction::Prev)
 794    }
 795
 796    /// Remove the next node, returning it if it exists.
 797    pub fn remove_next(&mut self) -> Option<RBTreeNode<K, V>> {
 798        self.remove_neighbor(Direction::Next)
 799    }
 800
 801    fn remove_neighbor(&mut self, direction: Direction) -> Option<RBTreeNode<K, V>> {
 802        if let Some(neighbor) = self.get_neighbor_raw(direction) {
 803            let neighbor = neighbor.as_ptr();
 804            // SAFETY: The reference to the tree used to create the cursor outlives the cursor, so
 805            // the tree cannot change. By the tree invariant, all nodes are valid.
 806            unsafe { bindings::rb_erase(neighbor, addr_of_mut!(self.tree.root)) };
 807            // SAFETY: By the type invariant of `Self`, all non-null `rb_node` pointers stored in `self`
 808            // point to the links field of `Node<K, V>` objects.
 809            let this = unsafe { container_of!(neighbor, Node<K, V>, links) }.cast_mut();
 810            // SAFETY: `this` is valid by the type invariants as described above.
 811            let node = unsafe { KBox::from_raw(this) };
 812            return Some(RBTreeNode { node });
 813        }
 814        None
 815    }
 816
 817    /// Move the cursor to the previous node, returning [`None`] if it doesn't exist.
 818    pub fn move_prev(self) -> Option<Self> {
 819        self.mv(Direction::Prev)
 820    }
 821
 822    /// Move the cursor to the next node, returning [`None`] if it doesn't exist.
 823    pub fn move_next(self) -> Option<Self> {
 824        self.mv(Direction::Next)
 825    }
 826
 827    fn mv(self, direction: Direction) -> Option<Self> {
 828        // INVARIANT:
 829        // - `neighbor` is a valid node in the [`RBTree`] pointed to by `self.tree`.
 830        self.get_neighbor_raw(direction).map(|neighbor| Self {
 831            tree: self.tree,
 832            current: neighbor,
 833        })
 834    }
 835
 836    /// Access the previous node without moving the cursor.
 837    pub fn peek_prev(&self) -> Option<(&K, &V)> {
 838        self.peek(Direction::Prev)
 839    }
 840
 841    /// Access the previous node without moving the cursor.
 842    pub fn peek_next(&self) -> Option<(&K, &V)> {
 843        self.peek(Direction::Next)
 844    }
 845
 846    fn peek(&self, direction: Direction) -> Option<(&K, &V)> {
 847        self.get_neighbor_raw(direction).map(|neighbor| {
 848            // SAFETY:
 849            // - `neighbor` is a valid tree node.
 850            // - By the function signature, we have an immutable reference to `self`.
 851            unsafe { Self::to_key_value(neighbor) }
 852        })
 853    }
 854
 855    /// Access the previous node mutably without moving the cursor.
 856    pub fn peek_prev_mut(&mut self) -> Option<(&K, &mut V)> {
 857        self.peek_mut(Direction::Prev)
 858    }
 859
 860    /// Access the next node mutably without moving the cursor.
 861    pub fn peek_next_mut(&mut self) -> Option<(&K, &mut V)> {
 862        self.peek_mut(Direction::Next)
 863    }
 864
 865    fn peek_mut(&mut self, direction: Direction) -> Option<(&K, &mut V)> {
 866        self.get_neighbor_raw(direction).map(|neighbor| {
 867            // SAFETY:
 868            // - `neighbor` is a valid tree node.
 869            // - By the function signature, we have a mutable reference to `self`.
 870            unsafe { Self::to_key_value_mut(neighbor) }
 871        })
 872    }
 873
 874    fn get_neighbor_raw(&self, direction: Direction) -> Option<NonNull<bindings::rb_node>> {
 875        // SAFETY: `self.current` is valid by the type invariants.
 876        let neighbor = unsafe {
 877            match direction {
 878                Direction::Prev => bindings::rb_prev(self.current.as_ptr()),
 879                Direction::Next => bindings::rb_next(self.current.as_ptr()),
 880            }
 881        };
 882
 883        NonNull::new(neighbor)
 884    }
 885
 886    /// # Safety
 887    ///
 888    /// - `node` must be a valid pointer to a node in an [`RBTree`].
 889    /// - The caller has immutable access to `node` for the duration of 'b.
 890    unsafe fn to_key_value<'b>(node: NonNull<bindings::rb_node>) -> (&'b K, &'b V) {
 891        // SAFETY: the caller guarantees that `node` is a valid pointer in an `RBTree`.
 892        let (k, v) = unsafe { Self::to_key_value_raw(node) };
 893        // SAFETY: the caller guarantees immutable access to `node`.
 894        (k, unsafe { &*v })
 895    }
 896
 897    /// # Safety
 898    ///
 899    /// - `node` must be a valid pointer to a node in an [`RBTree`].
 900    /// - The caller has mutable access to `node` for the duration of 'b.
 901    unsafe fn to_key_value_mut<'b>(node: NonNull<bindings::rb_node>) -> (&'b K, &'b mut V) {
 902        // SAFETY: the caller guarantees that `node` is a valid pointer in an `RBTree`.
 903        let (k, v) = unsafe { Self::to_key_value_raw(node) };
 904        // SAFETY: the caller guarantees mutable access to `node`.
 905        (k, unsafe { &mut *v })
 906    }
 907
 908    /// # Safety
 909    ///
 910    /// - `node` must be a valid pointer to a node in an [`RBTree`].
 911    /// - The caller has immutable access to the key for the duration of 'b.
 912    unsafe fn to_key_value_raw<'b>(node: NonNull<bindings::rb_node>) -> (&'b K, *mut V) {
 913        // SAFETY: By the type invariant of `Self`, all non-null `rb_node` pointers stored in `self`
 914        // point to the links field of `Node<K, V>` objects.
 915        let this = unsafe { container_of!(node.as_ptr(), Node<K, V>, links) }.cast_mut();
 916        // SAFETY: The passed `node` is the current node or a non-null neighbor,
 917        // thus `this` is valid by the type invariants.
 918        let k = unsafe { &(*this).key };
 919        // SAFETY: The passed `node` is the current node or a non-null neighbor,
 920        // thus `this` is valid by the type invariants.
 921        let v = unsafe { addr_of_mut!((*this).value) };
 922        (k, v)
 923    }
 924}
 925
 926/// Direction for [`Cursor`] operations.
 927enum Direction {
 928    /// the node immediately before, in sort order
 929    Prev,
 930    /// the node immediately after, in sort order
 931    Next,
 932}
 933
 934impl<'a, K, V> IntoIterator for &'a RBTree<K, V> {
 935    type Item = (&'a K, &'a V);
 936    type IntoIter = Iter<'a, K, V>;
 937
 938    fn into_iter(self) -> Self::IntoIter {
 939        self.iter()
 940    }
 941}
 942
 943/// An iterator over the nodes of a [`RBTree`].
 944///
 945/// Instances are created by calling [`RBTree::iter`].
 946pub struct Iter<'a, K, V> {
 947    _tree: PhantomData<&'a RBTree<K, V>>,
 948    iter_raw: IterRaw<K, V>,
 949}
 950
 951// SAFETY: The [`Iter`] gives out immutable references to K and V, so it has the same
 952// thread safety requirements as immutable references.
 953unsafe impl<'a, K: Sync, V: Sync> Send for Iter<'a, K, V> {}
 954
 955// SAFETY: The [`Iter`] gives out immutable references to K and V, so it has the same
 956// thread safety requirements as immutable references.
 957unsafe impl<'a, K: Sync, V: Sync> Sync for Iter<'a, K, V> {}
 958
 959impl<'a, K, V> Iterator for Iter<'a, K, V> {
 960    type Item = (&'a K, &'a V);
 961
 962    fn next(&mut self) -> Option<Self::Item> {
 963        // SAFETY: Due to `self._tree`, `k` and `v` are valid for the lifetime of `'a`.
 964        self.iter_raw.next().map(|(k, v)| unsafe { (&*k, &*v) })
 965    }
 966}
 967
 968impl<'a, K, V> IntoIterator for &'a mut RBTree<K, V> {
 969    type Item = (&'a K, &'a mut V);
 970    type IntoIter = IterMut<'a, K, V>;
 971
 972    fn into_iter(self) -> Self::IntoIter {
 973        self.iter_mut()
 974    }
 975}
 976
 977/// A mutable iterator over the nodes of a [`RBTree`].
 978///
 979/// Instances are created by calling [`RBTree::iter_mut`].
 980pub struct IterMut<'a, K, V> {
 981    _tree: PhantomData<&'a mut RBTree<K, V>>,
 982    iter_raw: IterRaw<K, V>,
 983}
 984
 985// SAFETY: The [`IterMut`] has exclusive access to both `K` and `V`, so it is sufficient to require them to be `Send`.
 986// The iterator only gives out immutable references to the keys, but since the iterator has excusive access to those same
 987// keys, `Send` is sufficient. `Sync` would be okay, but it is more restrictive to the user.
 988unsafe impl<'a, K: Send, V: Send> Send for IterMut<'a, K, V> {}
 989
 990// SAFETY: The [`IterMut`] gives out immutable references to K and mutable references to V, so it has the same
 991// thread safety requirements as mutable references.
 992unsafe impl<'a, K: Sync, V: Sync> Sync for IterMut<'a, K, V> {}
 993
 994impl<'a, K, V> Iterator for IterMut<'a, K, V> {
 995    type Item = (&'a K, &'a mut V);
 996
 997    fn next(&mut self) -> Option<Self::Item> {
 998        self.iter_raw.next().map(|(k, v)|
 999            // SAFETY: Due to `&mut self`, we have exclusive access to `k` and `v`, for the lifetime of `'a`.
1000            unsafe { (&*k, &mut *v) })
1001    }
1002}
1003
1004/// A raw iterator over the nodes of a [`RBTree`].
1005///
1006/// # Invariants
1007/// - `self.next` is a valid pointer.
1008/// - `self.next` points to a node stored inside of a valid `RBTree`.
1009struct IterRaw<K, V> {
1010    next: *mut bindings::rb_node,
1011    _phantom: PhantomData<fn() -> (K, V)>,
1012}
1013
1014impl<K, V> Iterator for IterRaw<K, V> {
1015    type Item = (*mut K, *mut V);
1016
1017    fn next(&mut self) -> Option<Self::Item> {
1018        if self.next.is_null() {
1019            return None;
1020        }
1021
1022        // SAFETY: By the type invariant of `IterRaw`, `self.next` is a valid node in an `RBTree`,
1023        // and by the type invariant of `RBTree`, all nodes point to the links field of `Node<K, V>` objects.
1024        let cur = unsafe { container_of!(self.next, Node<K, V>, links) }.cast_mut();
1025
1026        // SAFETY: `self.next` is a valid tree node by the type invariants.
1027        self.next = unsafe { bindings::rb_next(self.next) };
1028
1029        // SAFETY: By the same reasoning above, it is safe to dereference the node.
1030        Some(unsafe { (addr_of_mut!((*cur).key), addr_of_mut!((*cur).value)) })
1031    }
1032}
1033
1034/// A memory reservation for a red-black tree node.
1035///
1036///
1037/// It contains the memory needed to hold a node that can be inserted into a red-black tree. One
1038/// can be obtained by directly allocating it ([`RBTreeNodeReservation::new`]).
1039pub struct RBTreeNodeReservation<K, V> {
1040    node: KBox<MaybeUninit<Node<K, V>>>,
1041}
1042
1043impl<K, V> RBTreeNodeReservation<K, V> {
1044    /// Allocates memory for a node to be eventually initialised and inserted into the tree via a
1045    /// call to [`RBTree::insert`].
1046    pub fn new(flags: Flags) -> Result<RBTreeNodeReservation<K, V>> {
1047        Ok(RBTreeNodeReservation {
1048            node: KBox::new_uninit(flags)?,
1049        })
1050    }
1051}
1052
1053// SAFETY: This doesn't actually contain K or V, and is just a memory allocation. Those can always
1054// be moved across threads.
1055unsafe impl<K, V> Send for RBTreeNodeReservation<K, V> {}
1056
1057// SAFETY: This doesn't actually contain K or V, and is just a memory allocation.
1058unsafe impl<K, V> Sync for RBTreeNodeReservation<K, V> {}
1059
1060impl<K, V> RBTreeNodeReservation<K, V> {
1061    /// Initialises a node reservation.
1062    ///
1063    /// It then becomes an [`RBTreeNode`] that can be inserted into a tree.
1064    pub fn into_node(self, key: K, value: V) -> RBTreeNode<K, V> {
1065        let node = KBox::write(
1066            self.node,
1067            Node {
1068                key,
1069                value,
1070                links: bindings::rb_node::default(),
1071            },
1072        );
1073        RBTreeNode { node }
1074    }
1075}
1076
1077/// A red-black tree node.
1078///
1079/// The node is fully initialised (with key and value) and can be inserted into a tree without any
1080/// extra allocations or failure paths.
1081pub struct RBTreeNode<K, V> {
1082    node: KBox<Node<K, V>>,
1083}
1084
1085impl<K, V> RBTreeNode<K, V> {
1086    /// Allocates and initialises a node that can be inserted into the tree via
1087    /// [`RBTree::insert`].
1088    pub fn new(key: K, value: V, flags: Flags) -> Result<RBTreeNode<K, V>> {
1089        Ok(RBTreeNodeReservation::new(flags)?.into_node(key, value))
1090    }
1091
1092    /// Get the key and value from inside the node.
1093    pub fn to_key_value(self) -> (K, V) {
1094        let node = KBox::into_inner(self.node);
1095
1096        (node.key, node.value)
1097    }
1098}
1099
1100// SAFETY: If K and V can be sent across threads, then it's also okay to send [`RBTreeNode`] across
1101// threads.
1102unsafe impl<K: Send, V: Send> Send for RBTreeNode<K, V> {}
1103
1104// SAFETY: If K and V can be accessed without synchronization, then it's also okay to access
1105// [`RBTreeNode`] without synchronization.
1106unsafe impl<K: Sync, V: Sync> Sync for RBTreeNode<K, V> {}
1107
1108impl<K, V> RBTreeNode<K, V> {
1109    /// Drop the key and value, but keep the allocation.
1110    ///
1111    /// It then becomes a reservation that can be re-initialised into a different node (i.e., with
1112    /// a different key and/or value).
1113    ///
1114    /// The existing key and value are dropped in-place as part of this operation, that is, memory
1115    /// may be freed (but only for the key/value; memory for the node itself is kept for reuse).
1116    pub fn into_reservation(self) -> RBTreeNodeReservation<K, V> {
1117        RBTreeNodeReservation {
1118            node: KBox::drop_contents(self.node),
1119        }
1120    }
1121}
1122
1123/// A view into a single entry in a map, which may either be vacant or occupied.
1124///
1125/// This enum is constructed from the [`RBTree::entry`].
1126///
1127/// [`entry`]: fn@RBTree::entry
1128pub enum Entry<'a, K, V> {
1129    /// This [`RBTree`] does not have a node with this key.
1130    Vacant(VacantEntry<'a, K, V>),
1131    /// This [`RBTree`] already has a node with this key.
1132    Occupied(OccupiedEntry<'a, K, V>),
1133}
1134
1135/// Like [`Entry`], except that it doesn't have ownership of the key.
1136enum RawEntry<'a, K, V> {
1137    Vacant(RawVacantEntry<'a, K, V>),
1138    Occupied(OccupiedEntry<'a, K, V>),
1139}
1140
1141/// A view into a vacant entry in a [`RBTree`]. It is part of the [`Entry`] enum.
1142pub struct VacantEntry<'a, K, V> {
1143    key: K,
1144    raw: RawVacantEntry<'a, K, V>,
1145}
1146
1147/// Like [`VacantEntry`], but doesn't hold on to the key.
1148///
1149/// # Invariants
1150/// - `parent` may be null if the new node becomes the root.
1151/// - `child_field_of_parent` is a valid pointer to the left-child or right-child of `parent`. If `parent` is
1152///   null, it is a pointer to the root of the [`RBTree`].
1153struct RawVacantEntry<'a, K, V> {
1154    rbtree: *mut RBTree<K, V>,
1155    /// The node that will become the parent of the new node if we insert one.
1156    parent: *mut bindings::rb_node,
1157    /// This points to the left-child or right-child field of `parent`, or `root` if `parent` is
1158    /// null.
1159    child_field_of_parent: *mut *mut bindings::rb_node,
1160    _phantom: PhantomData<&'a mut RBTree<K, V>>,
1161}
1162
1163impl<'a, K, V> RawVacantEntry<'a, K, V> {
1164    /// Inserts the given node into the [`RBTree`] at this entry.
1165    ///
1166    /// The `node` must have a key such that inserting it here does not break the ordering of this
1167    /// [`RBTree`].
1168    fn insert(self, node: RBTreeNode<K, V>) -> &'a mut V {
1169        let node = KBox::into_raw(node.node);
1170
1171        // SAFETY: `node` is valid at least until we call `Box::from_raw`, which only happens when
1172        // the node is removed or replaced.
1173        let node_links = unsafe { addr_of_mut!((*node).links) };
1174
1175        // INVARIANT: We are linking in a new node, which is valid. It remains valid because we
1176        // "forgot" it with `Box::into_raw`.
1177        // SAFETY: The type invariants of `RawVacantEntry` are exactly the safety requirements of `rb_link_node`.
1178        unsafe { bindings::rb_link_node(node_links, self.parent, self.child_field_of_parent) };
1179
1180        // SAFETY: All pointers are valid. `node` has just been inserted into the tree.
1181        unsafe { bindings::rb_insert_color(node_links, addr_of_mut!((*self.rbtree).root)) };
1182
1183        // SAFETY: The node is valid until we remove it from the tree.
1184        unsafe { &mut (*node).value }
1185    }
1186}
1187
1188impl<'a, K, V> VacantEntry<'a, K, V> {
1189    /// Inserts the given node into the [`RBTree`] at this entry.
1190    pub fn insert(self, value: V, reservation: RBTreeNodeReservation<K, V>) -> &'a mut V {
1191        self.raw.insert(reservation.into_node(self.key, value))
1192    }
1193}
1194
1195/// A view into an occupied entry in a [`RBTree`]. It is part of the [`Entry`] enum.
1196///
1197/// # Invariants
1198/// - `node_links` is a valid, non-null pointer to a tree node in `self.rbtree`
1199pub struct OccupiedEntry<'a, K, V> {
1200    rbtree: &'a mut RBTree<K, V>,
1201    /// The node that this entry corresponds to.
1202    node_links: *mut bindings::rb_node,
1203}
1204
1205impl<'a, K, V> OccupiedEntry<'a, K, V> {
1206    /// Gets a reference to the value in the entry.
1207    pub fn get(&self) -> &V {
1208        // SAFETY:
1209        // - `self.node_links` is a valid pointer to a node in the tree.
1210        // - We have shared access to the underlying tree, and can thus give out a shared reference.
1211        unsafe { &(*container_of!(self.node_links, Node<K, V>, links)).value }
1212    }
1213
1214    /// Gets a mutable reference to the value in the entry.
1215    pub fn get_mut(&mut self) -> &mut V {
1216        // SAFETY:
1217        // - `self.node_links` is a valid pointer to a node in the tree.
1218        // - We have exclusive access to the underlying tree, and can thus give out a mutable reference.
1219        unsafe { &mut (*(container_of!(self.node_links, Node<K, V>, links).cast_mut())).value }
1220    }
1221
1222    /// Converts the entry into a mutable reference to its value.
1223    ///
1224    /// If you need multiple references to the `OccupiedEntry`, see [`self#get_mut`].
1225    pub fn into_mut(self) -> &'a mut V {
1226        // SAFETY:
1227        // - `self.node_links` is a valid pointer to a node in the tree.
1228        // - This consumes the `&'a mut RBTree<K, V>`, therefore it can give out a mutable reference that lives for `'a`.
1229        unsafe { &mut (*(container_of!(self.node_links, Node<K, V>, links).cast_mut())).value }
1230    }
1231
1232    /// Remove this entry from the [`RBTree`].
1233    pub fn remove_node(self) -> RBTreeNode<K, V> {
1234        // SAFETY: The node is a node in the tree, so it is valid.
1235        unsafe { bindings::rb_erase(self.node_links, &mut self.rbtree.root) };
1236
1237        // INVARIANT: The node is being returned and the caller may free it, however, it was
1238        // removed from the tree. So the invariants still hold.
1239        RBTreeNode {
1240            // SAFETY: The node was a node in the tree, but we removed it, so we can convert it
1241            // back into a box.
1242            node: unsafe {
1243                KBox::from_raw(container_of!(self.node_links, Node<K, V>, links).cast_mut())
1244            },
1245        }
1246    }
1247
1248    /// Takes the value of the entry out of the map, and returns it.
1249    pub fn remove(self) -> V {
1250        let rb_node = self.remove_node();
1251        let node = KBox::into_inner(rb_node.node);
1252
1253        node.value
1254    }
1255
1256    /// Swap the current node for the provided node.
1257    ///
1258    /// The key of both nodes must be equal.
1259    fn replace(self, node: RBTreeNode<K, V>) -> RBTreeNode<K, V> {
1260        let node = KBox::into_raw(node.node);
1261
1262        // SAFETY: `node` is valid at least until we call `Box::from_raw`, which only happens when
1263        // the node is removed or replaced.
1264        let new_node_links = unsafe { addr_of_mut!((*node).links) };
1265
1266        // SAFETY: This updates the pointers so that `new_node_links` is in the tree where
1267        // `self.node_links` used to be.
1268        unsafe {
1269            bindings::rb_replace_node(self.node_links, new_node_links, &mut self.rbtree.root)
1270        };
1271
1272        // SAFETY:
1273        // - `self.node_ptr` produces a valid pointer to a node in the tree.
1274        // - Now that we removed this entry from the tree, we can convert the node to a box.
1275        let old_node =
1276            unsafe { KBox::from_raw(container_of!(self.node_links, Node<K, V>, links).cast_mut()) };
1277
1278        RBTreeNode { node: old_node }
1279    }
1280}
1281
1282struct Node<K, V> {
1283    links: bindings::rb_node,
1284    key: K,
1285    value: V,
1286}