1use core::marker::PhantomData;
35use core::mem::{self, DropGuard, 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
50struct LeafNode<K, V> {
52 parent: Option<NonNull<InternalNode<K, V>>>,
54
55 parent_idx: MaybeUninit<u16>,
59
60 len: u16,
62
63 keys: [MaybeUninit<K>; CAPACITY],
66 vals: [MaybeUninit<V>; CAPACITY],
67}
68
69impl<K, V> LeafNode<K, V> {
70 unsafe fn init(this: *mut Self) {
76 unsafe {
80 (&raw mut (*this).parent).write(None);
82 (&raw mut (*this).len).write(0);
83 }
84 }
85
86 fn new<A: AllocatorClone>(alloc: A) -> Box<Self, A> {
88 let mut leaf = Box::new_uninit_in(alloc);
89
90 unsafe { LeafNode::init(leaf.as_mut_ptr()) };
92 unsafe { leaf.assume_init() }
94 }
95}
96
97#[repr(C)]
103struct InternalNode<K, V> {
105 data: LeafNode<K, V>,
106
107 edges: [MaybeUninit<BoxedNode<K, V>>; 2 * B],
111}
112
113impl<K, V> InternalNode<K, V> {
114 unsafe fn new<A: AllocatorClone>(alloc: A) -> Box<Self, A> {
121 let mut node = Box::<Self, _>::new_uninit_in(alloc);
122
123 unsafe { LeafNode::init(&raw mut (*node.as_mut_ptr()).data) };
125 unsafe { node.assume_init() }
127 }
128}
129
130type BoxedNode<K, V> = NonNull<LeafNode<K, V>>;
137
138pub(super) struct NodeRef<BorrowType, K, V, Type> {
190 height: usize,
196 node: NonNull<LeafNode<K, V>>,
199 _marker: PhantomData<(BorrowType, Type)>,
200}
201
202pub(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 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 fn new_internal<A: AllocatorClone>(child: Root<K, V>, alloc: A) -> Self {
237 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 fn from_new_internal<A: AllocatorClone>(
245 internal: Box<InternalNode<K, V>, A>,
246 height: NonZero<usize>,
247 ) -> Self {
248 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 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 fn as_internal_ptr(this: &Self) -> *mut InternalNode<K, V> {
269 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 fn as_internal_mut(&mut self) -> &mut InternalNode<K, V> {
277 let ptr = Self::as_internal_ptr(self);
278 unsafe { &mut *ptr }
280 }
281}
282
283impl<BorrowType, K, V, Type> NodeRef<BorrowType, K, V, Type> {
284 pub(super) fn len(&self) -> usize {
289 unsafe { usize::from((*Self::as_leaf_ptr(self)).len) }
292 }
293
294 pub(super) fn height(&self) -> usize {
300 self.height
301 }
302
303 pub(super) fn reborrow(&self) -> NodeRef<marker::Immut<'_>, K, V, Type> {
305 NodeRef { height: self.height, node: self.node, _marker: PhantomData }
306 }
307
308 fn as_leaf_ptr(this: &Self) -> *mut LeafNode<K, V> {
312 this.node.as_ptr()
316 }
317}
318
319impl<BorrowType: marker::BorrowType, K, V, Type> NodeRef<BorrowType, K, V, Type> {
320 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 let leaf_ptr: *const _ = Self::as_leaf_ptr(&self);
339 unsafe { (*leaf_ptr).parent }
341 .as_ref()
342 .map(|parent| Handle {
343 node: NodeRef::from_internal(*parent, self.height + 1),
344 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 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 unsafe { Handle::new_edge(self, len) }
360 }
361
362 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 unsafe { Handle::new_kv(self, 0) }
368 }
369
370 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 unsafe { Handle::new_kv(self, len - 1) }
376 }
377}
378
379impl<BorrowType, K, V, Type> NodeRef<BorrowType, K, V, Type> {
380 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 fn into_leaf(self) -> &'a LeafNode<K, V> {
395 let ptr = Self::as_leaf_ptr(&self);
396 unsafe { &*ptr }
398 }
399
400 pub(super) fn keys(&self) -> &[K] {
402 let leaf = self.into_leaf();
403 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 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 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}
433
434impl<'a, K, V, Type> NodeRef<marker::Mut<'a>, K, V, Type> {
435 unsafe fn reborrow_mut(&mut self) -> NodeRef<marker::Mut<'_>, K, V, Type> {
446 NodeRef { height: self.height, node: self.node, _marker: PhantomData }
447 }
448
449 fn as_leaf_mut(&mut self) -> &mut LeafNode<K, V> {
451 let ptr = Self::as_leaf_ptr(self);
452 unsafe { &mut *ptr }
454 }
455
456 fn into_leaf_mut(mut self) -> &'a mut LeafNode<K, V> {
458 let ptr = Self::as_leaf_ptr(&mut self);
459 unsafe { &mut *ptr }
461 }
462
463 pub(super) fn dormant(&self) -> NodeRef<marker::DormantMut, K, V, Type> {
466 NodeRef { height: self.height, node: self.node, _marker: PhantomData }
467 }
468}
469
470impl<K, V, Type> NodeRef<marker::DormantMut, K, V, Type> {
471 pub(super) unsafe fn awaken<'a>(self) -> NodeRef<marker::Mut<'a>, K, V, Type> {
478 NodeRef { height: self.height, node: self.node, _marker: PhantomData }
479 }
480}
481
482impl<K, V, Type> NodeRef<marker::Dying, K, V, Type> {
483 fn as_leaf_dying(&mut self) -> &mut LeafNode<K, V> {
485 let ptr = Self::as_leaf_ptr(self);
486 unsafe { &mut *ptr }
488 }
489}
490
491impl<'a, K: 'a, V: 'a, Type> NodeRef<marker::Mut<'a>, K, V, Type> {
492 unsafe fn key_area_mut<I, Output: ?Sized>(&mut self, index: I) -> &mut Output
497 where
498 I: SliceIndex<[MaybeUninit<K>], Output = Output>,
499 {
500 unsafe { self.as_leaf_mut().keys.as_mut_slice().get_unchecked_mut(index) }
504 }
505
506 unsafe fn val_area_mut<I, Output: ?Sized>(&mut self, index: I) -> &mut Output
511 where
512 I: SliceIndex<[MaybeUninit<V>], Output = Output>,
513 {
514 unsafe { self.as_leaf_mut().vals.as_mut_slice().get_unchecked_mut(index) }
518 }
519}
520
521impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
522 unsafe fn edge_area_mut<I, Output: ?Sized>(&mut self, index: I) -> &mut Output
527 where
528 I: SliceIndex<[MaybeUninit<BoxedNode<K, V>>], Output = Output>,
529 {
530 unsafe { self.as_internal_mut().edges.as_mut_slice().get_unchecked_mut(index) }
534 }
535}
536
537impl<'a, K, V, Type> NodeRef<marker::ValMut<'a>, K, V, Type> {
538 unsafe fn into_key_val_mut_at(mut self, idx: usize) -> (&'a K, &'a mut V) {
541 let leaf = Self::as_leaf_ptr(&mut self);
545 let keys = unsafe { &raw const (*leaf).keys };
547 let vals = unsafe { &raw mut (*leaf).vals };
549 let keys: *const [_] = keys;
551 let vals: *mut [_] = vals;
552 let key = unsafe { (&*keys.get_unchecked(idx)).assume_init_ref() };
554 let val = unsafe { (&mut *vals.get_unchecked_mut(idx)).assume_init_mut() };
556 (key, val)
557 }
558}
559
560impl<'a, K: 'a, V: 'a, Type> NodeRef<marker::Mut<'a>, K, V, Type> {
561 pub(super) fn len_mut(&mut self) -> &mut u16 {
563 &mut self.as_leaf_mut().len
564 }
565}
566
567impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
568 unsafe fn correct_childrens_parent_links<R: Iterator<Item = usize>>(&mut self, range: R) {
571 for i in range {
572 if true {
if !(i <= self.len()) {
::core::panicking::panic("assertion failed: i <= self.len()")
};
};debug_assert!(i <= self.len());
573 unsafe { Handle::new_edge(self.reborrow_mut(), i) }.correct_parent_link();
575 }
576 }
577
578 fn correct_all_childrens_parent_links(&mut self) {
579 let len = self.len();
580 unsafe { self.correct_childrens_parent_links(0..=len) };
582 }
583}
584
585impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
586 fn set_parent_link(&mut self, parent: NonNull<InternalNode<K, V>>, parent_idx: usize) {
589 let leaf = Self::as_leaf_ptr(self);
590 unsafe { (*leaf).parent = Some(parent) };
592 unsafe { (*leaf).parent_idx.write(parent_idx as u16) };
594 }
595}
596
597impl<K, V> NodeRef<marker::Owned, K, V, marker::LeafOrInternal> {
598 fn clear_parent_link(&mut self) {
600 let mut root_node = self.borrow_mut();
601 let leaf = root_node.as_leaf_mut();
602 leaf.parent = None;
603 }
604}
605
606impl<K, V> NodeRef<marker::Owned, K, V, marker::LeafOrInternal> {
607 pub(super) fn new<A: AllocatorClone>(alloc: A) -> Self {
609 NodeRef::new_leaf(alloc).forget_type()
610 }
611
612 pub(super) fn push_internal_level<A: AllocatorClone>(
616 &mut self,
617 alloc: A,
618 ) -> NodeRef<marker::Mut<'_>, K, V, marker::Internal> {
619 super::mem::take_mut(self, |old_root| NodeRef::new_internal(old_root, alloc).forget_type());
620
621 NodeRef { height: self.height, node: self.node, _marker: PhantomData }
623 }
624
625 pub(super) fn pop_internal_level<A: AllocatorClone>(&mut self, alloc: A) {
635 if !(self.height > 0) {
::core::panicking::panic("assertion failed: self.height > 0")
};assert!(self.height > 0);
636
637 let top = self.node;
638
639 let mut internal_self = unsafe { self.borrow_mut().cast_to_internal_unchecked() };
641 let internal_node = internal_self.as_internal_mut();
642 self.node = unsafe { internal_node.edges[0].assume_init_read() };
644 self.height -= 1;
645 self.clear_parent_link();
646
647 unsafe {
649 alloc.deallocate(top.cast(), Layout::new::<InternalNode<K, V>>());
650 }
651 }
652}
653
654impl<K, V, Type> NodeRef<marker::Owned, K, V, Type> {
655 pub(super) fn borrow_mut(&mut self) -> NodeRef<marker::Mut<'_>, K, V, Type> {
659 NodeRef { height: self.height, node: self.node, _marker: PhantomData }
660 }
661
662 pub(super) fn borrow_valmut(&mut self) -> NodeRef<marker::ValMut<'_>, K, V, Type> {
664 NodeRef { height: self.height, node: self.node, _marker: PhantomData }
665 }
666
667 pub(super) fn into_dying(self) -> NodeRef<marker::Dying, K, V, Type> {
670 NodeRef { height: self.height, node: self.node, _marker: PhantomData }
671 }
672}
673
674impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::Leaf> {
675 pub(super) unsafe fn push_with_handle<'b>(
682 &mut self,
683 key: K,
684 val: V,
685 ) -> Handle<NodeRef<marker::Mut<'b>, K, V, marker::Leaf>, marker::KV> {
686 let len = self.len_mut();
687 let idx = usize::from(*len);
688 if !(idx < CAPACITY) {
::core::panicking::panic("assertion failed: idx < CAPACITY")
};assert!(idx < CAPACITY);
689 *len += 1;
690 unsafe {
692 self.key_area_mut(idx).write(key);
693 self.val_area_mut(idx).write(val);
694 Handle::new_kv(
695 NodeRef { height: self.height, node: self.node, _marker: PhantomData },
696 idx,
697 )
698 }
699 }
700
701 pub(super) fn push(&mut self, key: K, val: V) -> *mut V {
704 unsafe { self.push_with_handle(key, val).into_val_mut() }
706 }
707}
708
709impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
710 pub(super) fn push(&mut self, key: K, val: V, edge: Root<K, V>) {
713 if !(edge.height == self.height - 1) {
::core::panicking::panic("assertion failed: edge.height == self.height - 1")
};assert!(edge.height == self.height - 1);
714
715 let len = self.len_mut();
716 let idx = usize::from(*len);
717 if !(idx < CAPACITY) {
::core::panicking::panic("assertion failed: idx < CAPACITY")
};assert!(idx < CAPACITY);
718 *len += 1;
719 unsafe {
721 self.key_area_mut(idx).write(key);
722 self.val_area_mut(idx).write(val);
723 self.edge_area_mut(idx + 1).write(edge.node);
724 Handle::new_edge(self.reborrow_mut(), idx + 1).correct_parent_link();
725 }
726 }
727}
728
729impl<BorrowType, K, V> NodeRef<BorrowType, K, V, marker::Leaf> {
730 pub(super) fn forget_type(self) -> NodeRef<BorrowType, K, V, marker::LeafOrInternal> {
732 NodeRef { height: self.height, node: self.node, _marker: PhantomData }
733 }
734}
735
736impl<BorrowType, K, V> NodeRef<BorrowType, K, V, marker::Internal> {
737 pub(super) fn forget_type(self) -> NodeRef<BorrowType, K, V, marker::LeafOrInternal> {
739 NodeRef { height: self.height, node: self.node, _marker: PhantomData }
740 }
741}
742
743impl<BorrowType, K, V> NodeRef<BorrowType, K, V, marker::LeafOrInternal> {
744 pub(super) fn force(
746 self,
747 ) -> ForceResult<
748 NodeRef<BorrowType, K, V, marker::Leaf>,
749 NodeRef<BorrowType, K, V, marker::Internal>,
750 > {
751 if self.height == 0 {
752 ForceResult::Leaf(NodeRef {
753 height: self.height,
754 node: self.node,
755 _marker: PhantomData,
756 })
757 } else {
758 ForceResult::Internal(NodeRef {
759 height: self.height,
760 node: self.node,
761 _marker: PhantomData,
762 })
763 }
764 }
765}
766
767impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
768 pub(super) unsafe fn cast_to_leaf_unchecked(
770 self,
771 ) -> NodeRef<marker::Mut<'a>, K, V, marker::Leaf> {
772 if true {
if !(self.height == 0) {
::core::panicking::panic("assertion failed: self.height == 0")
};
};debug_assert!(self.height == 0);
773 NodeRef { height: self.height, node: self.node, _marker: PhantomData }
774 }
775
776 unsafe fn cast_to_internal_unchecked(self) -> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
778 if true {
if !(self.height > 0) {
::core::panicking::panic("assertion failed: self.height > 0")
};
};debug_assert!(self.height > 0);
779 NodeRef { height: self.height, node: self.node, _marker: PhantomData }
780 }
781}
782
783pub(super) struct Handle<Node, Type> {
792 node: Node,
793 idx: usize,
794 _marker: PhantomData<Type>,
795}
796
797impl<Node: Copy, Type> Copy for Handle<Node, Type> {}
798impl<Node: Copy, Type> Clone for Handle<Node, Type> {
801 fn clone(&self) -> Self {
802 *self
803 }
804}
805
806impl<Node, Type> Handle<Node, Type> {
807 pub(super) fn into_node(self) -> Node {
809 self.node
810 }
811
812 pub(super) fn idx(&self) -> usize {
814 self.idx
815 }
816}
817
818impl<BorrowType, K, V, NodeType> Handle<NodeRef<BorrowType, K, V, NodeType>, marker::KV> {
819 pub(super) unsafe fn new_kv(node: NodeRef<BorrowType, K, V, NodeType>, idx: usize) -> Self {
822 if true {
if !(idx < node.len()) {
::core::panicking::panic("assertion failed: idx < node.len()")
};
};debug_assert!(idx < node.len());
823
824 Handle { node, idx, _marker: PhantomData }
825 }
826
827 pub(super) fn left_edge(self) -> Handle<NodeRef<BorrowType, K, V, NodeType>, marker::Edge> {
828 unsafe { Handle::new_edge(self.node, self.idx) }
830 }
831
832 pub(super) fn right_edge(self) -> Handle<NodeRef<BorrowType, K, V, NodeType>, marker::Edge> {
833 unsafe { Handle::new_edge(self.node, self.idx + 1) }
835 }
836}
837
838impl<BorrowType, K, V, NodeType, HandleType> PartialEq
839 for Handle<NodeRef<BorrowType, K, V, NodeType>, HandleType>
840{
841 fn eq(&self, other: &Self) -> bool {
842 let Self { node, idx, _marker } = self;
843 node.eq(&other.node) && *idx == other.idx
844 }
845}
846
847impl<BorrowType, K, V, NodeType, HandleType>
848 Handle<NodeRef<BorrowType, K, V, NodeType>, HandleType>
849{
850 pub(super) fn reborrow(
852 &self,
853 ) -> Handle<NodeRef<marker::Immut<'_>, K, V, NodeType>, HandleType> {
854 Handle { node: self.node.reborrow(), idx: self.idx, _marker: PhantomData }
856 }
857}
858
859impl<'a, K, V, NodeType, HandleType> Handle<NodeRef<marker::Mut<'a>, K, V, NodeType>, HandleType> {
860 pub(super) unsafe fn reborrow_mut(
866 &mut self,
867 ) -> Handle<NodeRef<marker::Mut<'_>, K, V, NodeType>, HandleType> {
868 Handle { node: unsafe { self.node.reborrow_mut() }, idx: self.idx, _marker: PhantomData }
871 }
872
873 pub(super) fn dormant(
877 &self,
878 ) -> Handle<NodeRef<marker::DormantMut, K, V, NodeType>, HandleType> {
879 Handle { node: self.node.dormant(), idx: self.idx, _marker: PhantomData }
880 }
881}
882
883impl<K, V, NodeType, HandleType> Handle<NodeRef<marker::DormantMut, K, V, NodeType>, HandleType> {
884 pub(super) unsafe fn awaken<'a>(
891 self,
892 ) -> Handle<NodeRef<marker::Mut<'a>, K, V, NodeType>, HandleType> {
893 Handle { node: unsafe { self.node.awaken() }, idx: self.idx, _marker: PhantomData }
895 }
896}
897
898impl<BorrowType, K, V, NodeType> Handle<NodeRef<BorrowType, K, V, NodeType>, marker::Edge> {
899 pub(super) unsafe fn new_edge(node: NodeRef<BorrowType, K, V, NodeType>, idx: usize) -> Self {
902 if true {
if !(idx <= node.len()) {
::core::panicking::panic("assertion failed: idx <= node.len()")
};
};debug_assert!(idx <= node.len());
903
904 Handle { node, idx, _marker: PhantomData }
905 }
906
907 pub(super) fn left_kv(
908 self,
909 ) -> Result<Handle<NodeRef<BorrowType, K, V, NodeType>, marker::KV>, Self> {
910 if self.idx > 0 {
911 Ok(unsafe { Handle::new_kv(self.node, self.idx - 1) })
913 } else {
914 Err(self)
915 }
916 }
917
918 pub(super) fn right_kv(
919 self,
920 ) -> Result<Handle<NodeRef<BorrowType, K, V, NodeType>, marker::KV>, Self> {
921 if self.idx < self.node.len() {
922 Ok(unsafe { Handle::new_kv(self.node, self.idx) })
924 } else {
925 Err(self)
926 }
927 }
928}
929
930pub(super) enum LeftOrRight<T> {
931 Left(T),
932 Right(T),
933}
934
935fn splitpoint(edge_idx: usize) -> (usize, LeftOrRight<usize>) {
941 if true {
if !(edge_idx <= CAPACITY) {
::core::panicking::panic("assertion failed: edge_idx <= CAPACITY")
};
};debug_assert!(edge_idx <= CAPACITY);
942 match edge_idx {
944 0..EDGE_IDX_LEFT_OF_CENTER => (KV_IDX_CENTER - 1, LeftOrRight::Left(edge_idx)),
945 EDGE_IDX_LEFT_OF_CENTER => (KV_IDX_CENTER, LeftOrRight::Left(edge_idx)),
946 EDGE_IDX_RIGHT_OF_CENTER => (KV_IDX_CENTER, LeftOrRight::Right(0)),
947 _ => (KV_IDX_CENTER + 1, LeftOrRight::Right(edge_idx - (KV_IDX_CENTER + 1 + 1))),
948 }
949}
950
951impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::Edge> {
952 unsafe fn insert_fit(
956 mut self,
957 key: K,
958 val: V,
959 ) -> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::KV> {
960 if true {
if !(self.node.len() < CAPACITY) {
::core::panicking::panic("assertion failed: self.node.len() < CAPACITY")
};
};debug_assert!(self.node.len() < CAPACITY);
961 let new_len = self.node.len() + 1;
962
963 unsafe {
965 slice_insert(self.node.key_area_mut(..new_len), self.idx, key);
966 slice_insert(self.node.val_area_mut(..new_len), self.idx, val);
967 *self.node.len_mut() = new_len as u16;
968
969 Handle::new_kv(self.node, self.idx)
970 }
971 }
972}
973
974impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::Edge> {
975 fn insert<A: AllocatorClone>(
981 self,
982 key: K,
983 val: V,
984 alloc: A,
985 ) -> (
986 Option<SplitResult<'a, K, V, marker::Leaf>>,
987 Handle<NodeRef<marker::DormantMut, K, V, marker::Leaf>, marker::KV>,
988 ) {
989 if self.node.len() < CAPACITY {
990 let handle = unsafe { self.insert_fit(key, val) };
992 (None, handle.dormant())
993 } else {
994 let (middle_kv_idx, insertion) = splitpoint(self.idx);
995 let middle = unsafe { Handle::new_kv(self.node, middle_kv_idx) };
997 let mut result = middle.split(alloc);
998 let insertion_edge = match insertion {
999 LeftOrRight::Left(insert_idx) => unsafe {
1001 Handle::new_edge(result.left.reborrow_mut(), insert_idx)
1002 },
1003 LeftOrRight::Right(insert_idx) => unsafe {
1005 Handle::new_edge(result.right.borrow_mut(), insert_idx)
1006 },
1007 };
1008 let handle = unsafe { insertion_edge.insert_fit(key, val).dormant() };
1011 (Some(result), handle)
1012 }
1013 }
1014}
1015
1016impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::Edge> {
1017 fn correct_parent_link(self) {
1020 let ptr = unsafe { NonNull::new_unchecked(NodeRef::as_internal_ptr(&self.node)) };
1023 let idx = self.idx;
1024 let mut child = self.descend();
1025 child.set_parent_link(ptr, idx);
1026 }
1027}
1028
1029impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::Edge> {
1030 fn insert_fit(&mut self, key: K, val: V, edge: Root<K, V>) {
1034 if true {
if !(self.node.len() < CAPACITY) {
::core::panicking::panic("assertion failed: self.node.len() < CAPACITY")
};
};debug_assert!(self.node.len() < CAPACITY);
1035 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);
1036 let new_len = self.node.len() + 1;
1037
1038 unsafe {
1040 slice_insert(self.node.key_area_mut(..new_len), self.idx, key);
1041 slice_insert(self.node.val_area_mut(..new_len), self.idx, val);
1042 slice_insert(self.node.edge_area_mut(..new_len + 1), self.idx + 1, edge.node);
1043 *self.node.len_mut() = new_len as u16;
1044
1045 self.node.correct_childrens_parent_links(self.idx + 1..new_len + 1);
1046 }
1047 }
1048
1049 fn insert<A: AllocatorClone>(
1053 mut self,
1054 key: K,
1055 val: V,
1056 edge: Root<K, V>,
1057 alloc: A,
1058 ) -> Option<SplitResult<'a, K, V, marker::Internal>> {
1059 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);
1060
1061 if self.node.len() < CAPACITY {
1062 self.insert_fit(key, val, edge);
1063 None
1064 } else {
1065 let (middle_kv_idx, insertion) = splitpoint(self.idx);
1066 let middle = unsafe { Handle::new_kv(self.node, middle_kv_idx) };
1068 let mut result = middle.split(alloc);
1069 let mut insertion_edge = match insertion {
1070 LeftOrRight::Left(insert_idx) => unsafe {
1072 Handle::new_edge(result.left.reborrow_mut(), insert_idx)
1073 },
1074 LeftOrRight::Right(insert_idx) => unsafe {
1076 Handle::new_edge(result.right.borrow_mut(), insert_idx)
1077 },
1078 };
1079 insertion_edge.insert_fit(key, val, edge);
1080 Some(result)
1081 }
1082 }
1083}
1084
1085impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::Edge> {
1086 pub(super) fn insert_recursing<A: AllocatorClone>(
1094 self,
1095 key: K,
1096 value: V,
1097 alloc: A,
1098 split_root: impl FnOnce(SplitResult<'a, K, V, marker::LeafOrInternal>),
1099 ) -> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::KV> {
1100 let (mut split, handle) = match self.insert(key, value, alloc.clone()) {
1101 (None, handle) => return unsafe { handle.awaken() },
1104 (Some(split), handle) => (split.forget_node_type(), handle),
1105 };
1106
1107 loop {
1108 split = match split.left.ascend() {
1109 Ok(parent) => {
1110 match parent.insert(split.kv.0, split.kv.1, split.right, alloc.clone()) {
1111 None => return unsafe { handle.awaken() },
1114 Some(split) => split.forget_node_type(),
1115 }
1116 }
1117 Err(root) => {
1118 split_root(SplitResult { left: root, ..split });
1119 return unsafe { handle.awaken() };
1122 }
1123 };
1124 }
1125 }
1126}
1127
1128impl<BorrowType: marker::BorrowType, K, V>
1129 Handle<NodeRef<BorrowType, K, V, marker::Internal>, marker::Edge>
1130{
1131 pub(super) fn descend(self) -> NodeRef<BorrowType, K, V, marker::LeafOrInternal> {
1138 const {
1139 if !BorrowType::TRAVERSAL_PERMIT {
::core::panicking::panic("assertion failed: BorrowType::TRAVERSAL_PERMIT")
};assert!(BorrowType::TRAVERSAL_PERMIT);
1140 }
1141
1142 let parent_ptr = NodeRef::as_internal_ptr(&self.node);
1150 let node = unsafe { (*parent_ptr).edges.get_unchecked(self.idx).assume_init_read() };
1152 NodeRef { node, height: self.node.height - 1, _marker: PhantomData }
1153 }
1154}
1155
1156impl<'a, K: 'a, V: 'a, NodeType> Handle<NodeRef<marker::Immut<'a>, K, V, NodeType>, marker::KV> {
1157 pub(super) fn into_kv(self) -> (&'a K, &'a V) {
1158 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());
1159 let leaf = self.node.into_leaf();
1160 let k = unsafe { leaf.keys.get_unchecked(self.idx).assume_init_ref() };
1162 let v = unsafe { leaf.vals.get_unchecked(self.idx).assume_init_ref() };
1164 (k, v)
1165 }
1166}
1167
1168impl<'a, K: 'a, V: 'a, NodeType> Handle<NodeRef<marker::Mut<'a>, K, V, NodeType>, marker::KV> {
1169 pub(super) fn key_mut(&mut self) -> &mut K {
1170 unsafe { self.node.key_area_mut(self.idx).assume_init_mut() }
1172 }
1173
1174 pub(super) fn into_val_mut(self) -> &'a mut V {
1175 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());
1176 let leaf = self.node.into_leaf_mut();
1177 unsafe { leaf.vals.get_unchecked_mut(self.idx).assume_init_mut() }
1179 }
1180
1181 pub(super) fn into_kv_mut(self) -> (&'a mut K, &'a mut V) {
1182 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());
1183 let leaf = self.node.into_leaf_mut();
1184 let k = unsafe { leaf.keys.get_unchecked_mut(self.idx).assume_init_mut() };
1186 let v = unsafe { leaf.vals.get_unchecked_mut(self.idx).assume_init_mut() };
1188 (k, v)
1189 }
1190}
1191
1192impl<'a, K, V, NodeType> Handle<NodeRef<marker::ValMut<'a>, K, V, NodeType>, marker::KV> {
1193 pub(super) fn into_kv_valmut(self) -> (&'a K, &'a mut V) {
1194 unsafe { self.node.into_key_val_mut_at(self.idx) }
1196 }
1197}
1198
1199impl<'a, K: 'a, V: 'a, NodeType> Handle<NodeRef<marker::Mut<'a>, K, V, NodeType>, marker::KV> {
1200 pub(super) fn kv_mut(&mut self) -> (&mut K, &mut V) {
1201 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());
1202 unsafe {
1206 let leaf = self.node.as_leaf_mut();
1207 let key = leaf.keys.get_unchecked_mut(self.idx).assume_init_mut();
1208 let val = leaf.vals.get_unchecked_mut(self.idx).assume_init_mut();
1209 (key, val)
1210 }
1211 }
1212
1213 pub(super) fn replace_kv(&mut self, k: K, v: V) -> (K, V) {
1215 let (key, val) = self.kv_mut();
1216 (mem::replace(key, k), mem::replace(val, v))
1217 }
1218}
1219
1220impl<K, V, NodeType> Handle<NodeRef<marker::Dying, K, V, NodeType>, marker::KV> {
1221 pub(super) unsafe fn into_key_val(mut self) -> (K, V) {
1225 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());
1226 let leaf = self.node.as_leaf_dying();
1227 unsafe {
1229 let key = leaf.keys.get_unchecked_mut(self.idx).assume_init_read();
1230 let val = leaf.vals.get_unchecked_mut(self.idx).assume_init_read();
1231 (key, val)
1232 }
1233 }
1234
1235 #[inline]
1239 pub(super) unsafe fn drop_key_val(mut self) {
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 let leaf = self.node.as_leaf_dying();
1242 unsafe {
1244 let key = leaf.keys.get_unchecked_mut(self.idx);
1245 let val = leaf.vals.get_unchecked_mut(self.idx);
1246 let _guard = DropGuard::new(val, |val| val.assume_init_drop());
1248 key.assume_init_drop();
1249 }
1251 }
1252}
1253
1254impl<'a, K: 'a, V: 'a, NodeType> Handle<NodeRef<marker::Mut<'a>, K, V, NodeType>, marker::KV> {
1255 fn split_leaf_data(&mut self, new_node: &mut LeafNode<K, V>) -> (K, V) {
1258 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());
1259 let old_len = self.node.len();
1260 let new_len = old_len - self.idx - 1;
1261 new_node.len = new_len as u16;
1262 unsafe {
1264 let k = self.node.key_area_mut(self.idx).assume_init_read();
1265 let v = self.node.val_area_mut(self.idx).assume_init_read();
1266
1267 move_to_slice(
1268 self.node.key_area_mut(self.idx + 1..old_len),
1269 &mut new_node.keys[..new_len],
1270 );
1271 move_to_slice(
1272 self.node.val_area_mut(self.idx + 1..old_len),
1273 &mut new_node.vals[..new_len],
1274 );
1275
1276 *self.node.len_mut() = self.idx as u16;
1277 (k, v)
1278 }
1279 }
1280}
1281
1282impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::KV> {
1283 pub(super) fn split<A: AllocatorClone>(
1291 mut self,
1292 alloc: A,
1293 ) -> SplitResult<'a, K, V, marker::Leaf> {
1294 let mut new_node = LeafNode::new(alloc);
1295
1296 let kv = self.split_leaf_data(&mut new_node);
1297
1298 let right = NodeRef::from_new_leaf(new_node);
1299 SplitResult { left: self.node, kv, right }
1300 }
1301
1302 pub(super) fn remove(
1305 mut self,
1306 ) -> ((K, V), Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::Edge>) {
1307 let old_len = self.node.len();
1308 unsafe {
1310 let k = slice_remove(self.node.key_area_mut(..old_len), self.idx);
1311 let v = slice_remove(self.node.val_area_mut(..old_len), self.idx);
1312 *self.node.len_mut() = (old_len - 1) as u16;
1313 ((k, v), self.left_edge())
1314 }
1315 }
1316}
1317
1318impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::KV> {
1319 pub(super) fn split<A: AllocatorClone>(
1327 mut self,
1328 alloc: A,
1329 ) -> SplitResult<'a, K, V, marker::Internal> {
1330 let old_len = self.node.len();
1331 unsafe {
1333 let mut new_node = InternalNode::new(alloc);
1334 let kv = self.split_leaf_data(&mut new_node.data);
1335 let new_len = usize::from(new_node.data.len);
1336 move_to_slice(
1337 self.node.edge_area_mut(self.idx + 1..old_len + 1),
1338 &mut new_node.edges[..new_len + 1],
1339 );
1340
1341 let height = NonZero::new_unchecked(self.node.height);
1343 let right = NodeRef::from_new_internal(new_node, height);
1344
1345 SplitResult { left: self.node, kv, right }
1346 }
1347 }
1348}
1349
1350pub(super) struct BalancingContext<'a, K, V> {
1353 parent: Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::KV>,
1354 left_child: NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>,
1355 right_child: NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>,
1356}
1357
1358impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::KV> {
1359 pub(super) fn consider_for_balancing(self) -> BalancingContext<'a, K, V> {
1360 let self1 = unsafe { ptr::read(&self) };
1362 let self2 = unsafe { ptr::read(&self) };
1364 BalancingContext {
1365 parent: self,
1366 left_child: self1.left_edge().descend(),
1367 right_child: self2.right_edge().descend(),
1368 }
1369 }
1370}
1371
1372impl<'a, K, V> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
1373 pub(super) fn choose_parent_kv(self) -> Result<LeftOrRight<BalancingContext<'a, K, V>>, Self> {
1388 match unsafe { ptr::read(&self) }.ascend() {
1390 Ok(parent_edge) => match parent_edge.left_kv() {
1391 Ok(left_parent_kv) => Ok(LeftOrRight::Left(BalancingContext {
1392 parent: unsafe { ptr::read(&left_parent_kv) },
1394 left_child: left_parent_kv.left_edge().descend(),
1395 right_child: self,
1396 })),
1397 Err(parent_edge) => match parent_edge.right_kv() {
1398 Ok(right_parent_kv) => Ok(LeftOrRight::Right(BalancingContext {
1399 parent: unsafe { ptr::read(&right_parent_kv) },
1401 left_child: self,
1402 right_child: right_parent_kv.right_edge().descend(),
1403 })),
1404 Err(_) => {
::core::panicking::panic_fmt(format_args!("internal error: entered unreachable code: {0}",
format_args!("empty internal node")));
}unreachable!("empty internal node"),
1405 },
1406 },
1407 Err(root) => Err(root),
1408 }
1409 }
1410}
1411
1412impl<'a, K, V> BalancingContext<'a, K, V> {
1413 pub(super) fn left_child_len(&self) -> usize {
1414 self.left_child.len()
1415 }
1416
1417 pub(super) fn right_child_len(&self) -> usize {
1418 self.right_child.len()
1419 }
1420
1421 pub(super) fn into_left_child(self) -> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
1422 self.left_child
1423 }
1424
1425 pub(super) fn into_right_child(self) -> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
1426 self.right_child
1427 }
1428
1429 pub(super) fn can_merge(&self) -> bool {
1432 self.left_child.len() + 1 + self.right_child.len() <= CAPACITY
1433 }
1434}
1435
1436impl<'a, K: 'a, V: 'a> BalancingContext<'a, K, V> {
1437 fn do_merge<
1439 F: FnOnce(
1440 NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
1441 NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>,
1442 ) -> R,
1443 R,
1444 A: Allocator,
1445 >(
1446 self,
1447 result: F,
1448 alloc: A,
1449 ) -> R {
1450 let Handle { node: mut parent_node, idx: parent_idx, _marker } = self.parent;
1451 let old_parent_len = parent_node.len();
1452 let mut left_node = self.left_child;
1453 let old_left_len = left_node.len();
1454 let mut right_node = self.right_child;
1455 let right_len = right_node.len();
1456 let new_left_len = old_left_len + 1 + right_len;
1457
1458 if !(new_left_len <= CAPACITY) {
::core::panicking::panic("assertion failed: new_left_len <= CAPACITY")
};assert!(new_left_len <= CAPACITY);
1459
1460 unsafe {
1462 *left_node.len_mut() = new_left_len as u16;
1463
1464 let parent_key = slice_remove(parent_node.key_area_mut(..old_parent_len), parent_idx);
1465 left_node.key_area_mut(old_left_len).write(parent_key);
1466 move_to_slice(
1467 right_node.key_area_mut(..right_len),
1468 left_node.key_area_mut(old_left_len + 1..new_left_len),
1469 );
1470
1471 let parent_val = slice_remove(parent_node.val_area_mut(..old_parent_len), parent_idx);
1472 left_node.val_area_mut(old_left_len).write(parent_val);
1473 move_to_slice(
1474 right_node.val_area_mut(..right_len),
1475 left_node.val_area_mut(old_left_len + 1..new_left_len),
1476 );
1477
1478 slice_remove(parent_node.edge_area_mut(..old_parent_len + 1), parent_idx + 1);
1479 parent_node.correct_childrens_parent_links(parent_idx + 1..old_parent_len);
1480 *parent_node.len_mut() -= 1;
1481
1482 if parent_node.height > 1 {
1483 let mut left_node = left_node.reborrow_mut().cast_to_internal_unchecked();
1486 let mut right_node = right_node.cast_to_internal_unchecked();
1487 move_to_slice(
1488 right_node.edge_area_mut(..right_len + 1),
1489 left_node.edge_area_mut(old_left_len + 1..new_left_len + 1),
1490 );
1491
1492 left_node.correct_childrens_parent_links(old_left_len + 1..new_left_len + 1);
1493
1494 alloc.deallocate(right_node.node.cast(), Layout::new::<InternalNode<K, V>>());
1495 } else {
1496 alloc.deallocate(right_node.node.cast(), Layout::new::<LeafNode<K, V>>());
1497 }
1498 }
1499 result(parent_node, left_node)
1500 }
1501
1502 pub(super) fn merge_tracking_parent<A: AllocatorClone>(
1507 self,
1508 alloc: A,
1509 ) -> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
1510 self.do_merge(|parent, _child| parent, alloc)
1511 }
1512
1513 pub(super) fn merge_tracking_child<A: AllocatorClone>(
1518 self,
1519 alloc: A,
1520 ) -> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
1521 self.do_merge(|_parent, child| child, alloc)
1522 }
1523
1524 pub(super) fn merge_tracking_child_edge<A: AllocatorClone>(
1530 self,
1531 track_edge_idx: LeftOrRight<usize>,
1532 alloc: A,
1533 ) -> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>, marker::Edge> {
1534 let old_left_len = self.left_child.len();
1535 let right_len = self.right_child.len();
1536 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 {
1537 LeftOrRight::Left(idx) => idx <= old_left_len,
1538 LeftOrRight::Right(idx) => idx <= right_len,
1539 });
1540 let child = self.merge_tracking_child(alloc);
1541 let new_idx = match track_edge_idx {
1542 LeftOrRight::Left(idx) => idx,
1543 LeftOrRight::Right(idx) => old_left_len + 1 + idx,
1544 };
1545 unsafe { Handle::new_edge(child, new_idx) }
1547 }
1548
1549 pub(super) fn steal_left(
1554 mut self,
1555 track_right_edge_idx: usize,
1556 ) -> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>, marker::Edge> {
1557 self.bulk_steal_left(1);
1558 unsafe { Handle::new_edge(self.right_child, 1 + track_right_edge_idx) }
1560 }
1561
1562 pub(super) fn steal_right(
1567 mut self,
1568 track_left_edge_idx: usize,
1569 ) -> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>, marker::Edge> {
1570 self.bulk_steal_right(1);
1571 unsafe { Handle::new_edge(self.left_child, track_left_edge_idx) }
1573 }
1574
1575 pub(super) fn bulk_steal_left(&mut self, count: usize) {
1577 if !(count > 0) { ::core::panicking::panic("assertion failed: count > 0") };assert!(count > 0);
1578 unsafe {
1580 let left_node = &mut self.left_child;
1581 let old_left_len = left_node.len();
1582 let right_node = &mut self.right_child;
1583 let old_right_len = right_node.len();
1584
1585 if !(old_right_len + count <= CAPACITY) {
::core::panicking::panic("assertion failed: old_right_len + count <= CAPACITY")
};assert!(old_right_len + count <= CAPACITY);
1587 if !(old_left_len >= count) {
::core::panicking::panic("assertion failed: old_left_len >= count")
};assert!(old_left_len >= count);
1588
1589 let new_left_len = old_left_len - count;
1590 let new_right_len = old_right_len + count;
1591 *left_node.len_mut() = new_left_len as u16;
1592 *right_node.len_mut() = new_right_len as u16;
1593
1594 {
1596 slice_shr(right_node.key_area_mut(..new_right_len), count);
1598 slice_shr(right_node.val_area_mut(..new_right_len), count);
1599
1600 move_to_slice(
1602 left_node.key_area_mut(new_left_len + 1..old_left_len),
1603 right_node.key_area_mut(..count - 1),
1604 );
1605 move_to_slice(
1606 left_node.val_area_mut(new_left_len + 1..old_left_len),
1607 right_node.val_area_mut(..count - 1),
1608 );
1609
1610 let k = left_node.key_area_mut(new_left_len).assume_init_read();
1612 let v = left_node.val_area_mut(new_left_len).assume_init_read();
1613 let (k, v) = self.parent.replace_kv(k, v);
1614
1615 right_node.key_area_mut(count - 1).write(k);
1617 right_node.val_area_mut(count - 1).write(v);
1618 }
1619
1620 match (left_node.reborrow_mut().force(), right_node.reborrow_mut().force()) {
1621 (ForceResult::Internal(mut left), ForceResult::Internal(mut right)) => {
1622 slice_shr(right.edge_area_mut(..new_right_len + 1), count);
1624
1625 move_to_slice(
1627 left.edge_area_mut(new_left_len + 1..old_left_len + 1),
1628 right.edge_area_mut(..count),
1629 );
1630
1631 right.correct_childrens_parent_links(0..new_right_len + 1);
1632 }
1633 (ForceResult::Leaf(_), ForceResult::Leaf(_)) => {}
1634 _ => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
1635 }
1636 }
1637 }
1638
1639 pub(super) fn bulk_steal_right(&mut self, count: usize) {
1641 if !(count > 0) { ::core::panicking::panic("assertion failed: count > 0") };assert!(count > 0);
1642 unsafe {
1644 let left_node = &mut self.left_child;
1645 let old_left_len = left_node.len();
1646 let right_node = &mut self.right_child;
1647 let old_right_len = right_node.len();
1648
1649 if !(old_left_len + count <= CAPACITY) {
::core::panicking::panic("assertion failed: old_left_len + count <= CAPACITY")
};assert!(old_left_len + count <= CAPACITY);
1651 if !(old_right_len >= count) {
::core::panicking::panic("assertion failed: old_right_len >= count")
};assert!(old_right_len >= count);
1652
1653 let new_left_len = old_left_len + count;
1654 let new_right_len = old_right_len - count;
1655 *left_node.len_mut() = new_left_len as u16;
1656 *right_node.len_mut() = new_right_len as u16;
1657
1658 {
1660 let k = right_node.key_area_mut(count - 1).assume_init_read();
1662 let v = right_node.val_area_mut(count - 1).assume_init_read();
1663 let (k, v) = self.parent.replace_kv(k, v);
1664
1665 left_node.key_area_mut(old_left_len).write(k);
1667 left_node.val_area_mut(old_left_len).write(v);
1668
1669 move_to_slice(
1671 right_node.key_area_mut(..count - 1),
1672 left_node.key_area_mut(old_left_len + 1..new_left_len),
1673 );
1674 move_to_slice(
1675 right_node.val_area_mut(..count - 1),
1676 left_node.val_area_mut(old_left_len + 1..new_left_len),
1677 );
1678
1679 slice_shl(right_node.key_area_mut(..old_right_len), count);
1681 slice_shl(right_node.val_area_mut(..old_right_len), count);
1682 }
1683
1684 match (left_node.reborrow_mut().force(), right_node.reborrow_mut().force()) {
1685 (ForceResult::Internal(mut left), ForceResult::Internal(mut right)) => {
1686 move_to_slice(
1688 right.edge_area_mut(..count),
1689 left.edge_area_mut(old_left_len + 1..new_left_len + 1),
1690 );
1691
1692 slice_shl(right.edge_area_mut(..old_right_len + 1), count);
1694
1695 left.correct_childrens_parent_links(old_left_len + 1..new_left_len + 1);
1696 right.correct_childrens_parent_links(0..new_right_len + 1);
1697 }
1698 (ForceResult::Leaf(_), ForceResult::Leaf(_)) => {}
1699 _ => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
1700 }
1701 }
1702 }
1703}
1704
1705impl<BorrowType, K, V> Handle<NodeRef<BorrowType, K, V, marker::Leaf>, marker::Edge> {
1706 pub(super) fn forget_node_type(
1707 self,
1708 ) -> Handle<NodeRef<BorrowType, K, V, marker::LeafOrInternal>, marker::Edge> {
1709 unsafe { Handle::new_edge(self.node.forget_type(), self.idx) }
1711 }
1712}
1713
1714impl<BorrowType, K, V> Handle<NodeRef<BorrowType, K, V, marker::Internal>, marker::Edge> {
1715 pub(super) fn forget_node_type(
1716 self,
1717 ) -> Handle<NodeRef<BorrowType, K, V, marker::LeafOrInternal>, marker::Edge> {
1718 unsafe { Handle::new_edge(self.node.forget_type(), self.idx) }
1720 }
1721}
1722
1723impl<BorrowType, K, V> Handle<NodeRef<BorrowType, K, V, marker::Leaf>, marker::KV> {
1724 pub(super) fn forget_node_type(
1725 self,
1726 ) -> Handle<NodeRef<BorrowType, K, V, marker::LeafOrInternal>, marker::KV> {
1727 unsafe { Handle::new_kv(self.node.forget_type(), self.idx) }
1729 }
1730}
1731
1732impl<BorrowType, K, V, Type> Handle<NodeRef<BorrowType, K, V, marker::LeafOrInternal>, Type> {
1733 pub(super) fn force(
1735 self,
1736 ) -> ForceResult<
1737 Handle<NodeRef<BorrowType, K, V, marker::Leaf>, Type>,
1738 Handle<NodeRef<BorrowType, K, V, marker::Internal>, Type>,
1739 > {
1740 match self.node.force() {
1741 ForceResult::Leaf(node) => {
1742 ForceResult::Leaf(Handle { node, idx: self.idx, _marker: PhantomData })
1743 }
1744 ForceResult::Internal(node) => {
1745 ForceResult::Internal(Handle { node, idx: self.idx, _marker: PhantomData })
1746 }
1747 }
1748 }
1749}
1750
1751impl<'a, K, V, Type> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>, Type> {
1752 pub(super) unsafe fn cast_to_leaf_unchecked(
1754 self,
1755 ) -> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, Type> {
1756 let node = unsafe { self.node.cast_to_leaf_unchecked() };
1758 Handle { node, idx: self.idx, _marker: PhantomData }
1759 }
1760}
1761
1762impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>, marker::Edge> {
1763 pub(super) fn move_suffix(
1766 &mut self,
1767 right: &mut NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>,
1768 ) {
1769 unsafe {
1771 let new_left_len = self.idx;
1772 let mut left_node = self.reborrow_mut().into_node();
1773 let old_left_len = left_node.len();
1774
1775 let new_right_len = old_left_len - new_left_len;
1776 let mut right_node = right.reborrow_mut();
1777
1778 if !(right_node.len() == 0) {
::core::panicking::panic("assertion failed: right_node.len() == 0")
};assert!(right_node.len() == 0);
1779 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);
1780
1781 if new_right_len > 0 {
1782 *left_node.len_mut() = new_left_len as u16;
1783 *right_node.len_mut() = new_right_len as u16;
1784
1785 move_to_slice(
1786 left_node.key_area_mut(new_left_len..old_left_len),
1787 right_node.key_area_mut(..new_right_len),
1788 );
1789 move_to_slice(
1790 left_node.val_area_mut(new_left_len..old_left_len),
1791 right_node.val_area_mut(..new_right_len),
1792 );
1793 match (left_node.force(), right_node.force()) {
1794 (ForceResult::Internal(mut left), ForceResult::Internal(mut right)) => {
1795 move_to_slice(
1796 left.edge_area_mut(new_left_len + 1..old_left_len + 1),
1797 right.edge_area_mut(1..new_right_len + 1),
1798 );
1799 right.correct_childrens_parent_links(1..new_right_len + 1);
1800 }
1801 (ForceResult::Leaf(_), ForceResult::Leaf(_)) => {}
1802 _ => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
1803 }
1804 }
1805 }
1806 }
1807}
1808
1809pub(super) enum ForceResult<Leaf, Internal> {
1810 Leaf(Leaf),
1811 Internal(Internal),
1812}
1813
1814pub(super) struct SplitResult<'a, K, V, NodeType> {
1816 pub left: NodeRef<marker::Mut<'a>, K, V, NodeType>,
1818 pub kv: (K, V),
1820 pub right: NodeRef<marker::Owned, K, V, NodeType>,
1822}
1823
1824impl<'a, K, V> SplitResult<'a, K, V, marker::Leaf> {
1825 pub(super) fn forget_node_type(self) -> SplitResult<'a, K, V, marker::LeafOrInternal> {
1826 SplitResult { left: self.left.forget_type(), kv: self.kv, right: self.right.forget_type() }
1827 }
1828}
1829
1830impl<'a, K, V> SplitResult<'a, K, V, marker::Internal> {
1831 pub(super) fn forget_node_type(self) -> SplitResult<'a, K, V, marker::LeafOrInternal> {
1832 SplitResult { left: self.left.forget_type(), kv: self.kv, right: self.right.forget_type() }
1833 }
1834}
1835
1836pub(super) mod marker {
1837 use core::marker::PhantomData;
1838
1839 pub(crate) enum Leaf {}
1840 pub(crate) enum Internal {}
1841 pub(crate) enum LeafOrInternal {}
1842
1843 pub(crate) enum Owned {}
1844 pub(crate) enum Dying {}
1845 pub(crate) enum DormantMut {}
1846 pub(crate) struct Immut<'a>(PhantomData<&'a ()>);
1847 pub(crate) struct Mut<'a>(PhantomData<&'a mut ()>);
1848 pub(crate) struct ValMut<'a>(PhantomData<&'a mut ()>);
1849
1850 pub(crate) trait BorrowType {
1851 const TRAVERSAL_PERMIT: bool = true;
1855 }
1856 impl BorrowType for Owned {
1857 const TRAVERSAL_PERMIT: bool = false;
1862 }
1863 impl BorrowType for Dying {}
1864 impl<'a> BorrowType for Immut<'a> {}
1865 impl<'a> BorrowType for Mut<'a> {}
1866 impl<'a> BorrowType for ValMut<'a> {}
1867 impl BorrowType for DormantMut {}
1868
1869 pub(crate) enum KV {}
1870 pub(crate) enum Edge {}
1871}
1872
1873unsafe fn slice_insert<T>(slice: &mut [MaybeUninit<T>], idx: usize, val: T) {
1878 unsafe {
1880 let len = slice.len();
1881 if true {
if !(len > idx) {
::core::panicking::panic("assertion failed: len > idx")
};
};debug_assert!(len > idx);
1882 let slice_ptr = slice.as_mut_ptr();
1883 if len > idx + 1 {
1884 ptr::copy(slice_ptr.add(idx), slice_ptr.add(idx + 1), len - idx - 1);
1885 }
1886 (*slice_ptr.add(idx)).write(val);
1887 }
1888}
1889
1890unsafe fn slice_remove<T>(slice: &mut [MaybeUninit<T>], idx: usize) -> T {
1896 unsafe {
1898 let len = slice.len();
1899 if true {
if !(idx < len) {
::core::panicking::panic("assertion failed: idx < len")
};
};debug_assert!(idx < len);
1900 let slice_ptr = slice.as_mut_ptr();
1901 let ret = (*slice_ptr.add(idx)).assume_init_read();
1902 ptr::copy(slice_ptr.add(idx + 1), slice_ptr.add(idx), len - idx - 1);
1903 ret
1904 }
1905}
1906
1907unsafe fn slice_shl<T>(slice: &mut [MaybeUninit<T>], distance: usize) {
1912 unsafe {
1914 let slice_ptr = slice.as_mut_ptr();
1915 ptr::copy(slice_ptr.add(distance), slice_ptr, slice.len() - distance);
1916 }
1917}
1918
1919unsafe fn slice_shr<T>(slice: &mut [MaybeUninit<T>], distance: usize) {
1924 unsafe {
1926 let slice_ptr = slice.as_mut_ptr();
1927 ptr::copy(slice_ptr, slice_ptr.add(distance), slice.len() - distance);
1928 }
1929}
1930
1931fn move_to_slice<T>(src: &mut [MaybeUninit<T>], dst: &mut [MaybeUninit<T>]) {
1935 if !(src.len() == dst.len()) {
::core::panicking::panic("assertion failed: src.len() == dst.len()")
};assert!(src.len() == dst.len());
1936 unsafe {
1938 ptr::copy_nonoverlapping(src.as_ptr(), dst.as_mut_ptr(), src.len());
1939 }
1940}
1941
1942#[cfg(test)]
1943mod tests;