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