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 9 use crate::{alloc::Flags, bindings, container_of, error::Result, prelude::*}; 10 use 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. 171 pub 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. 178 unsafe 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. 182 unsafe impl<K: Sync, V: Sync> Sync for RBTree<K, V> {} 183 184 impl<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 270 impl<K, V> RBTree<K, V> 271 where 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 475 impl<K, V> Default for RBTree<K, V> { 476 fn default() -> Self { 477 Self::new() 478 } 479 } 480 481 impl<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`. 723 pub 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. 731 unsafe 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. 735 unsafe impl<'a, K: Sync, V: Sync> Sync for Cursor<'a, K, V> {} 736 737 impl<'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. 927 enum Direction { 928 /// the node immediately before, in sort order 929 Prev, 930 /// the node immediately after, in sort order 931 Next, 932 } 933 934 impl<'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`]. 946 pub 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. 953 unsafe 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. 957 unsafe impl<'a, K: Sync, V: Sync> Sync for Iter<'a, K, V> {} 958 959 impl<'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 968 impl<'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`]. 980 pub 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. 988 unsafe 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. 992 unsafe impl<'a, K: Sync, V: Sync> Sync for IterMut<'a, K, V> {} 993 994 impl<'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`. 1009 struct IterRaw<K, V> { 1010 next: *mut bindings::rb_node, 1011 _phantom: PhantomData<fn() -> (K, V)>, 1012 } 1013 1014 impl<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`]). 1039 pub struct RBTreeNodeReservation<K, V> { 1040 node: KBox<MaybeUninit<Node<K, V>>>, 1041 } 1042 1043 impl<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. 1055 unsafe 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. 1058 unsafe impl<K, V> Sync for RBTreeNodeReservation<K, V> {} 1059 1060 impl<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. 1081 pub struct RBTreeNode<K, V> { 1082 node: KBox<Node<K, V>>, 1083 } 1084 1085 impl<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. 1102 unsafe 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. 1106 unsafe impl<K: Sync, V: Sync> Sync for RBTreeNode<K, V> {} 1107 1108 impl<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 1128 pub 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. 1136 enum 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. 1142 pub 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`]. 1153 struct 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 1163 impl<'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 1188 impl<'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` 1199 pub 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 1205 impl<'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 1282 struct Node<K, V> { 1283 links: bindings::rb_node, 1284 key: K, 1285 value: V, 1286 } 1287