Skip to main content

alloc/collections/btree/
node.rs

1// This is an attempt at an implementation following the ideal
2//
3// ```
4// struct BTreeMap<K, V> {
5//     height: usize,
6//     root: Option<Box<Node<K, V, height>>>
7// }
8//
9// struct Node<K, V, height: usize> {
10//     keys: [K; 2 * B - 1],
11//     vals: [V; 2 * B - 1],
12//     edges: [if height > 0 { Box<Node<K, V, height - 1>> } else { () }; 2 * B],
13//     parent: Option<(NonNull<Node<K, V, height + 1>>, u16)>,
14//     len: u16,
15// }
16// ```
17//
18// Since Rust doesn't actually have dependent types and polymorphic recursion,
19// we make do with lots of unsafety.
20
21// A major goal of this module is to avoid complexity by treating the tree as a generic (if
22// weirdly shaped) container and avoiding dealing with most of the B-Tree invariants. As such,
23// this module doesn't care whether the entries are sorted, which nodes can be underfull, or
24// even what underfull means. However, we do rely on a few invariants:
25//
26// - Trees must have uniform depth/height. This means that every path down to a leaf from a
27//   given node has exactly the same length.
28// - A node of length `n` has `n` keys, `n` values, and `n + 1` edges.
29//   This implies that even an empty node has at least one edge.
30//   For a leaf node, "having an edge" only means we can identify a position in the node,
31//   since leaf edges are empty and need no data representation. In an internal node,
32//   an edge both identifies a position and contains a pointer to a child node.
33
34use core::marker::PhantomData;
35use core::mem::{self, MaybeUninit};
36use core::num::NonZero;
37use core::ptr::{self, NonNull};
38use core::slice::SliceIndex;
39
40use crate::alloc::{Allocator, AllocatorClone, Layout};
41use crate::boxed::Box;
42
43const B: usize = 6;
44pub(super) const CAPACITY: usize = 2 * B - 1;
45pub(super) const MIN_LEN_AFTER_SPLIT: usize = B - 1;
46const KV_IDX_CENTER: usize = B - 1;
47const EDGE_IDX_LEFT_OF_CENTER: usize = B - 1;
48const EDGE_IDX_RIGHT_OF_CENTER: usize = B;
49
50/// The underlying representation of leaf nodes and part of the representation of internal nodes.
51struct LeafNode<K, V> {
52    /// We want to be covariant in `K` and `V`.
53    parent: Option<NonNull<InternalNode<K, V>>>,
54
55    /// This node's index into the parent node's `edges` array.
56    /// `*node.parent.edges[node.parent_idx]` should be the same thing as `node`.
57    /// This is only guaranteed to be initialized when `parent` is non-null.
58    parent_idx: MaybeUninit<u16>,
59
60    /// The number of keys and values this node stores.
61    len: u16,
62
63    /// The arrays storing the actual data of the node. Only the first `len` elements of each
64    /// array are initialized and valid.
65    keys: [MaybeUninit<K>; CAPACITY],
66    vals: [MaybeUninit<V>; CAPACITY],
67}
68
69impl<K, V> LeafNode<K, V> {
70    /// Initializes a new `LeafNode` in-place.
71    ///
72    /// # Safety
73    ///
74    /// The caller must ensure that `this` points to a (possibly uninitialized) `LeafNode`
75    unsafe fn init(this: *mut Self) {
76        // As a general policy, we leave fields uninitialized if they can be, as this should
77        // be both slightly faster and easier to track in Valgrind.
78        // ignore-tidy-undocumented-unsafe
79        unsafe {
80            // parent_idx, keys, and vals are all MaybeUninit
81            (&raw mut (*this).parent).write(None);
82            (&raw mut (*this).len).write(0);
83        }
84    }
85
86    /// Creates a new boxed `LeafNode`.
87    fn new<A: AllocatorClone>(alloc: A) -> Box<Self, A> {
88        let mut leaf = Box::new_uninit_in(alloc);
89
90        // SAFETY: `leaf` points to a `LeafNode`.
91        unsafe { LeafNode::init(leaf.as_mut_ptr()) };
92        // SAFETY: `leaf` was just initialized.
93        unsafe { leaf.assume_init() }
94    }
95}
96
97/// The underlying representation of internal nodes. As with `LeafNode`s, these should be hidden
98/// behind `BoxedNode`s to prevent dropping uninitialized keys and values. Any pointer to an
99/// `InternalNode` can be directly cast to a pointer to the underlying `LeafNode` portion of the
100/// node, allowing code to act on leaf and internal nodes generically without having to even check
101/// which of the two a pointer is pointing at. This property is enabled by the use of `repr(C)`.
102#[repr(C)]
103// gdb_providers.py uses this type name for introspection.
104struct InternalNode<K, V> {
105    data: LeafNode<K, V>,
106
107    /// The pointers to the children of this node. `len + 1` of these are considered
108    /// initialized and valid, except that near the end, while the tree is held
109    /// through borrow type `Dying`, some of these pointers are dangling.
110    edges: [MaybeUninit<BoxedNode<K, V>>; 2 * B],
111}
112
113impl<K, V> InternalNode<K, V> {
114    /// Creates a new boxed `InternalNode`.
115    ///
116    /// # Safety
117    /// An invariant of internal nodes is that they have at least one
118    /// initialized and valid edge. This function does not set up
119    /// such an edge.
120    unsafe fn new<A: AllocatorClone>(alloc: A) -> Box<Self, A> {
121        let mut node = Box::<Self, _>::new_uninit_in(alloc);
122
123        // SAFETY: argument points to the `node.data` `LeafNode`.
124        unsafe { LeafNode::init(&raw mut (*node.as_mut_ptr()).data) };
125        // SAFETY: `node.data` was just initialized and `node.edges` is MaybeUninit.
126        unsafe { node.assume_init() }
127    }
128}
129
130/// A managed, non-null pointer to a node. This is either an owned pointer to
131/// `LeafNode<K, V>` or an owned pointer to `InternalNode<K, V>`.
132///
133/// However, `BoxedNode` contains no information as to which of the two types
134/// of nodes it actually contains, and, partially due to this lack of information,
135/// is not a separate type and has no destructor.
136type BoxedNode<K, V> = NonNull<LeafNode<K, V>>;
137
138// N.B. `NodeRef` is always covariant in `K` and `V`, even when the `BorrowType`
139// is `Mut`. This is technically wrong, but cannot result in any unsafety due to
140// internal use of `NodeRef` because we stay completely generic over `K` and `V`.
141// However, whenever a public type wraps `NodeRef`, make sure that it has the
142// correct variance.
143///
144/// A reference to a node.
145///
146/// This type has a number of parameters that control how it acts:
147/// - `BorrowType`: A dummy type that describes the kind of borrow and carries a lifetime.
148///    - When this is `Immut<'a>`, the `NodeRef` acts roughly like `&'a Node`.
149///    - When this is `ValMut<'a>`, the `NodeRef` acts roughly like `&'a Node`
150///      with respect to keys and tree structure, but also allows many
151///      mutable references to values throughout the tree to coexist.
152///    - When this is `Mut<'a>`, the `NodeRef` acts roughly like `&'a mut Node`,
153///      although insert methods allow a mutable pointer to a value to coexist.
154///    - When this is `Owned`, the `NodeRef` acts roughly like `Box<Node>`,
155///      but does not have a destructor, and must be cleaned up manually.
156///    - When this is `Dying`, the `NodeRef` still acts roughly like `Box<Node>`,
157///      but has methods to destroy the tree bit by bit, and ordinary methods,
158///      while not marked as unsafe to call, can invoke UB if called incorrectly.
159///   Since any `NodeRef` allows navigating through the tree, `BorrowType`
160///   effectively applies to the entire tree, not just to the node itself.
161/// - `K` and `V`: These are the types of keys and values stored in the nodes.
162/// - `Type`: This can be `Leaf`, `Internal`, or `LeafOrInternal`. When this is
163///   `Leaf`, the `NodeRef` points to a leaf node, when this is `Internal` the
164///   `NodeRef` points to an internal node, and when this is `LeafOrInternal` the
165///   `NodeRef` could be pointing to either type of node.
166///   `Type` is named `NodeType` when used outside `NodeRef`.
167///
168/// Both `BorrowType` and `NodeType` restrict what methods we implement, to
169/// exploit static type safety. There are limitations in the way we can apply
170/// such restrictions:
171/// - For each type parameter, we can only define a method either generically
172///   or for one particular type. For example, we cannot define a method like
173///   `into_kv` generically for all `BorrowType`, or once for all types that
174///   carry a lifetime, because we want it to return `&'a` references.
175///   Therefore, we define it only for the least powerful type `Immut<'a>`.
176/// - We cannot get implicit coercion from say `Mut<'a>` to `Immut<'a>`.
177///   Therefore, we have to explicitly call `reborrow` on a more powerful
178///   `NodeRef` in order to reach a method like `into_kv`.
179///
180/// All methods on `NodeRef` that return some kind of reference, either:
181/// - Take `self` by value, and return the lifetime carried by `BorrowType`.
182///   Sometimes, to invoke such a method, we need to call `reborrow_mut`.
183/// - Take `self` by reference, and (implicitly) return that reference's
184///   lifetime, instead of the lifetime carried by `BorrowType`. That way,
185///   the borrow checker guarantees that the `NodeRef` remains borrowed as long
186///   as the returned reference is used.
187///   The methods supporting insert bend this rule by returning a raw pointer,
188///   i.e., a reference without any lifetime.
189pub(super) struct NodeRef<BorrowType, K, V, Type> {
190    /// The number of levels that the node and the level of leaves are apart, a
191    /// constant of the node that cannot be entirely described by `Type`, and that
192    /// the node itself does not store. We only need to store the height of the root
193    /// node, and derive every other node's height from it.
194    /// Must be zero if `Type` is `Leaf` and non-zero if `Type` is `Internal`.
195    height: usize,
196    /// The pointer to the leaf or internal node. The definition of `InternalNode`
197    /// ensures that the pointer is valid either way.
198    node: NonNull<LeafNode<K, V>>,
199    _marker: PhantomData<(BorrowType, Type)>,
200}
201
202/// The root node of an owned tree.
203///
204/// Note that this does not have a destructor, and must be cleaned up manually.
205pub(super) type Root<K, V> = NodeRef<marker::Owned, K, V, marker::LeafOrInternal>;
206
207impl<'a, K: 'a, V: 'a, Type> Copy for NodeRef<marker::Immut<'a>, K, V, Type> {}
208impl<'a, K: 'a, V: 'a, Type> Clone for NodeRef<marker::Immut<'a>, K, V, Type> {
209    fn clone(&self) -> Self {
210        *self
211    }
212}
213
214unsafe impl<BorrowType, K: Sync, V: Sync, Type> Sync for NodeRef<BorrowType, K, V, Type> {}
215
216unsafe impl<K: Sync, V: Sync, Type> Send for NodeRef<marker::Immut<'_>, K, V, Type> {}
217unsafe impl<K: Send, V: Send, Type> Send for NodeRef<marker::Mut<'_>, K, V, Type> {}
218unsafe impl<K: Send, V: Send, Type> Send for NodeRef<marker::ValMut<'_>, K, V, Type> {}
219unsafe impl<K: Send, V: Send, Type> Send for NodeRef<marker::Owned, K, V, Type> {}
220unsafe impl<K: Send, V: Send, Type> Send for NodeRef<marker::Dying, K, V, Type> {}
221
222impl<K, V> NodeRef<marker::Owned, K, V, marker::Leaf> {
223    pub(super) fn new_leaf<A: AllocatorClone>(alloc: A) -> Self {
224        Self::from_new_leaf(LeafNode::new(alloc))
225    }
226
227    fn from_new_leaf<A: AllocatorClone>(leaf: Box<LeafNode<K, V>, A>) -> Self {
228        // The allocator must be dropped, not leaked.  See also `BTreeMap::alloc`.
229        let (node, _alloc) = Box::into_non_null_with_allocator(leaf);
230        NodeRef { height: 0, node, _marker: PhantomData }
231    }
232}
233
234impl<K, V> NodeRef<marker::Owned, K, V, marker::Internal> {
235    /// Creates a new internal (height > 0) `NodeRef`
236    fn new_internal<A: AllocatorClone>(child: Root<K, V>, alloc: A) -> Self {
237        // ignore-tidy-undocumented-unsafe
238        let mut new_node = unsafe { InternalNode::new(alloc) };
239        new_node.edges[0].write(child.node);
240        NodeRef::from_new_internal(new_node, NonZero::new(child.height + 1).unwrap())
241    }
242
243    /// Creates a new internal (height > 0) `NodeRef` from an existing internal node
244    fn from_new_internal<A: AllocatorClone>(
245        internal: Box<InternalNode<K, V>, A>,
246        height: NonZero<usize>,
247    ) -> Self {
248        // The allocator must be dropped, not leaked.  See also `BTreeMap::alloc`.
249        let (node, _alloc) = Box::into_non_null_with_allocator(internal);
250        let mut this = NodeRef { height: height.into(), node: node.cast(), _marker: PhantomData };
251        this.borrow_mut().correct_all_childrens_parent_links();
252        this
253    }
254}
255
256impl<BorrowType, K, V> NodeRef<BorrowType, K, V, marker::Internal> {
257    /// Unpack a node reference that was packed as `NodeRef::parent`.
258    fn from_internal(node: NonNull<InternalNode<K, V>>, height: usize) -> Self {
259        if true {
    if !(height > 0) {
        ::core::panicking::panic("assertion failed: height > 0")
    };
};debug_assert!(height > 0);
260        NodeRef { height, node: node.cast(), _marker: PhantomData }
261    }
262}
263
264impl<BorrowType, K, V> NodeRef<BorrowType, K, V, marker::Internal> {
265    /// Exposes the data of an internal node.
266    ///
267    /// Returns a raw ptr to avoid invalidating other references to this node.
268    fn as_internal_ptr(this: &Self) -> *mut InternalNode<K, V> {
269        // SAFETY: the static node type is `Internal`.
270        this.node.as_ptr() as *mut InternalNode<K, V>
271    }
272}
273
274impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
275    /// Borrows exclusive access to the data of an internal node.
276    fn as_internal_mut(&mut self) -> &mut InternalNode<K, V> {
277        let ptr = Self::as_internal_ptr(self);
278        // ignore-tidy-undocumented-unsafe
279        unsafe { &mut *ptr }
280    }
281}
282
283impl<BorrowType, K, V, Type> NodeRef<BorrowType, K, V, Type> {
284    /// Finds the length of the node. This is the number of keys or values.
285    /// The number of edges is `len() + 1`.
286    /// Note that, despite being safe, calling this function can have the side effect
287    /// of invalidating mutable references that unsafe code has created.
288    pub(super) fn len(&self) -> usize {
289        // SAFETY: We only access the `len` field here. If BorrowType is marker::ValMut,
290        // there might be outstanding mutable references to values that we must not invalidate.
291        unsafe { usize::from((*Self::as_leaf_ptr(self)).len) }
292    }
293
294    /// Returns the number of levels that the node and leaves are apart. Zero
295    /// height means the node is a leaf itself. If you picture trees with the
296    /// root on top, the number says at which elevation the node appears.
297    /// If you picture trees with leaves on top, the number says how high
298    /// the tree extends above the node.
299    pub(super) fn height(&self) -> usize {
300        self.height
301    }
302
303    /// Temporarily takes out another, immutable reference to the same node.
304    pub(super) fn reborrow(&self) -> NodeRef<marker::Immut<'_>, K, V, Type> {
305        NodeRef { height: self.height, node: self.node, _marker: PhantomData }
306    }
307
308    /// Exposes the leaf portion of any leaf or internal node.
309    ///
310    /// Returns a raw ptr to avoid invalidating other references to this node.
311    fn as_leaf_ptr(this: &Self) -> *mut LeafNode<K, V> {
312        // The node must be valid for at least the LeafNode portion.
313        // This is not a reference in the NodeRef type because we don't know if
314        // it should be unique or shared.
315        this.node.as_ptr()
316    }
317}
318
319impl<BorrowType: marker::BorrowType, K, V, Type> NodeRef<BorrowType, K, V, Type> {
320    /// Finds the parent of the current node. Returns `Ok(handle)` if the current
321    /// node actually has a parent, where `handle` points to the edge of the parent
322    /// that points to the current node. Returns `Err(self)` if the current node has
323    /// no parent, giving back the original `NodeRef`.
324    ///
325    /// The method name assumes you picture trees with the root node on top.
326    ///
327    /// `edge.descend().ascend().unwrap()` and `node.ascend().unwrap().descend()` should
328    /// both, upon success, do nothing.
329    pub(super) fn ascend(
330        self,
331    ) -> Result<Handle<NodeRef<BorrowType, K, V, marker::Internal>, marker::Edge>, Self> {
332        const {
333            if !BorrowType::TRAVERSAL_PERMIT {
    ::core::panicking::panic("assertion failed: BorrowType::TRAVERSAL_PERMIT")
};assert!(BorrowType::TRAVERSAL_PERMIT);
334        }
335
336        // We need to use raw pointers to nodes because, if BorrowType is marker::ValMut,
337        // there might be outstanding mutable references to values that we must not invalidate.
338        let leaf_ptr: *const _ = Self::as_leaf_ptr(&self);
339        // ignore-tidy-undocumented-unsafe
340        unsafe { (*leaf_ptr).parent }
341            .as_ref()
342            .map(|parent| Handle {
343                node: NodeRef::from_internal(*parent, self.height + 1),
344                // ignore-tidy-undocumented-unsafe
345                idx: unsafe { usize::from((*leaf_ptr).parent_idx.assume_init()) },
346                _marker: PhantomData,
347            })
348            .ok_or(self)
349    }
350
351    pub(super) fn first_edge(self) -> Handle<Self, marker::Edge> {
352        // ignore-tidy-undocumented-unsafe
353        unsafe { Handle::new_edge(self, 0) }
354    }
355
356    pub(super) fn last_edge(self) -> Handle<Self, marker::Edge> {
357        let len = self.len();
358        // ignore-tidy-undocumented-unsafe
359        unsafe { Handle::new_edge(self, len) }
360    }
361
362    /// Note that `self` must be nonempty.
363    pub(super) fn first_kv(self) -> Handle<Self, marker::KV> {
364        let len = self.len();
365        if !(len > 0) { ::core::panicking::panic("assertion failed: len > 0") };assert!(len > 0);
366        // ignore-tidy-undocumented-unsafe
367        unsafe { Handle::new_kv(self, 0) }
368    }
369
370    /// Note that `self` must be nonempty.
371    pub(super) fn last_kv(self) -> Handle<Self, marker::KV> {
372        let len = self.len();
373        if !(len > 0) { ::core::panicking::panic("assertion failed: len > 0") };assert!(len > 0);
374        // ignore-tidy-undocumented-unsafe
375        unsafe { Handle::new_kv(self, len - 1) }
376    }
377}
378
379impl<BorrowType, K, V, Type> NodeRef<BorrowType, K, V, Type> {
380    /// Could be a public implementation of PartialEq, but only used in this module.
381    fn eq(&self, other: &Self) -> bool {
382        let Self { node, height, _marker } = self;
383        if node.eq(&other.node) {
384            if true {
    {
        match (&*height, &other.height) {
            (left_val, right_val) => {
                if !(*left_val == *right_val) {
                    let kind = ::core::panicking::AssertKind::Eq;
                    ::core::panicking::assert_failed(kind, &*left_val,
                        &*right_val, ::core::option::Option::None);
                }
            }
        }
    };
};debug_assert_eq!(*height, other.height);
385            true
386        } else {
387            false
388        }
389    }
390}
391
392impl<'a, K: 'a, V: 'a, Type> NodeRef<marker::Immut<'a>, K, V, Type> {
393    /// Exposes the leaf portion of any leaf or internal node in an immutable tree.
394    fn into_leaf(self) -> &'a LeafNode<K, V> {
395        let ptr = Self::as_leaf_ptr(&self);
396        // SAFETY: there can be no mutable references into this tree borrowed as `Immut`.
397        unsafe { &*ptr }
398    }
399
400    /// Borrows a view into the keys stored in the node.
401    pub(super) fn keys(&self) -> &[K] {
402        let leaf = self.into_leaf();
403        // ignore-tidy-undocumented-unsafe
404        unsafe { leaf.keys.get_unchecked(..usize::from(leaf.len)).assume_init_ref() }
405    }
406}
407
408impl<K, V> NodeRef<marker::Dying, K, V, marker::LeafOrInternal> {
409    /// Similar to `ascend`, gets a reference to a node's parent node, but also
410    /// deallocates the current node in the process. This is unsafe because the
411    /// current node will still be accessible despite being deallocated.
412    pub(super) unsafe fn deallocate_and_ascend<A: AllocatorClone>(
413        self,
414        alloc: A,
415    ) -> Option<Handle<NodeRef<marker::Dying, K, V, marker::Internal>, marker::Edge>> {
416        let height = self.height;
417        let node = self.node;
418        let ret = self.ascend().ok();
419        // ignore-tidy-undocumented-unsafe
420        unsafe {
421            alloc.deallocate(
422                node.cast(),
423                if height > 0 {
424                    Layout::new::<InternalNode<K, V>>()
425                } else {
426                    Layout::new::<LeafNode<K, V>>()
427                },
428            );
429        }
430        ret
431    }
432    /// Drops all kvs in this node without deallocating the node itself
433    ///
434    /// # Safety
435    ///
436    /// - kvs in the node must be initialized and must not be accessed after this call.
437    /// - No kvs in the node can be accessed through any other path while this function is running.
438    pub(super) unsafe fn drop_kvs(&mut self) {
439        struct DropGuard<'a, K, V> {
440            node: &'a NodeRef<marker::Dying, K, V, marker::LeafOrInternal>,
441            idx: usize,
442        }
443        impl<'a, K, V> Drop for DropGuard<'a, K, V> {
444            fn drop(&mut self) {
445                let len = self.node.len();
446                for i in self.idx..len {
447                    // SAFETY: i < len and the kv has been initialized and
448                    // it won't use the i-th kv more than once.
449                    unsafe {
450                        let kv = Handle::new_kv(ptr::read(self.node), i);
451                        kv.drop_key_val();
452                    }
453                }
454            }
455        }
456        let len = self.len();
457        for idx in 0..len {
458            // If `kv.drop_key_val()` panics, the guard would drop
459            // the rest and skip the panicked kv.
460            let guard = DropGuard { node: self, idx: idx + 1 };
461            // SAFETY: idx < len and the kv has been initialized and
462            // it won't touch the idx-th more than once
463            unsafe {
464                let kv = Handle::new_kv(ptr::read(self), idx);
465                kv.drop_key_val();
466            }
467
468            core::mem::forget(guard);
469        }
470    }
471}
472
473impl<'a, K, V, Type> NodeRef<marker::Mut<'a>, K, V, Type> {
474    /// Temporarily takes out another mutable reference to the same node. Beware, as
475    /// this method is very dangerous, doubly so since it might not immediately appear
476    /// dangerous.
477    ///
478    /// Because mutable pointers can roam anywhere around the tree, the returned
479    /// pointer can easily be used to make the original pointer dangling, out of
480    /// bounds, or invalid under stacked borrow rules.
481    // FIXME(@gereeter) consider adding yet another type parameter to `NodeRef`
482    // that restricts the use of navigation methods on reborrowed pointers,
483    // preventing this unsafety.
484    unsafe fn reborrow_mut(&mut self) -> NodeRef<marker::Mut<'_>, K, V, Type> {
485        NodeRef { height: self.height, node: self.node, _marker: PhantomData }
486    }
487
488    /// Borrows exclusive access to the leaf portion of a leaf or internal node.
489    fn as_leaf_mut(&mut self) -> &mut LeafNode<K, V> {
490        let ptr = Self::as_leaf_ptr(self);
491        // SAFETY: we have exclusive access to the entire node.
492        unsafe { &mut *ptr }
493    }
494
495    /// Offers exclusive access to the leaf portion of a leaf or internal node.
496    fn into_leaf_mut(mut self) -> &'a mut LeafNode<K, V> {
497        let ptr = Self::as_leaf_ptr(&mut self);
498        // SAFETY: we have exclusive access to the entire node.
499        unsafe { &mut *ptr }
500    }
501
502    /// Returns a dormant copy of this node with its lifetime erased which can
503    /// be reawakened later.
504    pub(super) fn dormant(&self) -> NodeRef<marker::DormantMut, K, V, Type> {
505        NodeRef { height: self.height, node: self.node, _marker: PhantomData }
506    }
507}
508
509impl<K, V, Type> NodeRef<marker::DormantMut, K, V, Type> {
510    /// Revert to the unique borrow initially captured.
511    ///
512    /// # Safety
513    ///
514    /// The reborrow must have ended, i.e., the reference returned by `new` and
515    /// all pointers and references derived from it, must not be used anymore.
516    pub(super) unsafe fn awaken<'a>(self) -> NodeRef<marker::Mut<'a>, K, V, Type> {
517        NodeRef { height: self.height, node: self.node, _marker: PhantomData }
518    }
519}
520
521impl<K, V, Type> NodeRef<marker::Dying, K, V, Type> {
522    /// Borrows exclusive access to the leaf portion of a dying leaf or internal node.
523    fn as_leaf_dying(&mut self) -> &mut LeafNode<K, V> {
524        let ptr = Self::as_leaf_ptr(self);
525        // SAFETY: we have exclusive access to the entire node.
526        unsafe { &mut *ptr }
527    }
528}
529
530impl<'a, K: 'a, V: 'a, Type> NodeRef<marker::Mut<'a>, K, V, Type> {
531    /// Borrows exclusive access to an element of the key storage area.
532    ///
533    /// # Safety
534    /// `index` is in bounds of 0..CAPACITY
535    unsafe fn key_area_mut<I, Output: ?Sized>(&mut self, index: I) -> &mut Output
536    where
537        I: SliceIndex<[MaybeUninit<K>], Output = Output>,
538    {
539        // SAFETY: the caller will not be able to call further methods on self
540        // until the key slice reference is dropped, as we have unique access
541        // for the lifetime of the borrow.
542        unsafe { self.as_leaf_mut().keys.as_mut_slice().get_unchecked_mut(index) }
543    }
544
545    /// Borrows exclusive access to an element or slice of the node's value storage area.
546    ///
547    /// # Safety
548    /// `index` is in bounds of 0..CAPACITY
549    unsafe fn val_area_mut<I, Output: ?Sized>(&mut self, index: I) -> &mut Output
550    where
551        I: SliceIndex<[MaybeUninit<V>], Output = Output>,
552    {
553        // SAFETY: the caller will not be able to call further methods on self
554        // until the value slice reference is dropped, as we have unique access
555        // for the lifetime of the borrow.
556        unsafe { self.as_leaf_mut().vals.as_mut_slice().get_unchecked_mut(index) }
557    }
558}
559
560impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
561    /// Borrows exclusive access to an element or slice of the node's storage area for edge contents.
562    ///
563    /// # Safety
564    /// `index` is in bounds of 0..CAPACITY + 1
565    unsafe fn edge_area_mut<I, Output: ?Sized>(&mut self, index: I) -> &mut Output
566    where
567        I: SliceIndex<[MaybeUninit<BoxedNode<K, V>>], Output = Output>,
568    {
569        // SAFETY: the caller will not be able to call further methods on self
570        // until the edge slice reference is dropped, as we have unique access
571        // for the lifetime of the borrow.
572        unsafe { self.as_internal_mut().edges.as_mut_slice().get_unchecked_mut(index) }
573    }
574}
575
576impl<'a, K, V, Type> NodeRef<marker::ValMut<'a>, K, V, Type> {
577    /// # Safety
578    /// - The node has more than `idx` initialized elements.
579    unsafe fn into_key_val_mut_at(mut self, idx: usize) -> (&'a K, &'a mut V) {
580        // We only create a reference to the one element we are interested in,
581        // to avoid aliasing with outstanding references to other elements,
582        // in particular, those returned to the caller in earlier iterations.
583        let leaf = Self::as_leaf_ptr(&mut self);
584        // ignore-tidy-undocumented-unsafe
585        let keys = unsafe { &raw const (*leaf).keys };
586        // ignore-tidy-undocumented-unsafe
587        let vals = unsafe { &raw mut (*leaf).vals };
588        // We must coerce to unsized array pointers because of Rust issue #74679.
589        let keys: *const [_] = keys;
590        let vals: *mut [_] = vals;
591        // ignore-tidy-undocumented-unsafe
592        let key = unsafe { (&*keys.get_unchecked(idx)).assume_init_ref() };
593        // ignore-tidy-undocumented-unsafe
594        let val = unsafe { (&mut *vals.get_unchecked_mut(idx)).assume_init_mut() };
595        (key, val)
596    }
597}
598
599impl<'a, K: 'a, V: 'a, Type> NodeRef<marker::Mut<'a>, K, V, Type> {
600    /// Borrows exclusive access to the length of the node.
601    pub(super) fn len_mut(&mut self) -> &mut u16 {
602        &mut self.as_leaf_mut().len
603    }
604}
605
606impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
607    /// # Safety
608    /// Every item returned by `range` is a valid edge index for the node.
609    unsafe fn correct_childrens_parent_links<R: Iterator<Item = usize>>(&mut self, range: R) {
610        for i in range {
611            if true {
    if !(i <= self.len()) {
        ::core::panicking::panic("assertion failed: i <= self.len()")
    };
};debug_assert!(i <= self.len());
612            // ignore-tidy-undocumented-unsafe
613            unsafe { Handle::new_edge(self.reborrow_mut(), i) }.correct_parent_link();
614        }
615    }
616
617    fn correct_all_childrens_parent_links(&mut self) {
618        let len = self.len();
619        // ignore-tidy-undocumented-unsafe
620        unsafe { self.correct_childrens_parent_links(0..=len) };
621    }
622}
623
624impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
625    /// Sets the node's link to its parent edge,
626    /// without invalidating other references to the node.
627    fn set_parent_link(&mut self, parent: NonNull<InternalNode<K, V>>, parent_idx: usize) {
628        let leaf = Self::as_leaf_ptr(self);
629        // ignore-tidy-undocumented-unsafe
630        unsafe { (*leaf).parent = Some(parent) };
631        // ignore-tidy-undocumented-unsafe
632        unsafe { (*leaf).parent_idx.write(parent_idx as u16) };
633    }
634}
635
636impl<K, V> NodeRef<marker::Owned, K, V, marker::LeafOrInternal> {
637    /// Clears the root's link to its parent edge.
638    fn clear_parent_link(&mut self) {
639        let mut root_node = self.borrow_mut();
640        let leaf = root_node.as_leaf_mut();
641        leaf.parent = None;
642    }
643}
644
645impl<K, V> NodeRef<marker::Owned, K, V, marker::LeafOrInternal> {
646    /// Returns a new owned tree, with its own root node that is initially empty.
647    pub(super) fn new<A: AllocatorClone>(alloc: A) -> Self {
648        NodeRef::new_leaf(alloc).forget_type()
649    }
650
651    /// Adds a new internal node with a single edge pointing to the previous root node,
652    /// make that new node the root node, and return it. This increases the height by 1
653    /// and is the opposite of `pop_internal_level`.
654    pub(super) fn push_internal_level<A: AllocatorClone>(
655        &mut self,
656        alloc: A,
657    ) -> NodeRef<marker::Mut<'_>, K, V, marker::Internal> {
658        super::mem::take_mut(self, |old_root| NodeRef::new_internal(old_root, alloc).forget_type());
659
660        // `self.borrow_mut()`, except that we just forgot we're internal now:
661        NodeRef { height: self.height, node: self.node, _marker: PhantomData }
662    }
663
664    /// Removes the internal root node, using its first child as the new root node.
665    /// As it is intended only to be called when the root node has only one child,
666    /// no cleanup is done on any of the keys, values and other children.
667    /// This decreases the height by 1 and is the opposite of `push_internal_level`.
668    ///
669    /// Does not invalidate any handles or references pointing into the subtree
670    /// rooted at the first child of `self`.
671    ///
672    /// Panics if there is no internal level, i.e., if the root node is a leaf.
673    pub(super) fn pop_internal_level<A: AllocatorClone>(&mut self, alloc: A) {
674        if !(self.height > 0) {
    ::core::panicking::panic("assertion failed: self.height > 0")
};assert!(self.height > 0);
675
676        let top = self.node;
677
678        // SAFETY: we asserted to be internal.
679        let mut internal_self = unsafe { self.borrow_mut().cast_to_internal_unchecked() };
680        let internal_node = internal_self.as_internal_mut();
681        // SAFETY: the first edge is always initialized.
682        self.node = unsafe { internal_node.edges[0].assume_init_read() };
683        self.height -= 1;
684        self.clear_parent_link();
685
686        // ignore-tidy-undocumented-unsafe
687        unsafe {
688            alloc.deallocate(top.cast(), Layout::new::<InternalNode<K, V>>());
689        }
690    }
691}
692
693impl<K, V, Type> NodeRef<marker::Owned, K, V, Type> {
694    /// Mutably borrows the owned root node. Unlike `reborrow_mut`, this is safe
695    /// because the return value cannot be used to destroy the root, and there
696    /// cannot be other references to the tree.
697    pub(super) fn borrow_mut(&mut self) -> NodeRef<marker::Mut<'_>, K, V, Type> {
698        NodeRef { height: self.height, node: self.node, _marker: PhantomData }
699    }
700
701    /// Slightly mutably borrows the owned root node.
702    pub(super) fn borrow_valmut(&mut self) -> NodeRef<marker::ValMut<'_>, K, V, Type> {
703        NodeRef { height: self.height, node: self.node, _marker: PhantomData }
704    }
705
706    /// Irreversibly transitions to a reference that permits traversal and offers
707    /// destructive methods and little else.
708    pub(super) fn into_dying(self) -> NodeRef<marker::Dying, K, V, Type> {
709        NodeRef { height: self.height, node: self.node, _marker: PhantomData }
710    }
711}
712
713impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::Leaf> {
714    /// Adds a key-value pair to the end of the node, and returns
715    /// a handle to the inserted value.
716    ///
717    /// # Safety
718    ///
719    /// The returned handle has an unbound lifetime.
720    pub(super) unsafe fn push_with_handle<'b>(
721        &mut self,
722        key: K,
723        val: V,
724    ) -> Handle<NodeRef<marker::Mut<'b>, K, V, marker::Leaf>, marker::KV> {
725        let len = self.len_mut();
726        let idx = usize::from(*len);
727        if !(idx < CAPACITY) {
    ::core::panicking::panic("assertion failed: idx < CAPACITY")
};assert!(idx < CAPACITY);
728        *len += 1;
729        // ignore-tidy-undocumented-unsafe
730        unsafe {
731            self.key_area_mut(idx).write(key);
732            self.val_area_mut(idx).write(val);
733            Handle::new_kv(
734                NodeRef { height: self.height, node: self.node, _marker: PhantomData },
735                idx,
736            )
737        }
738    }
739
740    /// Adds a key-value pair to the end of the node, and returns
741    /// the mutable reference of the inserted value.
742    pub(super) fn push(&mut self, key: K, val: V) -> *mut V {
743        // SAFETY: The unbound handle is no longer accessible.
744        unsafe { self.push_with_handle(key, val).into_val_mut() }
745    }
746}
747
748impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
749    /// Adds a key-value pair, and an edge to go to the right of that pair,
750    /// to the end of the node.
751    pub(super) fn push(&mut self, key: K, val: V, edge: Root<K, V>) {
752        if !(edge.height == self.height - 1) {
    ::core::panicking::panic("assertion failed: edge.height == self.height - 1")
};assert!(edge.height == self.height - 1);
753
754        let len = self.len_mut();
755        let idx = usize::from(*len);
756        if !(idx < CAPACITY) {
    ::core::panicking::panic("assertion failed: idx < CAPACITY")
};assert!(idx < CAPACITY);
757        *len += 1;
758        // ignore-tidy-undocumented-unsafe
759        unsafe {
760            self.key_area_mut(idx).write(key);
761            self.val_area_mut(idx).write(val);
762            self.edge_area_mut(idx + 1).write(edge.node);
763            Handle::new_edge(self.reborrow_mut(), idx + 1).correct_parent_link();
764        }
765    }
766}
767
768impl<BorrowType, K, V> NodeRef<BorrowType, K, V, marker::Leaf> {
769    /// Removes any static information asserting that this node is a `Leaf` node.
770    pub(super) fn forget_type(self) -> NodeRef<BorrowType, K, V, marker::LeafOrInternal> {
771        NodeRef { height: self.height, node: self.node, _marker: PhantomData }
772    }
773}
774
775impl<BorrowType, K, V> NodeRef<BorrowType, K, V, marker::Internal> {
776    /// Removes any static information asserting that this node is an `Internal` node.
777    pub(super) fn forget_type(self) -> NodeRef<BorrowType, K, V, marker::LeafOrInternal> {
778        NodeRef { height: self.height, node: self.node, _marker: PhantomData }
779    }
780}
781
782impl<BorrowType, K, V> NodeRef<BorrowType, K, V, marker::LeafOrInternal> {
783    /// Checks whether a node is an `Internal` node or a `Leaf` node.
784    pub(super) fn force(
785        self,
786    ) -> ForceResult<
787        NodeRef<BorrowType, K, V, marker::Leaf>,
788        NodeRef<BorrowType, K, V, marker::Internal>,
789    > {
790        if self.height == 0 {
791            ForceResult::Leaf(NodeRef {
792                height: self.height,
793                node: self.node,
794                _marker: PhantomData,
795            })
796        } else {
797            ForceResult::Internal(NodeRef {
798                height: self.height,
799                node: self.node,
800                _marker: PhantomData,
801            })
802        }
803    }
804}
805
806impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
807    /// Unsafely asserts to the compiler the static information that this node is a `Leaf`.
808    pub(super) unsafe fn cast_to_leaf_unchecked(
809        self,
810    ) -> NodeRef<marker::Mut<'a>, K, V, marker::Leaf> {
811        if true {
    if !(self.height == 0) {
        ::core::panicking::panic("assertion failed: self.height == 0")
    };
};debug_assert!(self.height == 0);
812        NodeRef { height: self.height, node: self.node, _marker: PhantomData }
813    }
814
815    /// Unsafely asserts to the compiler the static information that this node is an `Internal`.
816    unsafe fn cast_to_internal_unchecked(self) -> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
817        if true {
    if !(self.height > 0) {
        ::core::panicking::panic("assertion failed: self.height > 0")
    };
};debug_assert!(self.height > 0);
818        NodeRef { height: self.height, node: self.node, _marker: PhantomData }
819    }
820}
821
822/// A reference to a specific key-value pair or edge within a node. The `Node` parameter
823/// must be a `NodeRef`, while the `Type` can either be `KV` (signifying a handle on a key-value
824/// pair) or `Edge` (signifying a handle on an edge).
825///
826/// Note that even `Leaf` nodes can have `Edge` handles. Instead of representing a pointer to
827/// a child node, these represent the spaces where child pointers would go between the key-value
828/// pairs. For example, in a node with length 2, there would be 3 possible edge locations - one
829/// to the left of the node, one between the two pairs, and one at the right of the node.
830pub(super) struct Handle<Node, Type> {
831    node: Node,
832    idx: usize,
833    _marker: PhantomData<Type>,
834}
835
836impl<Node: Copy, Type> Copy for Handle<Node, Type> {}
837// We don't need the full generality of `#[derive(Clone)]`, as the only time `Node` will be
838// `Clone`able is when it is an immutable reference and therefore `Copy`.
839impl<Node: Copy, Type> Clone for Handle<Node, Type> {
840    fn clone(&self) -> Self {
841        *self
842    }
843}
844
845impl<Node, Type> Handle<Node, Type> {
846    /// Retrieves the node that contains the edge or key-value pair this handle points to.
847    pub(super) fn into_node(self) -> Node {
848        self.node
849    }
850
851    /// Returns the position of this handle in the node.
852    pub(super) fn idx(&self) -> usize {
853        self.idx
854    }
855}
856
857impl<BorrowType, K, V, NodeType> Handle<NodeRef<BorrowType, K, V, NodeType>, marker::KV> {
858    /// Creates a new handle to a key-value pair in `node`.
859    /// Unsafe because the caller must ensure that `idx < node.len()`.
860    pub(super) unsafe fn new_kv(node: NodeRef<BorrowType, K, V, NodeType>, idx: usize) -> Self {
861        if true {
    if !(idx < node.len()) {
        ::core::panicking::panic("assertion failed: idx < node.len()")
    };
};debug_assert!(idx < node.len());
862
863        Handle { node, idx, _marker: PhantomData }
864    }
865
866    pub(super) fn left_edge(self) -> Handle<NodeRef<BorrowType, K, V, NodeType>, marker::Edge> {
867        // ignore-tidy-undocumented-unsafe
868        unsafe { Handle::new_edge(self.node, self.idx) }
869    }
870
871    pub(super) fn right_edge(self) -> Handle<NodeRef<BorrowType, K, V, NodeType>, marker::Edge> {
872        // ignore-tidy-undocumented-unsafe
873        unsafe { Handle::new_edge(self.node, self.idx + 1) }
874    }
875}
876
877impl<BorrowType, K, V, NodeType, HandleType> PartialEq
878    for Handle<NodeRef<BorrowType, K, V, NodeType>, HandleType>
879{
880    fn eq(&self, other: &Self) -> bool {
881        let Self { node, idx, _marker } = self;
882        node.eq(&other.node) && *idx == other.idx
883    }
884}
885
886impl<BorrowType, K, V, NodeType, HandleType>
887    Handle<NodeRef<BorrowType, K, V, NodeType>, HandleType>
888{
889    /// Temporarily takes out another immutable handle on the same location.
890    pub(super) fn reborrow(
891        &self,
892    ) -> Handle<NodeRef<marker::Immut<'_>, K, V, NodeType>, HandleType> {
893        // We can't use Handle::new_kv or Handle::new_edge because we don't know our type
894        Handle { node: self.node.reborrow(), idx: self.idx, _marker: PhantomData }
895    }
896}
897
898impl<'a, K, V, NodeType, HandleType> Handle<NodeRef<marker::Mut<'a>, K, V, NodeType>, HandleType> {
899    /// Temporarily takes out another mutable handle on the same location. Beware, as
900    /// this method is very dangerous, doubly so since it might not immediately appear
901    /// dangerous.
902    ///
903    /// For details, see `NodeRef::reborrow_mut`.
904    pub(super) unsafe fn reborrow_mut(
905        &mut self,
906    ) -> Handle<NodeRef<marker::Mut<'_>, K, V, NodeType>, HandleType> {
907        // We can't use Handle::new_kv or Handle::new_edge because we don't know our type
908        // ignore-tidy-undocumented-unsafe
909        Handle { node: unsafe { self.node.reborrow_mut() }, idx: self.idx, _marker: PhantomData }
910    }
911
912    /// Returns a dormant copy of this handle which can be reawakened later.
913    ///
914    /// See `DormantMutRef` for more details.
915    pub(super) fn dormant(
916        &self,
917    ) -> Handle<NodeRef<marker::DormantMut, K, V, NodeType>, HandleType> {
918        Handle { node: self.node.dormant(), idx: self.idx, _marker: PhantomData }
919    }
920}
921
922impl<K, V, NodeType, HandleType> Handle<NodeRef<marker::DormantMut, K, V, NodeType>, HandleType> {
923    /// Revert to the unique borrow initially captured.
924    ///
925    /// # Safety
926    ///
927    /// The reborrow must have ended, i.e., the reference returned by `new` and
928    /// all pointers and references derived from it, must not be used anymore.
929    pub(super) unsafe fn awaken<'a>(
930        self,
931    ) -> Handle<NodeRef<marker::Mut<'a>, K, V, NodeType>, HandleType> {
932        // ignore-tidy-undocumented-unsafe
933        Handle { node: unsafe { self.node.awaken() }, idx: self.idx, _marker: PhantomData }
934    }
935}
936
937impl<BorrowType, K, V, NodeType> Handle<NodeRef<BorrowType, K, V, NodeType>, marker::Edge> {
938    /// Creates a new handle to an edge in `node`.
939    /// Unsafe because the caller must ensure that `idx <= node.len()`.
940    pub(super) unsafe fn new_edge(node: NodeRef<BorrowType, K, V, NodeType>, idx: usize) -> Self {
941        if true {
    if !(idx <= node.len()) {
        ::core::panicking::panic("assertion failed: idx <= node.len()")
    };
};debug_assert!(idx <= node.len());
942
943        Handle { node, idx, _marker: PhantomData }
944    }
945
946    pub(super) fn left_kv(
947        self,
948    ) -> Result<Handle<NodeRef<BorrowType, K, V, NodeType>, marker::KV>, Self> {
949        if self.idx > 0 {
950            // ignore-tidy-undocumented-unsafe
951            Ok(unsafe { Handle::new_kv(self.node, self.idx - 1) })
952        } else {
953            Err(self)
954        }
955    }
956
957    pub(super) fn right_kv(
958        self,
959    ) -> Result<Handle<NodeRef<BorrowType, K, V, NodeType>, marker::KV>, Self> {
960        if self.idx < self.node.len() {
961            // ignore-tidy-undocumented-unsafe
962            Ok(unsafe { Handle::new_kv(self.node, self.idx) })
963        } else {
964            Err(self)
965        }
966    }
967}
968
969pub(super) enum LeftOrRight<T> {
970    Left(T),
971    Right(T),
972}
973
974/// Given an edge index where we want to insert into a node filled to capacity,
975/// computes a sensible KV index of a split point and where to perform the insertion.
976/// The goal of the split point is for its key and value to end up in a parent node;
977/// the keys, values and edges to the left of the split point become the left child;
978/// the keys, values and edges to the right of the split point become the right child.
979fn splitpoint(edge_idx: usize) -> (usize, LeftOrRight<usize>) {
980    if true {
    if !(edge_idx <= CAPACITY) {
        ::core::panicking::panic("assertion failed: edge_idx <= CAPACITY")
    };
};debug_assert!(edge_idx <= CAPACITY);
981    // Rust issue #74834 tries to explain these symmetric rules.
982    match edge_idx {
983        0..EDGE_IDX_LEFT_OF_CENTER => (KV_IDX_CENTER - 1, LeftOrRight::Left(edge_idx)),
984        EDGE_IDX_LEFT_OF_CENTER => (KV_IDX_CENTER, LeftOrRight::Left(edge_idx)),
985        EDGE_IDX_RIGHT_OF_CENTER => (KV_IDX_CENTER, LeftOrRight::Right(0)),
986        _ => (KV_IDX_CENTER + 1, LeftOrRight::Right(edge_idx - (KV_IDX_CENTER + 1 + 1))),
987    }
988}
989
990impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::Edge> {
991    /// Inserts a new key-value pair between the key-value pairs to the right and left of
992    /// this edge. This method assumes that there is enough space in the node for the new
993    /// pair to fit.
994    unsafe fn insert_fit(
995        mut self,
996        key: K,
997        val: V,
998    ) -> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::KV> {
999        if true {
    if !(self.node.len() < CAPACITY) {
        ::core::panicking::panic("assertion failed: self.node.len() < CAPACITY")
    };
};debug_assert!(self.node.len() < CAPACITY);
1000        let new_len = self.node.len() + 1;
1001
1002        // ignore-tidy-undocumented-unsafe
1003        unsafe {
1004            slice_insert(self.node.key_area_mut(..new_len), self.idx, key);
1005            slice_insert(self.node.val_area_mut(..new_len), self.idx, val);
1006            *self.node.len_mut() = new_len as u16;
1007
1008            Handle::new_kv(self.node, self.idx)
1009        }
1010    }
1011}
1012
1013impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::Edge> {
1014    /// Inserts a new key-value pair between the key-value pairs to the right and left of
1015    /// this edge. This method splits the node if there isn't enough room.
1016    ///
1017    /// Returns a dormant handle to the inserted node which can be reawakened
1018    /// once splitting is complete.
1019    fn insert<A: AllocatorClone>(
1020        self,
1021        key: K,
1022        val: V,
1023        alloc: A,
1024    ) -> (
1025        Option<SplitResult<'a, K, V, marker::Leaf>>,
1026        Handle<NodeRef<marker::DormantMut, K, V, marker::Leaf>, marker::KV>,
1027    ) {
1028        if self.node.len() < CAPACITY {
1029            // SAFETY: There is enough space in the node for insertion.
1030            let handle = unsafe { self.insert_fit(key, val) };
1031            (None, handle.dormant())
1032        } else {
1033            let (middle_kv_idx, insertion) = splitpoint(self.idx);
1034            // ignore-tidy-undocumented-unsafe
1035            let middle = unsafe { Handle::new_kv(self.node, middle_kv_idx) };
1036            let mut result = middle.split(alloc);
1037            let insertion_edge = match insertion {
1038                // ignore-tidy-undocumented-unsafe
1039                LeftOrRight::Left(insert_idx) => unsafe {
1040                    Handle::new_edge(result.left.reborrow_mut(), insert_idx)
1041                },
1042                // ignore-tidy-undocumented-unsafe
1043                LeftOrRight::Right(insert_idx) => unsafe {
1044                    Handle::new_edge(result.right.borrow_mut(), insert_idx)
1045                },
1046            };
1047            // SAFETY: We just split the node, so there is enough space for
1048            // insertion.
1049            let handle = unsafe { insertion_edge.insert_fit(key, val).dormant() };
1050            (Some(result), handle)
1051        }
1052    }
1053}
1054
1055impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::Edge> {
1056    /// Fixes the parent pointer and index in the child node that this edge
1057    /// links to. This is useful when the ordering of edges has been changed,
1058    fn correct_parent_link(self) {
1059        // Create backpointer without invalidating other references to the node.
1060        // ignore-tidy-undocumented-unsafe
1061        let ptr = unsafe { NonNull::new_unchecked(NodeRef::as_internal_ptr(&self.node)) };
1062        let idx = self.idx;
1063        let mut child = self.descend();
1064        child.set_parent_link(ptr, idx);
1065    }
1066}
1067
1068impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::Edge> {
1069    /// Inserts a new key-value pair and an edge that will go to the right of that new pair
1070    /// between this edge and the key-value pair to the right of this edge. This method assumes
1071    /// that there is enough space in the node for the new pair to fit.
1072    fn insert_fit(&mut self, key: K, val: V, edge: Root<K, V>) {
1073        if true {
    if !(self.node.len() < CAPACITY) {
        ::core::panicking::panic("assertion failed: self.node.len() < CAPACITY")
    };
};debug_assert!(self.node.len() < CAPACITY);
1074        if true {
    if !(edge.height == self.node.height - 1) {
        ::core::panicking::panic("assertion failed: edge.height == self.node.height - 1")
    };
};debug_assert!(edge.height == self.node.height - 1);
1075        let new_len = self.node.len() + 1;
1076
1077        // ignore-tidy-undocumented-unsafe
1078        unsafe {
1079            slice_insert(self.node.key_area_mut(..new_len), self.idx, key);
1080            slice_insert(self.node.val_area_mut(..new_len), self.idx, val);
1081            slice_insert(self.node.edge_area_mut(..new_len + 1), self.idx + 1, edge.node);
1082            *self.node.len_mut() = new_len as u16;
1083
1084            self.node.correct_childrens_parent_links(self.idx + 1..new_len + 1);
1085        }
1086    }
1087
1088    /// Inserts a new key-value pair and an edge that will go to the right of that new pair
1089    /// between this edge and the key-value pair to the right of this edge. This method splits
1090    /// the node if there isn't enough room.
1091    fn insert<A: AllocatorClone>(
1092        mut self,
1093        key: K,
1094        val: V,
1095        edge: Root<K, V>,
1096        alloc: A,
1097    ) -> Option<SplitResult<'a, K, V, marker::Internal>> {
1098        if !(edge.height == self.node.height - 1) {
    ::core::panicking::panic("assertion failed: edge.height == self.node.height - 1")
};assert!(edge.height == self.node.height - 1);
1099
1100        if self.node.len() < CAPACITY {
1101            self.insert_fit(key, val, edge);
1102            None
1103        } else {
1104            let (middle_kv_idx, insertion) = splitpoint(self.idx);
1105            // ignore-tidy-undocumented-unsafe
1106            let middle = unsafe { Handle::new_kv(self.node, middle_kv_idx) };
1107            let mut result = middle.split(alloc);
1108            let mut insertion_edge = match insertion {
1109                // ignore-tidy-undocumented-unsafe
1110                LeftOrRight::Left(insert_idx) => unsafe {
1111                    Handle::new_edge(result.left.reborrow_mut(), insert_idx)
1112                },
1113                // ignore-tidy-undocumented-unsafe
1114                LeftOrRight::Right(insert_idx) => unsafe {
1115                    Handle::new_edge(result.right.borrow_mut(), insert_idx)
1116                },
1117            };
1118            insertion_edge.insert_fit(key, val, edge);
1119            Some(result)
1120        }
1121    }
1122}
1123
1124impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::Edge> {
1125    /// Inserts a new key-value pair between the key-value pairs to the right and left of
1126    /// this edge. This method splits the node if there isn't enough room, and tries to
1127    /// insert the split off portion into the parent node recursively, until the root is reached.
1128    ///
1129    /// If the returned result is some `SplitResult`, the `left` field will be the root node.
1130    /// The returned pointer points to the inserted value, which in the case of `SplitResult`
1131    /// is in the `left` or `right` tree.
1132    pub(super) fn insert_recursing<A: AllocatorClone>(
1133        self,
1134        key: K,
1135        value: V,
1136        alloc: A,
1137        split_root: impl FnOnce(SplitResult<'a, K, V, marker::LeafOrInternal>),
1138    ) -> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::KV> {
1139        let (mut split, handle) = match self.insert(key, value, alloc.clone()) {
1140            // SAFETY: we have finished splitting and can now re-awaken the
1141            // handle to the inserted element.
1142            (None, handle) => return unsafe { handle.awaken() },
1143            (Some(split), handle) => (split.forget_node_type(), handle),
1144        };
1145
1146        loop {
1147            split = match split.left.ascend() {
1148                Ok(parent) => {
1149                    match parent.insert(split.kv.0, split.kv.1, split.right, alloc.clone()) {
1150                        // SAFETY: we have finished splitting and can now re-awaken the
1151                        // handle to the inserted element.
1152                        None => return unsafe { handle.awaken() },
1153                        Some(split) => split.forget_node_type(),
1154                    }
1155                }
1156                Err(root) => {
1157                    split_root(SplitResult { left: root, ..split });
1158                    // SAFETY: we have finished splitting and can now re-awaken the
1159                    // handle to the inserted element.
1160                    return unsafe { handle.awaken() };
1161                }
1162            };
1163        }
1164    }
1165}
1166
1167impl<BorrowType: marker::BorrowType, K, V>
1168    Handle<NodeRef<BorrowType, K, V, marker::Internal>, marker::Edge>
1169{
1170    /// Finds the node pointed to by this edge.
1171    ///
1172    /// The method name assumes you picture trees with the root node on top.
1173    ///
1174    /// `edge.descend().ascend().unwrap()` and `node.ascend().unwrap().descend()` should
1175    /// both, upon success, do nothing.
1176    pub(super) fn descend(self) -> NodeRef<BorrowType, K, V, marker::LeafOrInternal> {
1177        const {
1178            if !BorrowType::TRAVERSAL_PERMIT {
    ::core::panicking::panic("assertion failed: BorrowType::TRAVERSAL_PERMIT")
};assert!(BorrowType::TRAVERSAL_PERMIT);
1179        }
1180
1181        // We need to use raw pointers to nodes because, if BorrowType is
1182        // marker::ValMut, there might be outstanding mutable references to
1183        // values that we must not invalidate. There's no worry accessing the
1184        // height field because that value is copied. Beware that, once the
1185        // node pointer is dereferenced, we access the edges array with a
1186        // reference (Rust issue #73987) and invalidate any other references
1187        // to or inside the array, should any be around.
1188        let parent_ptr = NodeRef::as_internal_ptr(&self.node);
1189        // ignore-tidy-undocumented-unsafe
1190        let node = unsafe { (*parent_ptr).edges.get_unchecked(self.idx).assume_init_read() };
1191        NodeRef { node, height: self.node.height - 1, _marker: PhantomData }
1192    }
1193}
1194
1195impl<'a, K: 'a, V: 'a, NodeType> Handle<NodeRef<marker::Immut<'a>, K, V, NodeType>, marker::KV> {
1196    pub(super) fn into_kv(self) -> (&'a K, &'a V) {
1197        if true {
    if !(self.idx < self.node.len()) {
        ::core::panicking::panic("assertion failed: self.idx < self.node.len()")
    };
};debug_assert!(self.idx < self.node.len());
1198        let leaf = self.node.into_leaf();
1199        // ignore-tidy-undocumented-unsafe
1200        let k = unsafe { leaf.keys.get_unchecked(self.idx).assume_init_ref() };
1201        // ignore-tidy-undocumented-unsafe
1202        let v = unsafe { leaf.vals.get_unchecked(self.idx).assume_init_ref() };
1203        (k, v)
1204    }
1205}
1206
1207impl<'a, K: 'a, V: 'a, NodeType> Handle<NodeRef<marker::Mut<'a>, K, V, NodeType>, marker::KV> {
1208    pub(super) fn key_mut(&mut self) -> &mut K {
1209        // ignore-tidy-undocumented-unsafe
1210        unsafe { self.node.key_area_mut(self.idx).assume_init_mut() }
1211    }
1212
1213    pub(super) fn into_val_mut(self) -> &'a mut V {
1214        if true {
    if !(self.idx < self.node.len()) {
        ::core::panicking::panic("assertion failed: self.idx < self.node.len()")
    };
};debug_assert!(self.idx < self.node.len());
1215        let leaf = self.node.into_leaf_mut();
1216        // ignore-tidy-undocumented-unsafe
1217        unsafe { leaf.vals.get_unchecked_mut(self.idx).assume_init_mut() }
1218    }
1219
1220    pub(super) fn into_kv_mut(self) -> (&'a mut K, &'a mut V) {
1221        if true {
    if !(self.idx < self.node.len()) {
        ::core::panicking::panic("assertion failed: self.idx < self.node.len()")
    };
};debug_assert!(self.idx < self.node.len());
1222        let leaf = self.node.into_leaf_mut();
1223        // ignore-tidy-undocumented-unsafe
1224        let k = unsafe { leaf.keys.get_unchecked_mut(self.idx).assume_init_mut() };
1225        // ignore-tidy-undocumented-unsafe
1226        let v = unsafe { leaf.vals.get_unchecked_mut(self.idx).assume_init_mut() };
1227        (k, v)
1228    }
1229}
1230
1231impl<'a, K, V, NodeType> Handle<NodeRef<marker::ValMut<'a>, K, V, NodeType>, marker::KV> {
1232    pub(super) fn into_kv_valmut(self) -> (&'a K, &'a mut V) {
1233        // ignore-tidy-undocumented-unsafe
1234        unsafe { self.node.into_key_val_mut_at(self.idx) }
1235    }
1236}
1237
1238impl<'a, K: 'a, V: 'a, NodeType> Handle<NodeRef<marker::Mut<'a>, K, V, NodeType>, marker::KV> {
1239    pub(super) fn kv_mut(&mut self) -> (&mut K, &mut V) {
1240        if true {
    if !(self.idx < self.node.len()) {
        ::core::panicking::panic("assertion failed: self.idx < self.node.len()")
    };
};debug_assert!(self.idx < self.node.len());
1241        // We cannot call separate key and value methods, because calling the second one
1242        // invalidates the reference returned by the first.
1243        // ignore-tidy-undocumented-unsafe
1244        unsafe {
1245            let leaf = self.node.as_leaf_mut();
1246            let key = leaf.keys.get_unchecked_mut(self.idx).assume_init_mut();
1247            let val = leaf.vals.get_unchecked_mut(self.idx).assume_init_mut();
1248            (key, val)
1249        }
1250    }
1251
1252    /// Replaces the key and value that the KV handle refers to.
1253    pub(super) fn replace_kv(&mut self, k: K, v: V) -> (K, V) {
1254        let (key, val) = self.kv_mut();
1255        (mem::replace(key, k), mem::replace(val, v))
1256    }
1257}
1258
1259impl<K, V, NodeType> Handle<NodeRef<marker::Dying, K, V, NodeType>, marker::KV> {
1260    /// Extracts the key and value that the KV handle refers to.
1261    /// # Safety
1262    /// The node that the handle refers to must not yet have been deallocated.
1263    pub(super) unsafe fn into_key_val(mut self) -> (K, V) {
1264        if true {
    if !(self.idx < self.node.len()) {
        ::core::panicking::panic("assertion failed: self.idx < self.node.len()")
    };
};debug_assert!(self.idx < self.node.len());
1265        let leaf = self.node.as_leaf_dying();
1266        // ignore-tidy-undocumented-unsafe
1267        unsafe {
1268            let key = leaf.keys.get_unchecked_mut(self.idx).assume_init_read();
1269            let val = leaf.vals.get_unchecked_mut(self.idx).assume_init_read();
1270            (key, val)
1271        }
1272    }
1273
1274    /// Drops the key and value that the KV handle refers to.
1275    /// # Safety
1276    /// The node that the handle refers to must not yet have been deallocated.
1277    #[inline]
1278    pub(super) unsafe fn drop_key_val(mut self) {
1279        // Run the destructor of the value even if the destructor of the key panics.
1280        struct Dropper<'a, T>(&'a mut MaybeUninit<T>);
1281        impl<T> Drop for Dropper<'_, T> {
1282            #[inline]
1283            fn drop(&mut self) {
1284                // ignore-tidy-undocumented-unsafe
1285                unsafe {
1286                    self.0.assume_init_drop();
1287                }
1288            }
1289        }
1290
1291        if true {
    if !(self.idx < self.node.len()) {
        ::core::panicking::panic("assertion failed: self.idx < self.node.len()")
    };
};debug_assert!(self.idx < self.node.len());
1292        let leaf = self.node.as_leaf_dying();
1293        // ignore-tidy-undocumented-unsafe
1294        unsafe {
1295            let key = leaf.keys.get_unchecked_mut(self.idx);
1296            let val = leaf.vals.get_unchecked_mut(self.idx);
1297            let _guard = Dropper(val);
1298            key.assume_init_drop();
1299            // dropping the guard will drop the value
1300        }
1301    }
1302}
1303
1304impl<'a, K: 'a, V: 'a, NodeType> Handle<NodeRef<marker::Mut<'a>, K, V, NodeType>, marker::KV> {
1305    /// Helps implementations of `split` for a particular `NodeType`,
1306    /// by taking care of leaf data.
1307    fn split_leaf_data(&mut self, new_node: &mut LeafNode<K, V>) -> (K, V) {
1308        if true {
    if !(self.idx < self.node.len()) {
        ::core::panicking::panic("assertion failed: self.idx < self.node.len()")
    };
};debug_assert!(self.idx < self.node.len());
1309        let old_len = self.node.len();
1310        let new_len = old_len - self.idx - 1;
1311        new_node.len = new_len as u16;
1312        // ignore-tidy-undocumented-unsafe
1313        unsafe {
1314            let k = self.node.key_area_mut(self.idx).assume_init_read();
1315            let v = self.node.val_area_mut(self.idx).assume_init_read();
1316
1317            move_to_slice(
1318                self.node.key_area_mut(self.idx + 1..old_len),
1319                &mut new_node.keys[..new_len],
1320            );
1321            move_to_slice(
1322                self.node.val_area_mut(self.idx + 1..old_len),
1323                &mut new_node.vals[..new_len],
1324            );
1325
1326            *self.node.len_mut() = self.idx as u16;
1327            (k, v)
1328        }
1329    }
1330}
1331
1332impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::KV> {
1333    /// Splits the underlying node into three parts:
1334    ///
1335    /// - The node is truncated to only contain the key-value pairs to the left of
1336    ///   this handle.
1337    /// - The key and value pointed to by this handle are extracted.
1338    /// - All the key-value pairs to the right of this handle are put into a newly
1339    ///   allocated node.
1340    pub(super) fn split<A: AllocatorClone>(
1341        mut self,
1342        alloc: A,
1343    ) -> SplitResult<'a, K, V, marker::Leaf> {
1344        let mut new_node = LeafNode::new(alloc);
1345
1346        let kv = self.split_leaf_data(&mut new_node);
1347
1348        let right = NodeRef::from_new_leaf(new_node);
1349        SplitResult { left: self.node, kv, right }
1350    }
1351
1352    /// Removes the key-value pair pointed to by this handle and returns it, along with the edge
1353    /// that the key-value pair collapsed into.
1354    pub(super) fn remove(
1355        mut self,
1356    ) -> ((K, V), Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::Edge>) {
1357        let old_len = self.node.len();
1358        // ignore-tidy-undocumented-unsafe
1359        unsafe {
1360            let k = slice_remove(self.node.key_area_mut(..old_len), self.idx);
1361            let v = slice_remove(self.node.val_area_mut(..old_len), self.idx);
1362            *self.node.len_mut() = (old_len - 1) as u16;
1363            ((k, v), self.left_edge())
1364        }
1365    }
1366}
1367
1368impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::KV> {
1369    /// Splits the underlying node into three parts:
1370    ///
1371    /// - The node is truncated to only contain the edges and key-value pairs to the
1372    ///   left of this handle.
1373    /// - The key and value pointed to by this handle are extracted.
1374    /// - All the edges and key-value pairs to the right of this handle are put into
1375    ///   a newly allocated node.
1376    pub(super) fn split<A: AllocatorClone>(
1377        mut self,
1378        alloc: A,
1379    ) -> SplitResult<'a, K, V, marker::Internal> {
1380        let old_len = self.node.len();
1381        // ignore-tidy-undocumented-unsafe
1382        unsafe {
1383            let mut new_node = InternalNode::new(alloc);
1384            let kv = self.split_leaf_data(&mut new_node.data);
1385            let new_len = usize::from(new_node.data.len);
1386            move_to_slice(
1387                self.node.edge_area_mut(self.idx + 1..old_len + 1),
1388                &mut new_node.edges[..new_len + 1],
1389            );
1390
1391            // SAFETY: self is `marker::Internal`, so `self.node.height` is positive
1392            let height = NonZero::new_unchecked(self.node.height);
1393            let right = NodeRef::from_new_internal(new_node, height);
1394
1395            SplitResult { left: self.node, kv, right }
1396        }
1397    }
1398}
1399
1400/// Represents a session for evaluating and performing a balancing operation
1401/// around an internal key-value pair.
1402pub(super) struct BalancingContext<'a, K, V> {
1403    parent: Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::KV>,
1404    left_child: NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>,
1405    right_child: NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>,
1406}
1407
1408impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::KV> {
1409    pub(super) fn consider_for_balancing(self) -> BalancingContext<'a, K, V> {
1410        // ignore-tidy-undocumented-unsafe
1411        let self1 = unsafe { ptr::read(&self) };
1412        // ignore-tidy-undocumented-unsafe
1413        let self2 = unsafe { ptr::read(&self) };
1414        BalancingContext {
1415            parent: self,
1416            left_child: self1.left_edge().descend(),
1417            right_child: self2.right_edge().descend(),
1418        }
1419    }
1420}
1421
1422impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
1423    /// Chooses a balancing context involving the node as a child, thus between
1424    /// the KV immediately to the left or to the right in the parent node.
1425    /// Returns an `Err` if there is no parent.
1426    /// Panics if the parent is empty.
1427    ///
1428    /// Prefers the left side, to be optimal if the given node is somehow
1429    /// underfull, meaning here only that it has fewer elements than its left
1430    /// sibling and than its right sibling, if they exist. In that case,
1431    /// merging with the left sibling is faster, since we only need to move
1432    /// the node's N elements, instead of shifting them to the right and moving
1433    /// more than N elements in front. Stealing from the left sibling is also
1434    /// typically faster, since we only need to shift the node's N elements to
1435    /// the right, instead of shifting at least N of the sibling's elements to
1436    /// the left.
1437    pub(super) fn choose_parent_kv(self) -> Result<LeftOrRight<BalancingContext<'a, K, V>>, Self> {
1438        // ignore-tidy-undocumented-unsafe
1439        match unsafe { ptr::read(&self) }.ascend() {
1440            Ok(parent_edge) => match parent_edge.left_kv() {
1441                Ok(left_parent_kv) => Ok(LeftOrRight::Left(BalancingContext {
1442                    // ignore-tidy-undocumented-unsafe
1443                    parent: unsafe { ptr::read(&left_parent_kv) },
1444                    left_child: left_parent_kv.left_edge().descend(),
1445                    right_child: self,
1446                })),
1447                Err(parent_edge) => match parent_edge.right_kv() {
1448                    Ok(right_parent_kv) => Ok(LeftOrRight::Right(BalancingContext {
1449                        // ignore-tidy-undocumented-unsafe
1450                        parent: unsafe { ptr::read(&right_parent_kv) },
1451                        left_child: self,
1452                        right_child: right_parent_kv.right_edge().descend(),
1453                    })),
1454                    Err(_) => {
    ::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
            format_args!("empty internal node")));
}unreachable!("empty internal node"),
1455                },
1456            },
1457            Err(root) => Err(root),
1458        }
1459    }
1460}
1461
1462impl<'a, K, V> BalancingContext<'a, K, V> {
1463    pub(super) fn left_child_len(&self) -> usize {
1464        self.left_child.len()
1465    }
1466
1467    pub(super) fn right_child_len(&self) -> usize {
1468        self.right_child.len()
1469    }
1470
1471    pub(super) fn into_left_child(self) -> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
1472        self.left_child
1473    }
1474
1475    pub(super) fn into_right_child(self) -> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
1476        self.right_child
1477    }
1478
1479    /// Returns whether merging is possible, i.e., whether there is enough room
1480    /// in a node to combine the central KV with both adjacent child nodes.
1481    pub(super) fn can_merge(&self) -> bool {
1482        self.left_child.len() + 1 + self.right_child.len() <= CAPACITY
1483    }
1484}
1485
1486impl<'a, K: 'a, V: 'a> BalancingContext<'a, K, V> {
1487    /// Performs a merge and lets a closure decide what to return.
1488    fn do_merge<
1489        F: FnOnce(
1490            NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
1491            NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>,
1492        ) -> R,
1493        R,
1494        A: Allocator,
1495    >(
1496        self,
1497        result: F,
1498        alloc: A,
1499    ) -> R {
1500        let Handle { node: mut parent_node, idx: parent_idx, _marker } = self.parent;
1501        let old_parent_len = parent_node.len();
1502        let mut left_node = self.left_child;
1503        let old_left_len = left_node.len();
1504        let mut right_node = self.right_child;
1505        let right_len = right_node.len();
1506        let new_left_len = old_left_len + 1 + right_len;
1507
1508        if !(new_left_len <= CAPACITY) {
    ::core::panicking::panic("assertion failed: new_left_len <= CAPACITY")
};assert!(new_left_len <= CAPACITY);
1509
1510        // ignore-tidy-undocumented-unsafe
1511        unsafe {
1512            *left_node.len_mut() = new_left_len as u16;
1513
1514            let parent_key = slice_remove(parent_node.key_area_mut(..old_parent_len), parent_idx);
1515            left_node.key_area_mut(old_left_len).write(parent_key);
1516            move_to_slice(
1517                right_node.key_area_mut(..right_len),
1518                left_node.key_area_mut(old_left_len + 1..new_left_len),
1519            );
1520
1521            let parent_val = slice_remove(parent_node.val_area_mut(..old_parent_len), parent_idx);
1522            left_node.val_area_mut(old_left_len).write(parent_val);
1523            move_to_slice(
1524                right_node.val_area_mut(..right_len),
1525                left_node.val_area_mut(old_left_len + 1..new_left_len),
1526            );
1527
1528            slice_remove(parent_node.edge_area_mut(..old_parent_len + 1), parent_idx + 1);
1529            parent_node.correct_childrens_parent_links(parent_idx + 1..old_parent_len);
1530            *parent_node.len_mut() -= 1;
1531
1532            if parent_node.height > 1 {
1533                // SAFETY: the height of the nodes being merged is one below the height
1534                // of the node of this edge, thus above zero, so they are internal.
1535                let mut left_node = left_node.reborrow_mut().cast_to_internal_unchecked();
1536                let mut right_node = right_node.cast_to_internal_unchecked();
1537                move_to_slice(
1538                    right_node.edge_area_mut(..right_len + 1),
1539                    left_node.edge_area_mut(old_left_len + 1..new_left_len + 1),
1540                );
1541
1542                left_node.correct_childrens_parent_links(old_left_len + 1..new_left_len + 1);
1543
1544                alloc.deallocate(right_node.node.cast(), Layout::new::<InternalNode<K, V>>());
1545            } else {
1546                alloc.deallocate(right_node.node.cast(), Layout::new::<LeafNode<K, V>>());
1547            }
1548        }
1549        result(parent_node, left_node)
1550    }
1551
1552    /// Merges the parent's key-value pair and both adjacent child nodes into
1553    /// the left child node and returns the shrunk parent node.
1554    ///
1555    /// Panics unless we `.can_merge()`.
1556    pub(super) fn merge_tracking_parent<A: AllocatorClone>(
1557        self,
1558        alloc: A,
1559    ) -> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
1560        self.do_merge(|parent, _child| parent, alloc)
1561    }
1562
1563    /// Merges the parent's key-value pair and both adjacent child nodes into
1564    /// the left child node and returns that child node.
1565    ///
1566    /// Panics unless we `.can_merge()`.
1567    pub(super) fn merge_tracking_child<A: AllocatorClone>(
1568        self,
1569        alloc: A,
1570    ) -> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
1571        self.do_merge(|_parent, child| child, alloc)
1572    }
1573
1574    /// Merges the parent's key-value pair and both adjacent child nodes into
1575    /// the left child node and returns the edge handle in that child node
1576    /// where the tracked child edge ended up,
1577    ///
1578    /// Panics unless we `.can_merge()`.
1579    pub(super) fn merge_tracking_child_edge<A: AllocatorClone>(
1580        self,
1581        track_edge_idx: LeftOrRight<usize>,
1582        alloc: A,
1583    ) -> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>, marker::Edge> {
1584        let old_left_len = self.left_child.len();
1585        let right_len = self.right_child.len();
1586        if !match track_edge_idx {
            LeftOrRight::Left(idx) => idx <= old_left_len,
            LeftOrRight::Right(idx) => idx <= right_len,
        } {
    ::core::panicking::panic("assertion failed: match track_edge_idx {\n    LeftOrRight::Left(idx) => idx <= old_left_len,\n    LeftOrRight::Right(idx) => idx <= right_len,\n}")
};assert!(match track_edge_idx {
1587            LeftOrRight::Left(idx) => idx <= old_left_len,
1588            LeftOrRight::Right(idx) => idx <= right_len,
1589        });
1590        let child = self.merge_tracking_child(alloc);
1591        let new_idx = match track_edge_idx {
1592            LeftOrRight::Left(idx) => idx,
1593            LeftOrRight::Right(idx) => old_left_len + 1 + idx,
1594        };
1595        // ignore-tidy-undocumented-unsafe
1596        unsafe { Handle::new_edge(child, new_idx) }
1597    }
1598
1599    /// Removes a key-value pair from the left child and places it in the key-value storage
1600    /// of the parent, while pushing the old parent key-value pair into the right child.
1601    /// Returns a handle to the edge in the right child corresponding to where the original
1602    /// edge specified by `track_right_edge_idx` ended up.
1603    pub(super) fn steal_left(
1604        mut self,
1605        track_right_edge_idx: usize,
1606    ) -> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>, marker::Edge> {
1607        self.bulk_steal_left(1);
1608        // ignore-tidy-undocumented-unsafe
1609        unsafe { Handle::new_edge(self.right_child, 1 + track_right_edge_idx) }
1610    }
1611
1612    /// Removes a key-value pair from the right child and places it in the key-value storage
1613    /// of the parent, while pushing the old parent key-value pair onto the left child.
1614    /// Returns a handle to the edge in the left child specified by `track_left_edge_idx`,
1615    /// which didn't move.
1616    pub(super) fn steal_right(
1617        mut self,
1618        track_left_edge_idx: usize,
1619    ) -> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>, marker::Edge> {
1620        self.bulk_steal_right(1);
1621        // ignore-tidy-undocumented-unsafe
1622        unsafe { Handle::new_edge(self.left_child, track_left_edge_idx) }
1623    }
1624
1625    /// This does stealing similar to `steal_left` but steals multiple elements at once.
1626    pub(super) fn bulk_steal_left(&mut self, count: usize) {
1627        if !(count > 0) { ::core::panicking::panic("assertion failed: count > 0") };assert!(count > 0);
1628        // ignore-tidy-undocumented-unsafe
1629        unsafe {
1630            let left_node = &mut self.left_child;
1631            let old_left_len = left_node.len();
1632            let right_node = &mut self.right_child;
1633            let old_right_len = right_node.len();
1634
1635            // Make sure that we may steal safely.
1636            if !(old_right_len + count <= CAPACITY) {
    ::core::panicking::panic("assertion failed: old_right_len + count <= CAPACITY")
};assert!(old_right_len + count <= CAPACITY);
1637            if !(old_left_len >= count) {
    ::core::panicking::panic("assertion failed: old_left_len >= count")
};assert!(old_left_len >= count);
1638
1639            let new_left_len = old_left_len - count;
1640            let new_right_len = old_right_len + count;
1641            *left_node.len_mut() = new_left_len as u16;
1642            *right_node.len_mut() = new_right_len as u16;
1643
1644            // Move leaf data.
1645            {
1646                // Make room for stolen elements in the right child.
1647                slice_shr(right_node.key_area_mut(..new_right_len), count);
1648                slice_shr(right_node.val_area_mut(..new_right_len), count);
1649
1650                // Move elements from the left child to the right one.
1651                move_to_slice(
1652                    left_node.key_area_mut(new_left_len + 1..old_left_len),
1653                    right_node.key_area_mut(..count - 1),
1654                );
1655                move_to_slice(
1656                    left_node.val_area_mut(new_left_len + 1..old_left_len),
1657                    right_node.val_area_mut(..count - 1),
1658                );
1659
1660                // Move the leftmost stolen pair to the parent.
1661                let k = left_node.key_area_mut(new_left_len).assume_init_read();
1662                let v = left_node.val_area_mut(new_left_len).assume_init_read();
1663                let (k, v) = self.parent.replace_kv(k, v);
1664
1665                // Move parent's key-value pair to the right child.
1666                right_node.key_area_mut(count - 1).write(k);
1667                right_node.val_area_mut(count - 1).write(v);
1668            }
1669
1670            match (left_node.reborrow_mut().force(), right_node.reborrow_mut().force()) {
1671                (ForceResult::Internal(mut left), ForceResult::Internal(mut right)) => {
1672                    // Make room for stolen edges.
1673                    slice_shr(right.edge_area_mut(..new_right_len + 1), count);
1674
1675                    // Steal edges.
1676                    move_to_slice(
1677                        left.edge_area_mut(new_left_len + 1..old_left_len + 1),
1678                        right.edge_area_mut(..count),
1679                    );
1680
1681                    right.correct_childrens_parent_links(0..new_right_len + 1);
1682                }
1683                (ForceResult::Leaf(_), ForceResult::Leaf(_)) => {}
1684                _ => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
1685            }
1686        }
1687    }
1688
1689    /// The symmetric clone of `bulk_steal_left`.
1690    pub(super) fn bulk_steal_right(&mut self, count: usize) {
1691        if !(count > 0) { ::core::panicking::panic("assertion failed: count > 0") };assert!(count > 0);
1692        // ignore-tidy-undocumented-unsafe
1693        unsafe {
1694            let left_node = &mut self.left_child;
1695            let old_left_len = left_node.len();
1696            let right_node = &mut self.right_child;
1697            let old_right_len = right_node.len();
1698
1699            // Make sure that we may steal safely.
1700            if !(old_left_len + count <= CAPACITY) {
    ::core::panicking::panic("assertion failed: old_left_len + count <= CAPACITY")
};assert!(old_left_len + count <= CAPACITY);
1701            if !(old_right_len >= count) {
    ::core::panicking::panic("assertion failed: old_right_len >= count")
};assert!(old_right_len >= count);
1702
1703            let new_left_len = old_left_len + count;
1704            let new_right_len = old_right_len - count;
1705            *left_node.len_mut() = new_left_len as u16;
1706            *right_node.len_mut() = new_right_len as u16;
1707
1708            // Move leaf data.
1709            {
1710                // Move the rightmost stolen pair to the parent.
1711                let k = right_node.key_area_mut(count - 1).assume_init_read();
1712                let v = right_node.val_area_mut(count - 1).assume_init_read();
1713                let (k, v) = self.parent.replace_kv(k, v);
1714
1715                // Move parent's key-value pair to the left child.
1716                left_node.key_area_mut(old_left_len).write(k);
1717                left_node.val_area_mut(old_left_len).write(v);
1718
1719                // Move elements from the right child to the left one.
1720                move_to_slice(
1721                    right_node.key_area_mut(..count - 1),
1722                    left_node.key_area_mut(old_left_len + 1..new_left_len),
1723                );
1724                move_to_slice(
1725                    right_node.val_area_mut(..count - 1),
1726                    left_node.val_area_mut(old_left_len + 1..new_left_len),
1727                );
1728
1729                // Fill gap where stolen elements used to be.
1730                slice_shl(right_node.key_area_mut(..old_right_len), count);
1731                slice_shl(right_node.val_area_mut(..old_right_len), count);
1732            }
1733
1734            match (left_node.reborrow_mut().force(), right_node.reborrow_mut().force()) {
1735                (ForceResult::Internal(mut left), ForceResult::Internal(mut right)) => {
1736                    // Steal edges.
1737                    move_to_slice(
1738                        right.edge_area_mut(..count),
1739                        left.edge_area_mut(old_left_len + 1..new_left_len + 1),
1740                    );
1741
1742                    // Fill gap where stolen edges used to be.
1743                    slice_shl(right.edge_area_mut(..old_right_len + 1), count);
1744
1745                    left.correct_childrens_parent_links(old_left_len + 1..new_left_len + 1);
1746                    right.correct_childrens_parent_links(0..new_right_len + 1);
1747                }
1748                (ForceResult::Leaf(_), ForceResult::Leaf(_)) => {}
1749                _ => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
1750            }
1751        }
1752    }
1753}
1754
1755impl<BorrowType, K, V> Handle<NodeRef<BorrowType, K, V, marker::Leaf>, marker::Edge> {
1756    pub(super) fn forget_node_type(
1757        self,
1758    ) -> Handle<NodeRef<BorrowType, K, V, marker::LeafOrInternal>, marker::Edge> {
1759        // ignore-tidy-undocumented-unsafe
1760        unsafe { Handle::new_edge(self.node.forget_type(), self.idx) }
1761    }
1762}
1763
1764impl<BorrowType, K, V> Handle<NodeRef<BorrowType, K, V, marker::Internal>, marker::Edge> {
1765    pub(super) fn forget_node_type(
1766        self,
1767    ) -> Handle<NodeRef<BorrowType, K, V, marker::LeafOrInternal>, marker::Edge> {
1768        // ignore-tidy-undocumented-unsafe
1769        unsafe { Handle::new_edge(self.node.forget_type(), self.idx) }
1770    }
1771}
1772
1773impl<BorrowType, K, V> Handle<NodeRef<BorrowType, K, V, marker::Leaf>, marker::KV> {
1774    pub(super) fn forget_node_type(
1775        self,
1776    ) -> Handle<NodeRef<BorrowType, K, V, marker::LeafOrInternal>, marker::KV> {
1777        // ignore-tidy-undocumented-unsafe
1778        unsafe { Handle::new_kv(self.node.forget_type(), self.idx) }
1779    }
1780}
1781
1782impl<BorrowType, K, V, Type> Handle<NodeRef<BorrowType, K, V, marker::LeafOrInternal>, Type> {
1783    /// Checks whether the underlying node is an `Internal` node or a `Leaf` node.
1784    pub(super) fn force(
1785        self,
1786    ) -> ForceResult<
1787        Handle<NodeRef<BorrowType, K, V, marker::Leaf>, Type>,
1788        Handle<NodeRef<BorrowType, K, V, marker::Internal>, Type>,
1789    > {
1790        match self.node.force() {
1791            ForceResult::Leaf(node) => {
1792                ForceResult::Leaf(Handle { node, idx: self.idx, _marker: PhantomData })
1793            }
1794            ForceResult::Internal(node) => {
1795                ForceResult::Internal(Handle { node, idx: self.idx, _marker: PhantomData })
1796            }
1797        }
1798    }
1799}
1800
1801impl<'a, K, V, Type> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>, Type> {
1802    /// Unsafely asserts to the compiler the static information that the handle's node is a `Leaf`.
1803    pub(super) unsafe fn cast_to_leaf_unchecked(
1804        self,
1805    ) -> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, Type> {
1806        // ignore-tidy-undocumented-unsafe
1807        let node = unsafe { self.node.cast_to_leaf_unchecked() };
1808        Handle { node, idx: self.idx, _marker: PhantomData }
1809    }
1810}
1811
1812impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>, marker::Edge> {
1813    /// Move the suffix after `self` from one node to another one. `right` must be empty.
1814    /// The first edge of `right` remains unchanged.
1815    pub(super) fn move_suffix(
1816        &mut self,
1817        right: &mut NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>,
1818    ) {
1819        // ignore-tidy-undocumented-unsafe
1820        unsafe {
1821            let new_left_len = self.idx;
1822            let mut left_node = self.reborrow_mut().into_node();
1823            let old_left_len = left_node.len();
1824
1825            let new_right_len = old_left_len - new_left_len;
1826            let mut right_node = right.reborrow_mut();
1827
1828            if !(right_node.len() == 0) {
    ::core::panicking::panic("assertion failed: right_node.len() == 0")
};assert!(right_node.len() == 0);
1829            if !(left_node.height == right_node.height) {
    ::core::panicking::panic("assertion failed: left_node.height == right_node.height")
};assert!(left_node.height == right_node.height);
1830
1831            if new_right_len > 0 {
1832                *left_node.len_mut() = new_left_len as u16;
1833                *right_node.len_mut() = new_right_len as u16;
1834
1835                move_to_slice(
1836                    left_node.key_area_mut(new_left_len..old_left_len),
1837                    right_node.key_area_mut(..new_right_len),
1838                );
1839                move_to_slice(
1840                    left_node.val_area_mut(new_left_len..old_left_len),
1841                    right_node.val_area_mut(..new_right_len),
1842                );
1843                match (left_node.force(), right_node.force()) {
1844                    (ForceResult::Internal(mut left), ForceResult::Internal(mut right)) => {
1845                        move_to_slice(
1846                            left.edge_area_mut(new_left_len + 1..old_left_len + 1),
1847                            right.edge_area_mut(1..new_right_len + 1),
1848                        );
1849                        right.correct_childrens_parent_links(1..new_right_len + 1);
1850                    }
1851                    (ForceResult::Leaf(_), ForceResult::Leaf(_)) => {}
1852                    _ => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
1853                }
1854            }
1855        }
1856    }
1857}
1858
1859pub(super) enum ForceResult<Leaf, Internal> {
1860    Leaf(Leaf),
1861    Internal(Internal),
1862}
1863
1864/// Result of insertion, when a node needed to expand beyond its capacity.
1865pub(super) struct SplitResult<'a, K, V, NodeType> {
1866    // Altered node in existing tree with elements and edges that belong to the left of `kv`.
1867    pub left: NodeRef<marker::Mut<'a>, K, V, NodeType>,
1868    // Some key and value that existed before and were split off, to be inserted elsewhere.
1869    pub kv: (K, V),
1870    // Owned, unattached, new node with elements and edges that belong to the right of `kv`.
1871    pub right: NodeRef<marker::Owned, K, V, NodeType>,
1872}
1873
1874impl<'a, K, V> SplitResult<'a, K, V, marker::Leaf> {
1875    pub(super) fn forget_node_type(self) -> SplitResult<'a, K, V, marker::LeafOrInternal> {
1876        SplitResult { left: self.left.forget_type(), kv: self.kv, right: self.right.forget_type() }
1877    }
1878}
1879
1880impl<'a, K, V> SplitResult<'a, K, V, marker::Internal> {
1881    pub(super) fn forget_node_type(self) -> SplitResult<'a, K, V, marker::LeafOrInternal> {
1882        SplitResult { left: self.left.forget_type(), kv: self.kv, right: self.right.forget_type() }
1883    }
1884}
1885
1886pub(super) mod marker {
1887    use core::marker::PhantomData;
1888
1889    pub(crate) enum Leaf {}
1890    pub(crate) enum Internal {}
1891    pub(crate) enum LeafOrInternal {}
1892
1893    pub(crate) enum Owned {}
1894    pub(crate) enum Dying {}
1895    pub(crate) enum DormantMut {}
1896    pub(crate) struct Immut<'a>(PhantomData<&'a ()>);
1897    pub(crate) struct Mut<'a>(PhantomData<&'a mut ()>);
1898    pub(crate) struct ValMut<'a>(PhantomData<&'a mut ()>);
1899
1900    pub(crate) trait BorrowType {
1901        /// If node references of this borrow type allow traversing to other
1902        /// nodes in the tree, this constant is set to `true`. It can be used
1903        /// for a compile-time assertion.
1904        const TRAVERSAL_PERMIT: bool = true;
1905    }
1906    impl BorrowType for Owned {
1907        /// Reject traversal, because it isn't needed. Instead traversal
1908        /// happens using the result of `borrow_mut`.
1909        /// By disabling traversal, and only creating new references to roots,
1910        /// we know that every reference of the `Owned` type is to a root node.
1911        const TRAVERSAL_PERMIT: bool = false;
1912    }
1913    impl BorrowType for Dying {}
1914    impl<'a> BorrowType for Immut<'a> {}
1915    impl<'a> BorrowType for Mut<'a> {}
1916    impl<'a> BorrowType for ValMut<'a> {}
1917    impl BorrowType for DormantMut {}
1918
1919    pub(crate) enum KV {}
1920    pub(crate) enum Edge {}
1921}
1922
1923/// Inserts a value into a slice of initialized elements followed by one uninitialized element.
1924///
1925/// # Safety
1926/// The slice has more than `idx` elements.
1927unsafe fn slice_insert<T>(slice: &mut [MaybeUninit<T>], idx: usize, val: T) {
1928    let len = slice.len();
1929    if true {
    if !(len > idx) {
        ::core::panicking::panic("assertion failed: len > idx")
    };
};debug_assert!(len > idx);
1930    let slice_ptr = slice.as_mut_ptr();
1931    // ignore-tidy-undocumented-unsafe
1932    unsafe {
1933        if len > idx + 1 {
1934            ptr::copy(slice_ptr.add(idx), slice_ptr.add(idx + 1), len - idx - 1);
1935        }
1936        (*slice_ptr.add(idx)).write(val);
1937    }
1938}
1939
1940/// Removes and returns a value from a slice of all initialized elements, leaving behind one
1941/// trailing uninitialized element.
1942///
1943/// # Safety
1944/// The slice has more than `idx` elements.
1945unsafe fn slice_remove<T>(slice: &mut [MaybeUninit<T>], idx: usize) -> T {
1946    let len = slice.len();
1947    if true {
    if !(idx < len) {
        ::core::panicking::panic("assertion failed: idx < len")
    };
};debug_assert!(idx < len);
1948    let slice_ptr = slice.as_mut_ptr();
1949    // ignore-tidy-undocumented-unsafe
1950    unsafe {
1951        let ret = (*slice_ptr.add(idx)).assume_init_read();
1952        ptr::copy(slice_ptr.add(idx + 1), slice_ptr.add(idx), len - idx - 1);
1953        ret
1954    }
1955}
1956
1957/// Shifts the elements in a slice `distance` positions to the left.
1958///
1959/// # Safety
1960/// The slice has at least `distance` elements.
1961unsafe fn slice_shl<T>(slice: &mut [MaybeUninit<T>], distance: usize) {
1962    let slice_ptr = slice.as_mut_ptr();
1963    // ignore-tidy-undocumented-unsafe
1964    unsafe {
1965        ptr::copy(slice_ptr.add(distance), slice_ptr, slice.len() - distance);
1966    }
1967}
1968
1969/// Shifts the elements in a slice `distance` positions to the right.
1970///
1971/// # Safety
1972/// The slice has at least `distance` elements.
1973unsafe fn slice_shr<T>(slice: &mut [MaybeUninit<T>], distance: usize) {
1974    let slice_ptr = slice.as_mut_ptr();
1975    // ignore-tidy-undocumented-unsafe
1976    unsafe {
1977        ptr::copy(slice_ptr, slice_ptr.add(distance), slice.len() - distance);
1978    }
1979}
1980
1981/// Moves all values from a slice of initialized elements to a slice
1982/// of uninitialized elements, leaving behind `src` as all uninitialized.
1983/// Works like `dst.copy_from_slice(src)` but does not require `T` to be `Copy`.
1984fn move_to_slice<T>(src: &mut [MaybeUninit<T>], dst: &mut [MaybeUninit<T>]) {
1985    if !(src.len() == dst.len()) {
    ::core::panicking::panic("assertion failed: src.len() == dst.len()")
};assert!(src.len() == dst.len());
1986    // ignore-tidy-undocumented-unsafe
1987    unsafe {
1988        ptr::copy_nonoverlapping(src.as_ptr(), dst.as_mut_ptr(), src.len());
1989    }
1990}
1991
1992#[cfg(test)]
1993mod tests;