btree_seq/
lib.rs

1use std::{
2    fmt,
3    marker::PhantomData,
4    mem::MaybeUninit,
5    ops::{self, Index, IndexMut, RangeBounds},
6    ptr::{self, NonNull},
7};
8
9use array_insertion::{array_insert, array_splice};
10use array_removal::array_remove;
11use array_rotation::{array_rotate_2, array_rotate_3};
12use usize_bounds::UsizeBounds;
13
14const B: usize = 4;
15const CAPACITY: usize = 2 * B - 1;
16const MIN_BUFLEN: usize = B - 1;
17
18struct LeafNode<T> {
19    buflen: u8,
20    buf: [MaybeUninit<T>; CAPACITY],
21    parent: Option<(NonNull<InternalNode<T>>, u8)>,
22}
23
24#[repr(C)]
25struct InternalNode<T> {
26    data: LeafNode<T>,
27    treelen: usize,
28    children: [MaybeUninit<NonNull<LeafNode<T>>>; CAPACITY + 1],
29}
30
31struct NodeRef<BorrowType, T, NodeType> {
32    node: NonNull<LeafNode<T>>,
33    height: u8,
34    _marker: PhantomData<(BorrowType, T, NodeType)>,
35}
36
37enum ForceResult<BorrowType, T> {
38    Leaf(NodeRef<BorrowType, T, marker::Leaf>),
39    Internal(NodeRef<BorrowType, T, marker::Internal>),
40}
41
42pub struct BTreeSeq<T> {
43    root: Option<OwnedNodeRef<T>>,
44}
45
46mod marker {
47    use std::marker::PhantomData;
48
49    pub enum Owned {}
50    pub enum Dying {}
51    pub struct Immut<'a>(PhantomData<&'a ()>);
52    pub struct ValMut<'a>(PhantomData<&'a mut ()>);
53    pub struct Mut<'a>(PhantomData<&'a mut ()>);
54
55    pub enum Leaf {}
56    pub enum Internal {}
57    pub enum LeafOrInternal {}
58
59    pub enum Value {}
60    pub enum Edge {}
61}
62
63trait Traversable {}
64impl Traversable for marker::Dying {}
65impl<'a> Traversable for marker::Immut<'a> {}
66impl<'a> Traversable for marker::ValMut<'a> {}
67impl<'a> Traversable for marker::Mut<'a> {}
68
69impl<T, NodeType> Copy for NodeRef<marker::Immut<'_>, T, NodeType> {}
70impl<'a, T, NodeType> Clone for NodeRef<marker::Immut<'a>, T, NodeType> {
71    fn clone(&self) -> Self { unsafe { self.cast() } }
72}
73
74type OwnedNodeRef<T> = NodeRef<marker::Owned, T, marker::LeafOrInternal>;
75type MutNodeRef<'a, T> = NodeRef<marker::Mut<'a>, T, marker::LeafOrInternal>;
76type MutLeafNodeRef<'a, T> = NodeRef<marker::Mut<'a>, T, marker::Leaf>;
77type MutInternalNodeRef<'a, T> = NodeRef<marker::Mut<'a>, T, marker::Internal>;
78type ImmutNodeRef<'a, T> =
79    NodeRef<marker::Immut<'a>, T, marker::LeafOrInternal>;
80type ValMutNodeRef<'a, T> =
81    NodeRef<marker::ValMut<'a>, T, marker::LeafOrInternal>;
82type DyingNodeRef<T> = NodeRef<marker::Dying, T, marker::LeafOrInternal>;
83
84impl<T> LeafNode<T> {
85    unsafe fn init(this: *mut Self) {
86        unsafe {
87            ptr::addr_of_mut!((*this).buflen).write(0);
88            ptr::addr_of_mut!((*this).parent).write(None);
89        }
90    }
91    pub fn new() -> Box<Self> {
92        unsafe {
93            let mut leaf = MaybeUninit::<Self>::uninit();
94            LeafNode::init(leaf.as_mut_ptr());
95            Box::new(leaf.assume_init())
96        }
97    }
98}
99
100impl<T> InternalNode<T> {
101    unsafe fn init(this: *mut Self) {
102        LeafNode::init(ptr::addr_of_mut!((*this).data));
103        ptr::addr_of_mut!((*this).treelen).write(0);
104    }
105    /// # Safety
106    /// An invariant of internal nodes is that they have at least one
107    /// initialized and valid edge. This function does not set up such
108    /// an edge.
109    pub unsafe fn new() -> Box<Self> {
110        unsafe {
111            let mut internal = MaybeUninit::<Self>::uninit();
112            InternalNode::init(internal.as_mut_ptr());
113            Box::new(internal.assume_init())
114        }
115    }
116}
117
118impl<BorrowType, T, NodeType> NodeRef<BorrowType, T, NodeType> {
119    unsafe fn cast<NewBorrowType, NewNodeType>(
120        &self,
121    ) -> NodeRef<NewBorrowType, T, NewNodeType> {
122        NodeRef {
123            node: self.node,
124            height: self.height,
125            _marker: PhantomData,
126        }
127    }
128}
129
130impl<T> NodeRef<marker::Owned, T, marker::Leaf> {
131    pub fn new_leaf() -> Self { Self::from_new_leaf(LeafNode::new()) }
132    fn from_new_leaf(leaf: Box<LeafNode<T>>) -> Self {
133        NodeRef {
134            node: NonNull::from(Box::leak(leaf)),
135            height: 0,
136            _marker: PhantomData,
137        }
138    }
139}
140
141impl<T> NodeRef<marker::Owned, T, marker::Internal> {
142    /// # Safety
143    /// `left.height == right.height`
144    unsafe fn new_single_internal<NodeType>(
145        elt: T,
146        left: NodeRef<marker::Mut<'_>, T, NodeType>,
147        right: NodeRef<marker::Mut<'_>, T, NodeType>,
148    ) -> Self {
149        debug_assert_eq!(left.height, right.height);
150        let height = left.height;
151        let mut node = unsafe { InternalNode::new() };
152        node.data.buf[0].write(elt);
153        node.children[0].write(left.node);
154        node.children[1].write(right.node);
155        node.data.buflen = 1;
156        let node = NonNull::from(Box::leak(node)).cast();
157        let mut this =
158            NodeRef { height: height + 1, node, _marker: PhantomData };
159        this.borrow_mut().correct_parent_children_invariant();
160        this
161    }
162    /// # Safety
163    /// The caller has to guarantee the unemptiness.
164    unsafe fn new_empty_internal(height: u8) -> Self {
165        let node =
166            NonNull::from(Box::leak(unsafe { InternalNode::<T>::new() }));
167        NodeRef { height, node: node.cast(), _marker: PhantomData }
168    }
169}
170
171impl<BorrowType, T> NodeRef<BorrowType, T, marker::LeafOrInternal> {
172    fn from_node(node: NonNull<LeafNode<T>>, height: u8) -> Self {
173        NodeRef { node, height, _marker: PhantomData }
174    }
175    fn force(&self) -> ForceResult<BorrowType, T> {
176        if self.height == 0 {
177            ForceResult::Leaf(unsafe { self.cast() })
178        } else {
179            ForceResult::Internal(unsafe { self.cast() })
180        }
181    }
182}
183
184impl<BorrowType: Traversable, T>
185    NodeRef<BorrowType, T, marker::LeafOrInternal>
186{
187    fn first_child(&self) -> Option<Self> {
188        self.force().internal().map(|internal| unsafe {
189            let ptr = internal.as_internal_ptr();
190            let node = (*ptr).children[0].assume_init();
191            NodeRef::from_node(node, self.height - 1)
192        })
193    }
194    fn last_child(&self) -> Option<Self> {
195        self.force().internal().map(|internal| unsafe {
196            let ptr = internal.as_internal_ptr();
197            let node =
198                (*ptr).children[(*ptr).data.buflen as usize].assume_init();
199            NodeRef::from_node(node, self.height - 1)
200        })
201    }
202
203    fn first_leaf(
204        &self,
205    ) -> Handle<NodeRef<BorrowType, T, marker::Leaf>, marker::Edge> {
206        use ForceResult::*;
207        match self.force() {
208            Leaf(leaf) => Handle::new(leaf, 0),
209            Internal(internal) => {
210                let child = internal.child(0).unwrap();
211                child.first_leaf()
212            }
213        }
214    }
215    fn last_leaf(
216        &self,
217    ) -> Handle<NodeRef<BorrowType, T, marker::Leaf>, marker::Edge> {
218        use ForceResult::*;
219        let init_len = self.buflen();
220        match self.force() {
221            Leaf(leaf) => Handle::new(leaf, init_len as _),
222            Internal(internal) => {
223                let child = internal.child(init_len).unwrap();
224                child.last_leaf()
225            }
226        }
227    }
228
229    /// # Safety
230    /// `idx <= self.treelen()` and the `.treelen` invariant is met.
231    unsafe fn select_leaf(
232        &self,
233        mut idx: usize,
234    ) -> Handle<NodeRef<BorrowType, T, marker::Leaf>, marker::Edge> {
235        use ForceResult::*;
236
237        debug_assert!(idx <= self.treelen());
238        match self.force() {
239            Leaf(leaf) => Handle::new(leaf, idx),
240            Internal(internal) => {
241                let init_len = self.buflen();
242                for i in 0..=init_len {
243                    let child = internal.child(i).unwrap();
244                    if idx <= child.treelen() {
245                        return child.select_leaf(idx);
246                    } else {
247                        idx -= child.treelen() + 1;
248                    }
249                }
250                unreachable!()
251            }
252        }
253    }
254
255    /// # Safety
256    /// `idx < self.treelen()` and the `.treelen` invariant is met.
257    unsafe fn select_value(
258        &self,
259        mut idx: usize,
260    ) -> Handle<NodeRef<BorrowType, T, marker::LeafOrInternal>, marker::Value>
261    {
262        use ForceResult::*;
263        debug_assert!(idx < self.treelen());
264        match self.force() {
265            Leaf(leaf) => Handle::new(leaf, idx).forget_node_type(),
266            Internal(internal) => {
267                let init_len = self.buflen();
268                for i in 0..=init_len {
269                    let child = internal.child(i).unwrap();
270                    if idx < child.treelen() {
271                        return child.select_value(idx);
272                    } else if idx == child.treelen() {
273                        return Handle {
274                            node: internal.forget_type(),
275                            idx: i as _,
276                            _marker: PhantomData,
277                        };
278                    } else {
279                        idx -= child.treelen() + 1;
280                    }
281                }
282                unreachable!()
283            }
284        }
285    }
286
287    /// # Safety
288    /// The `.treelen` invariant is met.
289    unsafe fn bisect_index<F>(&self, predicate: F) -> usize
290    where
291        F: Fn(&T) -> bool,
292    {
293        use ForceResult::*;
294        let init_len = self.buflen() as usize;
295        match self.force() {
296            Leaf(_) => {
297                let ptr = self.node.as_ptr();
298                (0..init_len)
299                    .find(|&i| {
300                        !predicate(unsafe { (*ptr).buf[i].assume_init_ref() })
301                    })
302                    .unwrap_or(init_len)
303            }
304            Internal(internal) => {
305                let mut rank = 0;
306                let ptr = internal.as_internal_ptr();
307                for i in 0..init_len {
308                    let elt = unsafe { (*ptr).data.buf[i].assume_init_ref() };
309                    let child = internal.child(i as _).unwrap();
310                    if predicate(&elt) {
311                        rank += child.treelen() + 1;
312                    } else {
313                        return rank + child.bisect_index(predicate);
314                    }
315                }
316                rank + internal
317                    .child(init_len as _)
318                    .unwrap()
319                    .bisect_index(predicate)
320            }
321        }
322    }
323}
324
325impl<BorrowType, T> NodeRef<BorrowType, T, marker::Leaf> {
326    /// # Safety
327    /// `node` points to an actual leaf.
328    unsafe fn from_leaf(node: NonNull<LeafNode<T>>) -> Self {
329        NodeRef { node, height: 0, _marker: PhantomData }
330    }
331    fn forget_type(self) -> NodeRef<BorrowType, T, marker::LeafOrInternal> {
332        unsafe { self.cast() }
333    }
334}
335
336impl<BorrowType, T> NodeRef<BorrowType, T, marker::Internal> {
337    fn as_internal_ptr(&self) -> *mut InternalNode<T> {
338        self.node.as_ptr() as *mut InternalNode<T>
339    }
340    /// # Safety
341    /// `height > 0`
342    unsafe fn from_internal(
343        node: NonNull<InternalNode<T>>,
344        height: u8,
345    ) -> Self {
346        debug_assert!(height > 0);
347        NodeRef { node: node.cast(), height, _marker: PhantomData }
348    }
349    fn forget_type(self) -> NodeRef<BorrowType, T, marker::LeafOrInternal> {
350        unsafe { self.cast() }
351    }
352}
353
354impl<T, NodeType> NodeRef<marker::Owned, T, NodeType> {
355    fn borrow(&self) -> NodeRef<marker::Immut<'_>, T, NodeType> {
356        unsafe { self.cast() }
357    }
358    fn borrow_mut(&mut self) -> NodeRef<marker::Mut<'_>, T, NodeType> {
359        unsafe { self.cast() }
360    }
361    fn borrow_valmut(&mut self) -> NodeRef<marker::ValMut<'_>, T, NodeType> {
362        unsafe { self.cast() }
363    }
364    fn take(self) -> NodeRef<marker::Dying, T, NodeType> {
365        unsafe { self.cast() }
366    }
367}
368
369impl<'a, T, NodeType> NodeRef<marker::Mut<'a>, T, NodeType> {
370    fn reborrow_mut(&mut self) -> NodeRef<marker::Mut<'a>, T, NodeType> {
371        unsafe { self.cast() }
372    }
373    /// # Safety
374    /// `self` has no parent.
375    unsafe fn promote(&mut self) -> NodeRef<marker::Owned, T, NodeType> {
376        debug_assert!(unsafe { (*self.node.as_ptr()).parent }.is_none());
377        unsafe { self.cast() }
378    }
379}
380
381impl<T> DyingNodeRef<T> {
382    fn iter(self) -> IntoIterImpl<T> {
383        let left = self.first_leaf().forget_node_type();
384        let right = self.last_leaf().forget_node_type();
385        IntoIterImpl::new(left, right)
386    }
387}
388
389impl<'a, T> NodeRef<marker::Immut<'a>, T, marker::LeafOrInternal> {
390    fn iter(&self) -> IterImpl<'a, T> {
391        let left = self.first_leaf().forget_node_type();
392        let right = self.last_leaf().forget_node_type();
393        IterImpl::new(left, right)
394    }
395    /// # Safety
396    /// The `.treelen` invariant is met and `0 <= start <= end <= treelen`
397    unsafe fn range(
398        &self,
399        ops::Range { start, end }: ops::Range<usize>,
400    ) -> IterImpl<'a, T> {
401        unsafe {
402            let left = self.select_leaf(start).forget_node_type();
403            let right = self.select_leaf(end).forget_node_type();
404            IterImpl::new(left, right)
405        }
406    }
407}
408
409impl<'a, T: 'a> NodeRef<marker::ValMut<'a>, T, marker::LeafOrInternal> {
410    fn iter(&mut self) -> IterMutImpl<'a, T> {
411        let left = self.first_leaf().forget_node_type();
412        let right = self.last_leaf().forget_node_type();
413        IterMutImpl::new(left, right)
414    }
415    /// # Safety
416    /// The `.treelen` invariant is met and `0 <= start <= end <= treelen`
417    unsafe fn range(
418        &mut self,
419        ops::Range { start, end }: ops::Range<usize>,
420    ) -> IterMutImpl<'a, T> {
421        unsafe {
422            let left = self.select_leaf(start).forget_node_type();
423            let right = self.select_leaf(end).forget_node_type();
424            IterMutImpl::new(left, right)
425        }
426    }
427}
428
429impl<BorrowType, T, NodeType> NodeRef<BorrowType, T, NodeType> {
430    fn buflen(&self) -> u8 { unsafe { (*self.node.as_ptr()).buflen } }
431    fn is_underfull(&self) -> bool { usize::from(self.buflen()) < MIN_BUFLEN }
432    fn treelen(&self) -> usize {
433        if self.height > 0 {
434            unsafe { (*self.node.cast::<InternalNode<T>>().as_ptr()).treelen }
435        } else {
436            self.buflen() as _
437        }
438    }
439}
440
441impl<BorrowType: Traversable, T> NodeRef<BorrowType, T, marker::Internal> {
442    fn children_ref(&self) -> &[NonNull<LeafNode<T>>] {
443        let init_len = self.buflen() as usize;
444        unsafe {
445            &*(&(&(*self.as_internal_ptr()).children)[..=init_len]
446                as *const [MaybeUninit<_>]
447                as *const [NonNull<LeafNode<T>>])
448        }
449    }
450    fn child(
451        &self,
452        i: u8,
453    ) -> Option<NodeRef<BorrowType, T, marker::LeafOrInternal>> {
454        let init_len = self.buflen();
455        let ptr = self.as_internal_ptr();
456        let node = (i <= init_len)
457            .then(|| unsafe { (*ptr).children[i as usize].assume_init() })?;
458        let height = self.height;
459        Some(NodeRef::from_node(node, height - 1))
460    }
461    fn neighbors(
462        &self,
463    ) -> [Option<NodeRef<BorrowType, T, marker::Internal>>; 2] {
464        if let Some(Handle { node: parent, idx, .. }) = self.parent() {
465            let height = self.height;
466            let parent_ptr = parent.as_internal_ptr();
467            unsafe {
468                let len = (*parent_ptr).data.buflen as usize;
469                let left = (idx > 0)
470                    .then(|| (*parent_ptr).children[idx - 1].assume_init());
471                let right = (idx < len)
472                    .then(|| (*parent_ptr).children[idx + 1].assume_init());
473                [left, right].map(|o| {
474                    o.map(|node| NodeRef::from_internal(node.cast(), height))
475                })
476            }
477        } else {
478            [None, None]
479        }
480    }
481}
482
483impl<BorrowType: Traversable, T> NodeRef<BorrowType, T, marker::Leaf> {
484    fn neighbors(&self) -> [Option<NodeRef<BorrowType, T, marker::Leaf>>; 2] {
485        if let Some(Handle { node: parent, idx, .. }) = self.parent() {
486            let parent_ptr = parent.as_internal_ptr();
487            unsafe {
488                let len = (*parent_ptr).data.buflen as usize;
489                let left = (idx > 0)
490                    .then(|| (*parent_ptr).children[idx - 1].assume_init());
491                let right = (idx < len)
492                    .then(|| (*parent_ptr).children[idx + 1].assume_init());
493                [left, right].map(|o| o.map(|node| NodeRef::from_leaf(node)))
494            }
495        } else {
496            [None, None]
497        }
498    }
499}
500
501impl<BorrowType: Traversable, T, NodeType> NodeRef<BorrowType, T, NodeType> {
502    fn parent(
503        &self,
504    ) -> Option<Handle<NodeRef<BorrowType, T, marker::Internal>, marker::Edge>>
505    {
506        let height = self.height;
507        unsafe { (*self.node.as_ptr()).parent }.map(|(parent, idx)| unsafe {
508            Handle {
509                node: NodeRef::from_internal(parent, height + 1),
510                idx: idx as _,
511                _marker: PhantomData,
512            }
513        })
514    }
515    fn root(&self) -> NodeRef<BorrowType, T, marker::LeafOrInternal> {
516        let mut cur = match self.parent() {
517            Some(o) => o.node,
518            None => return unsafe { self.cast() },
519        };
520        while let Some(Handle { node, .. }) = cur.parent() {
521            cur = node;
522        }
523        cur.forget_type()
524    }
525}
526
527impl<'a, T> NodeRef<marker::Mut<'a>, T, marker::Internal> {
528    fn correct_parent_children_invariant(&mut self) {
529        let init_len = self.buflen() as usize;
530        let children_ref = self.children_ref();
531        let ptr = self.node.cast();
532        for i in 0..=init_len {
533            let child = children_ref[i];
534            unsafe { (*child.as_ptr()).parent = Some((ptr, i as _)) }
535        }
536        self.correct_treelen_invarant();
537    }
538
539    fn correct_treelen_invarant(&mut self) {
540        let init_len = self.buflen() as usize;
541        let mut treelen = init_len;
542        let children_ref = self.children_ref();
543        for i in 0..=init_len {
544            let child = children_ref[i];
545            let child_ref = ImmutNodeRef::from_node(child, self.height - 1);
546            treelen += child_ref.treelen();
547        }
548        unsafe { (*self.as_internal_ptr()).treelen = treelen }
549    }
550
551    fn correct_treelen_invarant_to_root(&mut self) {
552        self.correct_treelen_invarant();
553        let mut cur = self.parent();
554        while let Some(mut handle) = cur {
555            handle.node.correct_treelen_invarant();
556            cur = handle.node.parent();
557        }
558    }
559}
560
561impl<'a, T> NodeRef<marker::Mut<'a>, T, marker::LeafOrInternal> {
562    fn correct_treelen_invariant_subtree(&mut self) {
563        if let Some(internal) = self.force().internal() {
564            let init_len = self.buflen();
565            let mut treelen = init_len as usize;
566            for i in 0..=init_len {
567                let mut child = internal.child(i as _).unwrap();
568                child.correct_treelen_invariant_subtree();
569                treelen += child.treelen();
570            }
571            unsafe { (*internal.as_internal_ptr()).treelen = treelen }
572        }
573    }
574}
575
576impl<T> OwnedNodeRef<T> {
577    fn adjoin(mut self, mid: T, mut other: Self) -> Self {
578        let mut left = self.borrow_mut();
579        let mut right = other.borrow_mut();
580        let mut root = if left.height != right.height {
581            let Handle { node: mut parent, idx, .. } =
582                if left.height < right.height {
583                    while left.height < right.height {
584                        // SAFETY: 0 <= left.height < right.height
585                        right = right.first_child().unwrap();
586                    }
587                    right.parent().unwrap()
588                } else {
589                    while left.height > right.height {
590                        left = left.last_child().unwrap();
591                    }
592                    left.parent().unwrap()
593                };
594            unsafe {
595                let node = NodeRef::new_single_internal(mid, left, right);
596                let _ = parent.insert(idx, node);
597                parent.correct_treelen_invarant_to_root();
598                if let Some(mut node) = (0..=parent.buflen())
599                    .map(|i| parent.child(i).unwrap())
600                    .find(|node| node.is_underfull())
601                {
602                    node.underflow().unwrap_or_else(|| node.root().promote())
603                } else {
604                    parent.root().promote()
605                }
606            }
607        } else {
608            if ((left.buflen() + right.buflen() + 1) as usize) <= CAPACITY {
609                // Note that `left` and `right` are roots, so it is not
610                // necessarily true that |left| == |right| == B - 1.
611                // Anyway, we do not have to allocate a new node. We
612                // merge them into one of them and deallocate the other.
613                left.append(mid, right);
614                unsafe { left.promote() }
615            } else {
616                // At most one of them may be underfull, but we can
617                // resolve it by rotate properly.
618                let mut node =
619                    unsafe { NodeRef::new_single_internal(mid, left, right) };
620                let node_mut = node.borrow_mut();
621                let mut left = node_mut.child(0).unwrap();
622                let mut right = node_mut.child(1).unwrap();
623                left.rotate(&mut right);
624                node.forget_type()
625            }
626        };
627        root.borrow_mut()
628            .force()
629            .internal()
630            .map(|mut internal| internal.correct_treelen_invarant());
631        root
632    }
633    /// # Safety
634    /// `i <= self.treelen()`
635    unsafe fn split_off(mut self, i: usize) -> [Option<Self>; 2] {
636        debug_assert!(i <= self.treelen());
637        self.borrow_mut().select_leaf(i).split()
638    }
639    /// # Safety
640    /// `self.treelen() == 1`
641    unsafe fn take_single(self) -> T {
642        use ForceResult::*;
643        debug_assert_eq!(self.treelen(), 1);
644        let res = unsafe { (*self.node.as_ptr()).buf[0].assume_init_read() };
645        match self.force() {
646            Leaf(leaf) => unsafe { drop(Box::from_raw(leaf.node.as_ptr())) },
647            Internal(internal) => unsafe {
648                drop(Box::from_raw(internal.as_internal_ptr()))
649            },
650        }
651        res
652    }
653    fn drop_subtree(&mut self) {
654        let dying: DyingNodeRef<_> = unsafe { self.cast() };
655        dying.drop_subtree(false);
656    }
657}
658
659impl<T> DyingNodeRef<T> {
660    fn drop_subtree(self, elt_dropped: bool) {
661        let init_len = self.buflen() as usize;
662        let ptr = self.node.as_ptr();
663        if !elt_dropped {
664            unsafe {
665                for e in &mut (&mut (*ptr).buf)[..init_len] {
666                    e.assume_init_drop()
667                }
668            }
669        }
670        match self.force() {
671            ForceResult::Leaf(leaf) => unsafe {
672                drop(Box::from_raw(leaf.node.as_ptr()));
673            },
674            ForceResult::Internal(internal) => {
675                let ptr = internal.as_internal_ptr();
676                unsafe {
677                    for i in 0..=init_len {
678                        let child = internal.child(i as _).unwrap();
679                        child.drop_subtree(elt_dropped);
680                    }
681                    drop(Box::from_raw(ptr));
682                }
683            }
684        }
685    }
686}
687
688impl<BorrowType, T> ForceResult<BorrowType, T> {
689    #[allow(dead_code)]
690    fn leaf(self) -> Option<NodeRef<BorrowType, T, marker::Leaf>> {
691        if let Self::Leaf(leaf) = self { Some(leaf) } else { None }
692    }
693    fn internal(self) -> Option<NodeRef<BorrowType, T, marker::Internal>> {
694        if let Self::Internal(internal) = self { Some(internal) } else { None }
695    }
696}
697
698impl<'a, T> MutNodeRef<'a, T> {
699    fn underflow(
700        &mut self,
701    ) -> Option<NodeRef<marker::Owned, T, marker::LeafOrInternal>> {
702        use ForceResult::*;
703        unsafe {
704            match self.force() {
705                Leaf(mut leaf) => leaf.underflow(),
706                Internal(mut internal) => internal.underflow(),
707            }
708        }
709    }
710    fn rotate(&mut self, other: &mut Self) {
711        use ForceResult::*;
712
713        match (self.force(), other.force()) {
714            (Leaf(mut left), Leaf(mut right)) => left.rotate(&mut right),
715            (Internal(mut left), Internal(mut right)) => {
716                left.rotate(&mut right);
717            }
718            _ => unreachable!(),
719        }
720    }
721    fn append(&mut self, mid: T, other: Self) {
722        use ForceResult::*;
723
724        match (self.force(), other.force()) {
725            (Leaf(mut left), Leaf(right)) => left.append(mid, right),
726            (Internal(mut left), Internal(right)) => left.append(mid, right),
727            _ => unreachable!(),
728        }
729    }
730
731    fn push_back(
732        &mut self,
733        elt: T,
734    ) -> Option<NodeRef<marker::Owned, T, marker::Internal>> {
735        unsafe {
736            let Handle { mut node, idx, .. } = self.last_leaf();
737            let root = node.insert(idx, elt);
738            node.parent()
739                .map(|mut o| o.node.correct_treelen_invarant_to_root());
740            root
741        }
742    }
743    fn push_front(
744        &mut self,
745        elt: T,
746    ) -> Option<NodeRef<marker::Owned, T, marker::Internal>> {
747        unsafe {
748            let Handle { mut node, idx, .. } = self.first_leaf();
749            let root = node.insert(idx, elt);
750            node.parent()
751                .map(|mut o| o.node.correct_treelen_invarant_to_root());
752            root
753        }
754    }
755}
756
757impl<'a, T> MutLeafNodeRef<'a, T> {
758    /// # Safety
759    /// `i <= buflen`
760    pub unsafe fn insert(
761        &mut self,
762        i: usize,
763        elt: T,
764    ) -> Option<NodeRef<marker::Owned, T, marker::Internal>> {
765        // We do not maintain the invariant of `.treelen` to keep the
766        // amortized complexity constant. This is preferable for
767        // consecutive insertions like `.collect()` or `.extend()`.
768        debug_assert!(i <= usize::from(self.buflen()));
769
770        if (self.buflen() as usize) < CAPACITY {
771            self.insert_fit(i, elt);
772            None
773        } else {
774            let (orphan, new_parent) = self.purge_and_insert(i, elt);
775            if let Some(Handle { node: mut parent, idx: par_i, .. }) =
776                new_parent
777            {
778                parent.insert(par_i, orphan)
779            } else {
780                Some(orphan)
781            }
782        }
783    }
784
785    fn purge_and_insert(
786        &mut self,
787        i: usize,
788        elt: T,
789    ) -> (
790        NodeRef<marker::Owned, T, marker::Internal>,
791        Option<
792            Handle<NodeRef<marker::Mut<'_>, T, marker::Internal>, marker::Edge>,
793        >,
794    ) {
795        let mut orphan = NodeRef::new_leaf();
796        let parent = self.parent();
797        unsafe {
798            let (left, right, leftlen, rightlen) = if i <= B {
799                (self.reborrow_mut(), orphan.borrow_mut(), CAPACITY, 0)
800            } else {
801                (orphan.borrow_mut(), self.reborrow_mut(), 0, CAPACITY)
802            };
803            let left_ptr = left.node.as_ptr();
804            let right_ptr = right.node.as_ptr();
805            let left_buf = &mut (*left_ptr).buf;
806            let right_buf = &mut (*right_ptr).buf;
807            array_rotate_2(left_buf, right_buf, leftlen, rightlen, B);
808            let par_elt = left_buf[B - 1].assume_init_read();
809            if i <= B {
810                array_insert(left_buf, i, B - 1, elt);
811                (*left_ptr).buflen = B as _;
812                (*right_ptr).buflen = (B - 1) as _;
813            } else {
814                array_insert(right_buf, i - B, B - 1, elt);
815                (*left_ptr).buflen = (B - 1) as _;
816                (*right_ptr).buflen = B as _;
817            }
818            (NodeRef::new_single_internal(par_elt, left, right), parent)
819        }
820    }
821
822    fn insert_fit(&mut self, i: usize, elt: T) {
823        let ptr = self.node.as_ptr();
824        unsafe {
825            array_insert(&mut (*ptr).buf, i, (*ptr).buflen as _, elt);
826            (*ptr).buflen += 1;
827        }
828    }
829
830    pub unsafe fn underflow(
831        &mut self,
832    ) -> Option<NodeRef<marker::Owned, T, marker::LeafOrInternal>> {
833        // If it does not have a parent, then it is the root and nothing
834        // has to be done.
835        let Handle { node: mut parent, .. } = self.parent()?;
836        let len = self.buflen();
837        match self.neighbors() {
838            [Some(mut left), _]
839                if usize::from(left.buflen() + len) >= 2 * MIN_BUFLEN =>
840            {
841                left.rotate(self);
842                None
843            }
844            [_, Some(mut right)]
845                if usize::from(len + right.buflen()) >= 2 * MIN_BUFLEN =>
846            {
847                self.rotate(&mut right);
848                None
849            }
850            [Some(left), _] => {
851                // |left| + |self| + 1 < 2 * B - 1
852                // Take an element from the parent, and check it.
853                self.merge(left, false);
854                if parent.buflen() == 0 {
855                    // Now `self` is the new root, so deallocate it and
856                    // promote `self`.
857                    unsafe {
858                        let _ = (*self.node.as_ptr()).parent.take();
859                        drop(Box::from_raw(parent.as_internal_ptr()));
860                        Some(self.promote().forget_type())
861                    }
862                } else {
863                    parent.underflow()
864                }
865            }
866            [_, Some(right)] => {
867                self.merge(right, true);
868                if parent.buflen() == 0 {
869                    unsafe {
870                        let _ = (*self.node.as_ptr()).parent.take();
871                        drop(Box::from_raw(parent.as_internal_ptr()));
872                        Some(self.promote().forget_type())
873                    }
874                } else {
875                    parent.underflow()
876                }
877            }
878            [None, None] => unreachable!(),
879        }
880    }
881
882    fn rotate(&mut self, other: &mut Self) {
883        if !self.is_underfull() && !other.is_underfull() {
884            return;
885        }
886        let Handle { node: parent, idx, .. } = self.parent().unwrap();
887        Self::rotate_leaf(
888            self.node.as_ptr(),
889            (parent.as_internal_ptr(), idx),
890            other.node.as_ptr(),
891        );
892    }
893    fn merge(&mut self, other: Self, self_left: bool) {
894        let Handle { node: mut parent, idx, .. } = self.parent().unwrap();
895        if self_left {
896            Self::merge_leaf(
897                self.node.as_ptr(),
898                (parent.as_internal_ptr(), idx),
899                other.node.as_ptr(),
900            );
901        } else {
902            Self::merge_leaf(
903                other.node.as_ptr(),
904                (parent.as_internal_ptr(), idx - 1),
905                self.node.as_ptr(),
906            );
907            unsafe {
908                ptr::swap(self.node.as_ptr(), other.node.as_ptr());
909                (*parent.as_internal_ptr()).children[idx - 1].write(self.node);
910            }
911        }
912        parent.correct_parent_children_invariant();
913        unsafe { drop(Box::from_raw(other.node.as_ptr())) }
914    }
915    fn append(&mut self, elt: T, other: Self) {
916        Self::append_leaf(self.node.as_ptr(), elt, other.node.as_ptr());
917        unsafe { drop(Box::from_raw(other.node.as_ptr())) }
918    }
919
920    fn rotate_leaf(
921        left_ptr: *mut LeafNode<T>,
922        (parent_ptr, idx): (*mut InternalNode<T>, usize),
923        right_ptr: *mut LeafNode<T>,
924    ) {
925        // left: [A, B, C, D, E], parent: [.., F, ..], right: [G, H]
926        // left: [A, B, C], parent: [.., D, ..], right: [E, F, G, H]
927        unsafe {
928            let left = &mut (*left_ptr).buf;
929            let leftlen = (*left_ptr).buflen as usize;
930            let mid = &mut (*parent_ptr).data.buf[idx];
931            let right = &mut (*right_ptr).buf;
932            let rightlen = (*right_ptr).buflen as usize;
933            debug_assert!(leftlen + rightlen >= 2 * MIN_BUFLEN);
934            let rightlen_new =
935                array_rotate_3(left, mid, right, leftlen, rightlen, MIN_BUFLEN);
936            (*left_ptr).buflen = MIN_BUFLEN as _;
937            (*right_ptr).buflen = rightlen_new as _;
938        }
939    }
940
941    fn merge_leaf(
942        left_ptr: *mut LeafNode<T>,
943        (parent_ptr, idx): (*mut InternalNode<T>, usize),
944        right_ptr: *mut LeafNode<T>,
945    ) {
946        // left: [A, B, C, D, E], parent: [.., F, ..], right: [G, H]
947        // left: [A, B, C, D, E, F, G, H], parent: [.., ..]
948        unsafe {
949            let left = &mut (*left_ptr).buf;
950            let leftlen = (*left_ptr).buflen as usize;
951            let mid = {
952                let buf = &mut (*parent_ptr).data.buf;
953                let len = (*parent_ptr).data.buflen as usize;
954                let _ =
955                    array_remove(&mut (*parent_ptr).children, idx + 1, len + 1);
956                array_remove(buf, idx, len)
957            };
958            left[leftlen].write(mid);
959            let leftlen = leftlen + 1;
960
961            let right = &(*right_ptr).buf;
962            let rightlen = (*right_ptr).buflen as usize;
963            array_splice(left, leftlen, leftlen, right, rightlen);
964
965            (*left_ptr).buflen += 1 + rightlen as u8;
966            (*parent_ptr).data.buflen -= 1;
967        }
968    }
969
970    fn append_leaf(
971        left_ptr: *mut LeafNode<T>,
972        elt: T,
973        right_ptr: *mut LeafNode<T>,
974    ) {
975        // left: [A, B, C, D], right: [E, F, G]
976        // left: [A, B, C, D, elt, E, F, G]
977        unsafe {
978            debug_assert!((*left_ptr).parent.is_none());
979            debug_assert!((*right_ptr).parent.is_none());
980            let left = &mut (*left_ptr).buf;
981            let leftlen = (*left_ptr).buflen as usize;
982            let right = &(*right_ptr).buf;
983            let rightlen = (*right_ptr).buflen as usize;
984            let newlen = leftlen + rightlen + 1;
985            debug_assert!(newlen <= CAPACITY);
986            left[leftlen].write(elt);
987            let leftlen = leftlen + 1;
988
989            array_splice(left, leftlen, leftlen, right, rightlen);
990            (*left_ptr).buflen = newlen as _;
991        }
992    }
993}
994
995impl<'a, T> MutInternalNodeRef<'a, T> {
996    /// # Safety
997    /// `i <= buflen`
998    unsafe fn insert(
999        &mut self,
1000        i: usize,
1001        orphan: NodeRef<marker::Owned, T, marker::Internal>,
1002    ) -> Option<NodeRef<marker::Owned, T, marker::Internal>> {
1003        debug_assert!(i <= usize::from(self.buflen()));
1004
1005        if (self.buflen() as usize) < CAPACITY {
1006            self.insert_fit(i, orphan);
1007            None
1008        } else {
1009            let (orphan, new_parent) = self.purge_and_insert(i, orphan);
1010
1011            if let Some(Handle { node: mut parent, idx: par_i, .. }) =
1012                new_parent
1013            {
1014                parent.insert(par_i, orphan)
1015            } else {
1016                Some(orphan)
1017            }
1018        }
1019    }
1020
1021    fn purge_and_insert(
1022        &mut self,
1023        i: usize,
1024        node: NodeRef<marker::Owned, T, marker::Internal>,
1025    ) -> (
1026        NodeRef<marker::Owned, T, marker::Internal>,
1027        Option<
1028            Handle<NodeRef<marker::Mut<'_>, T, marker::Internal>, marker::Edge>,
1029        >,
1030    ) {
1031        let parent = self.parent();
1032        let node_ptr = node.as_internal_ptr();
1033        unsafe {
1034            let mut orphan = NodeRef::new_empty_internal(self.height);
1035            let elt = (*node_ptr).data.buf[0].assume_init_read();
1036            let left_child = (*node_ptr).children[0].assume_init_read();
1037            let right_child = (*node_ptr).children[1].assume_init_read();
1038            let (mut left, mut right, par_elt) = if i <= B {
1039                let left_ptr = self.as_internal_ptr();
1040                let right_ptr = orphan.as_internal_ptr();
1041                let left_buf = &mut (*left_ptr).data.buf;
1042                let right_buf = &mut (*right_ptr).data.buf;
1043                array_rotate_2(left_buf, right_buf, CAPACITY, 0, B);
1044                let left_children = &mut (*left_ptr).children;
1045                let right_children = &mut (*right_ptr).children;
1046                array_rotate_2(left_children, right_children, 2 * B, 0, B);
1047                let par_elt = left_buf[B - 1].assume_init_read();
1048                array_insert(left_buf, i, B - 1, elt);
1049                left_children[i].write(left_child);
1050                array_insert(left_children, i + 1, B, right_child);
1051                (*left_ptr).data.buflen = B as _;
1052                (*right_ptr).data.buflen = (B - 1) as _;
1053                (self.reborrow_mut(), orphan.borrow_mut(), par_elt)
1054            } else {
1055                let left_ptr = orphan.as_internal_ptr();
1056                let right_ptr = self.as_internal_ptr();
1057                let left_buf = &mut (*left_ptr).data.buf;
1058                let right_buf = &mut (*right_ptr).data.buf;
1059                array_rotate_2(left_buf, right_buf, 0, CAPACITY, B);
1060                let left_children = &mut (*left_ptr).children;
1061                let right_children = &mut (*right_ptr).children;
1062                array_rotate_2(left_children, right_children, 0, 2 * B, B);
1063                let par_elt = left_buf[B - 1].assume_init_read();
1064                array_insert(right_buf, i - B, B - 1, elt);
1065                right_children[i - B].write(left_child);
1066                array_insert(right_children, i + 1 - B, B, right_child);
1067                (*left_ptr).data.buflen = (B - 1) as _;
1068                (*right_ptr).data.buflen = B as _;
1069                (orphan.borrow_mut(), self.reborrow_mut(), par_elt)
1070            };
1071            left.correct_parent_children_invariant();
1072            right.correct_parent_children_invariant();
1073
1074            drop(Box::from_raw(node.as_internal_ptr()));
1075            (NodeRef::new_single_internal(par_elt, left, right), parent)
1076        }
1077    }
1078
1079    fn insert_fit(
1080        &mut self,
1081        i: usize,
1082        orphan: NodeRef<marker::Owned, T, marker::Internal>,
1083    ) {
1084        let orphan_ptr = orphan.as_internal_ptr();
1085        let this = self.as_internal_ptr();
1086        // As `orphan` is purged from the subtree, we do not have to
1087        // update the `.treelen`. Note that adding one to leaf-to-root
1088        // is the job for the caller.
1089        unsafe {
1090            let buflen = (*this).data.buflen as usize;
1091            let elt = (*orphan_ptr).data.buf[0].assume_init_read();
1092            let left = (*orphan_ptr).children[0].assume_init_read();
1093            let right = (*orphan_ptr).children[1].assume_init_read();
1094            array_insert(&mut (*this).data.buf, i, buflen, elt);
1095            (*this).children[i].write(left);
1096            array_insert(&mut (*this).children, i + 1, buflen + 1, right);
1097            (*this).data.buflen += 1;
1098            drop(Box::from_raw(orphan_ptr));
1099        }
1100        self.correct_parent_children_invariant();
1101    }
1102
1103    unsafe fn underflow(
1104        &mut self,
1105    ) -> Option<NodeRef<marker::Owned, T, marker::LeafOrInternal>> {
1106        let Handle { node: mut parent, .. } = self.parent()?;
1107        let len = self.buflen();
1108        match self.neighbors() {
1109            [Some(mut left), _]
1110                if usize::from(left.buflen() + len) >= 2 * MIN_BUFLEN =>
1111            {
1112                left.rotate(self);
1113                None
1114            }
1115            [_, Some(mut right)]
1116                if usize::from(len + right.buflen()) >= 2 * MIN_BUFLEN =>
1117            {
1118                self.rotate(&mut right);
1119                None
1120            }
1121            [Some(left), _] => {
1122                self.merge(left, false);
1123                if parent.buflen() == 0 {
1124                    unsafe {
1125                        let _ = (*self.node.as_ptr()).parent.take();
1126                        drop(Box::from_raw(parent.as_internal_ptr()));
1127                        Some(self.promote().forget_type())
1128                    }
1129                } else {
1130                    parent.underflow()
1131                }
1132            }
1133            [_, Some(right)] => {
1134                self.merge(right, true);
1135                if parent.buflen() == 0 {
1136                    unsafe {
1137                        let _ = (*self.node.as_ptr()).parent.take();
1138                        drop(Box::from_raw(parent.as_internal_ptr()));
1139                        Some(self.promote().forget_type())
1140                    }
1141                } else {
1142                    parent.underflow()
1143                }
1144            }
1145            [None, None] => unreachable!(),
1146        }
1147    }
1148
1149    fn rotate(&mut self, other: &mut Self) {
1150        if !self.is_underfull() && !other.is_underfull() {
1151            return;
1152        }
1153        let Handle { node: parent, idx, .. } = self.parent().unwrap();
1154        Self::rotate_internal(
1155            self.as_internal_ptr(),
1156            (parent.as_internal_ptr(), idx),
1157            other.as_internal_ptr(),
1158        );
1159        self.correct_parent_children_invariant();
1160        other.correct_parent_children_invariant();
1161    }
1162    fn merge(&mut self, other: Self, self_left: bool) {
1163        let Handle { node: mut parent, idx, .. } = self.parent().unwrap();
1164        if self_left {
1165            Self::merge_internal(
1166                self.as_internal_ptr(),
1167                (parent.as_internal_ptr(), idx),
1168                other.as_internal_ptr(),
1169            );
1170        } else {
1171            Self::merge_internal(
1172                other.as_internal_ptr(),
1173                (parent.as_internal_ptr(), idx - 1),
1174                self.as_internal_ptr(),
1175            );
1176            unsafe {
1177                ptr::swap(self.as_internal_ptr(), other.as_internal_ptr());
1178                (*parent.as_internal_ptr()).children[idx - 1].write(self.node);
1179            }
1180        }
1181        self.correct_parent_children_invariant();
1182        parent.correct_parent_children_invariant();
1183        unsafe { drop(Box::from_raw(other.as_internal_ptr())) }
1184    }
1185    fn append(&mut self, elt: T, other: Self) {
1186        Self::append_internal(
1187            self.as_internal_ptr(),
1188            elt,
1189            other.as_internal_ptr(),
1190        );
1191        self.correct_parent_children_invariant();
1192        unsafe { drop(Box::from_raw(other.as_internal_ptr())) }
1193    }
1194
1195    fn rotate_internal(
1196        left_ptr: *mut InternalNode<T>,
1197        (parent_ptr, idx): (*mut InternalNode<T>, usize),
1198        right_ptr: *mut InternalNode<T>,
1199    ) {
1200        unsafe {
1201            let left = &mut (*left_ptr).children;
1202            let leftlen = (*left_ptr).data.buflen as usize + 1;
1203            let right = &mut (*right_ptr).children;
1204            let rightlen = (*right_ptr).data.buflen as usize + 1;
1205            array_rotate_2(left, right, leftlen, rightlen, MIN_BUFLEN + 1);
1206        }
1207        MutLeafNodeRef::<T>::rotate_leaf(
1208            left_ptr.cast(),
1209            (parent_ptr, idx),
1210            right_ptr.cast(),
1211        );
1212    }
1213
1214    fn merge_internal(
1215        left_ptr: *mut InternalNode<T>,
1216        (parent_ptr, idx): (*mut InternalNode<T>, usize),
1217        right_ptr: *mut InternalNode<T>,
1218    ) {
1219        unsafe {
1220            let left = &mut (*left_ptr).children;
1221            let leftlen = (*left_ptr).data.buflen as usize + 1;
1222            let right = &(*right_ptr).children;
1223            let rightlen = (*right_ptr).data.buflen as usize + 1;
1224            array_splice(left, leftlen, leftlen, right, rightlen);
1225        }
1226        MutLeafNodeRef::<T>::merge_leaf(
1227            left_ptr.cast(),
1228            (parent_ptr, idx),
1229            right_ptr.cast(),
1230        );
1231    }
1232
1233    fn append_internal(
1234        left_ptr: *mut InternalNode<T>,
1235        mid: T,
1236        right_ptr: *mut InternalNode<T>,
1237    ) {
1238        unsafe {
1239            let left = &mut (*left_ptr).children;
1240            let leftlen = (*left_ptr).data.buflen as usize + 1;
1241            let right = &(*right_ptr).children;
1242            let rightlen = (*right_ptr).data.buflen as usize + 1;
1243            array_splice(left, leftlen, leftlen, right, rightlen);
1244        }
1245        NodeRef::append_leaf(left_ptr.cast(), mid, right_ptr.cast());
1246    }
1247}
1248
1249struct Handle<Node, Type> {
1250    node: Node,
1251    idx: usize,
1252    _marker: PhantomData<Type>,
1253}
1254
1255impl<Node: Copy, Type> Copy for Handle<Node, Type> {}
1256impl<Node: Copy, Type> Clone for Handle<Node, Type> {
1257    fn clone(&self) -> Self { *self }
1258}
1259
1260impl<Node, Type> Handle<Node, Type> {
1261    fn new(node: Node, idx: usize) -> Self {
1262        Self { node, idx, _marker: PhantomData }
1263    }
1264}
1265impl<BorrowType, T, Type> Handle<NodeRef<BorrowType, T, marker::Leaf>, Type> {
1266    fn forget_node_type(
1267        self,
1268    ) -> Handle<NodeRef<BorrowType, T, marker::LeafOrInternal>, Type> {
1269        Handle {
1270            node: self.node.forget_type(),
1271            idx: self.idx,
1272            _marker: PhantomData,
1273        }
1274    }
1275}
1276impl<BorrowType, T, Type>
1277    Handle<NodeRef<BorrowType, T, marker::Internal>, Type>
1278{
1279    #[allow(dead_code)]
1280    fn forget_node_type(
1281        self,
1282    ) -> Handle<NodeRef<BorrowType, T, marker::LeafOrInternal>, Type> {
1283        Handle {
1284            node: self.node.forget_type(),
1285            idx: self.idx,
1286            _marker: PhantomData,
1287        }
1288    }
1289}
1290
1291impl<'a, T: 'a, NodeType>
1292    Handle<NodeRef<marker::Immut<'a>, T, NodeType>, marker::Value>
1293{
1294    unsafe fn get(&self) -> &'a T {
1295        let Self { node, idx, .. } = self;
1296        let ptr = node.node.as_ptr();
1297        debug_assert!(*idx < usize::from((*ptr).buflen));
1298        unsafe { (*ptr).buf[*idx].assume_init_ref() }
1299    }
1300}
1301impl<'a, T: 'a, NodeType>
1302    Handle<NodeRef<marker::ValMut<'a>, T, NodeType>, marker::Value>
1303{
1304    unsafe fn get_mut(&self) -> &'a mut T {
1305        let Self { node, idx, .. } = self;
1306        let ptr = node.node.as_ptr();
1307        debug_assert!(*idx < usize::from((*ptr).buflen));
1308        unsafe { (*ptr).buf[*idx].assume_init_mut() }
1309    }
1310}
1311
1312struct LeafSplit<'a, T> {
1313    left: Option<OwnedNodeRef<T>>,
1314    right: Option<OwnedNodeRef<T>>,
1315    parent: Option<Handle<MutInternalNodeRef<'a, T>, marker::Edge>>,
1316}
1317
1318impl<'a, T> Handle<MutLeafNodeRef<'a, T>, marker::Edge> {
1319    fn split_ascend(self) -> LeafSplit<'a, T> {
1320        // [A, B, C, D, E, F, G] => [A, B, C, D], [E, F, G]
1321        let Self { mut node, idx, .. } = self;
1322        let init_len = node.buflen() as usize;
1323        let parent = node.parent();
1324        let _ = unsafe { (*node.node.as_ptr()).parent.take() };
1325        let (left, right) = if idx == 0 {
1326            (None, Some(unsafe { node.promote() }))
1327        } else if idx == init_len {
1328            (Some(unsafe { node.promote() }), None)
1329        } else {
1330            let new = NodeRef::new_leaf();
1331            let left_ptr = node.node.as_ptr();
1332            let right_ptr = new.node.as_ptr();
1333            unsafe {
1334                let left = &mut (*left_ptr).buf;
1335                let right = &mut (*right_ptr).buf;
1336                let rightlen = array_rotate_2(left, right, init_len, 0, idx);
1337                (*left_ptr).buflen = idx as _;
1338                (*right_ptr).buflen = rightlen as _;
1339                (Some(node.promote()), Some(new))
1340            }
1341        };
1342        let left = left.map(|o| o.forget_type());
1343        let right = right.map(|o| o.forget_type());
1344        LeafSplit { left, right, parent }
1345    }
1346}
1347
1348struct InternalSplit<'a, T> {
1349    left: Option<(OwnedNodeRef<T>, T)>,
1350    right: Option<(OwnedNodeRef<T>, T)>,
1351    parent: Option<Handle<MutInternalNodeRef<'a, T>, marker::Edge>>,
1352}
1353
1354impl<'a, T> Handle<MutInternalNodeRef<'a, T>, marker::Edge> {
1355    fn split_ascend(self) -> InternalSplit<'a, T> {
1356        let Self { mut node, idx, .. } = self;
1357        let init_len = node.buflen() as usize;
1358        let parent = node.parent();
1359        let _ = unsafe { (*node.node.as_ptr()).parent.take() };
1360        let (left, right) = if idx == 0 {
1361            // (A), [B, C, D, E]
1362            unsafe {
1363                let ptr = node.as_internal_ptr();
1364                let buf = &mut (*ptr).data.buf;
1365                let elt = array_remove(buf, 0, init_len);
1366                let children = &mut (*ptr).children;
1367                let _ = array_remove(children, 0, init_len + 1);
1368                (*ptr).data.buflen -= 1;
1369                node.correct_parent_children_invariant();
1370                (None, Some((node.promote(), elt)))
1371            }
1372        } else if idx == init_len {
1373            unsafe {
1374                let ptr = node.as_internal_ptr();
1375                let buf = &mut (*ptr).data.buf;
1376                let elt = array_remove(buf, init_len - 1, init_len);
1377                let children = &mut (*ptr).children;
1378                let _ = array_remove(children, init_len, init_len + 1);
1379                (*ptr).data.buflen -= 1;
1380                node.correct_parent_children_invariant();
1381                (Some((node.promote(), elt)), None)
1382            }
1383        } else {
1384            // [A, B, C, D, |E], [F|, G, H]
1385            // [A, B, C, D], (E), (F), [G, H]
1386            unsafe {
1387                let mut new = NodeRef::new_empty_internal(node.height);
1388                let left_ptr = node.as_internal_ptr();
1389                let right_ptr = new.as_internal_ptr();
1390                let left_buf = &mut (*left_ptr).data.buf;
1391                let right_buf = &mut (*right_ptr).data.buf;
1392                let rightlen =
1393                    array_rotate_2(left_buf, right_buf, init_len, 0, idx + 1);
1394                let left_elt = left_buf[idx - 1].assume_init_read();
1395                let right_elt = left_buf[idx].assume_init_read();
1396                let left_children = &mut (*left_ptr).children;
1397                let right_children = &mut (*right_ptr).children;
1398                array_rotate_2(
1399                    left_children,
1400                    right_children,
1401                    init_len + 1,
1402                    0,
1403                    idx + 1,
1404                );
1405                (*left_ptr).data.buflen = (idx - 1) as _;
1406                (*right_ptr).data.buflen = rightlen as _;
1407                node.correct_parent_children_invariant();
1408                new.borrow_mut().correct_parent_children_invariant();
1409                let left = node.promote();
1410                let right = new;
1411                (Some((left, left_elt)), Some((right, right_elt)))
1412            }
1413        };
1414        // If an internal node has only one element and no child, then
1415        // we must return its child node instead. Deallocating the newly
1416        // allocated node is undesirable, but it reduces cases.
1417        let left = left.map(|(mut tree, elt)| {
1418            if tree.buflen() == 0 {
1419                unsafe {
1420                    let mut child = tree.borrow_mut().child(0).unwrap();
1421                    let _ = (*child.node.as_ptr()).parent.take();
1422                    let res = (child.promote(), elt);
1423                    drop(Box::from_raw(tree.as_internal_ptr()));
1424                    res
1425                }
1426            } else {
1427                (tree.forget_type(), elt)
1428            }
1429        });
1430        let right = right.map(|(mut tree, elt)| {
1431            if tree.buflen() == 0 {
1432                unsafe {
1433                    let mut child = tree.borrow_mut().child(0).unwrap();
1434                    let _ = (*child.node.as_ptr()).parent.take();
1435                    let res = (child.promote(), elt);
1436                    drop(Box::from_raw(tree.as_internal_ptr()));
1437                    res
1438                }
1439            } else {
1440                (tree.forget_type(), elt)
1441            }
1442        });
1443
1444        InternalSplit { left, right, parent }
1445    }
1446}
1447
1448impl<'a, T> Handle<MutLeafNodeRef<'a, T>, marker::Edge> {
1449    fn split(self) -> [Option<OwnedNodeRef<T>>; 2] {
1450        let [mut left_inner, mut right_inner]: [Option<T>; 2] = [None, None];
1451        let LeafSplit {
1452            left: mut left_tree,
1453            right: mut right_tree,
1454            parent: mut node,
1455        } = self.split_ascend();
1456
1457        while let Some(cur) = node.take() {
1458            let InternalSplit { left, right, parent } = cur.split_ascend();
1459            match (left_tree, left) {
1460                (Some(left_lo), Some((left_hi, elt))) => {
1461                    left_tree = Some(left_hi.adjoin(elt, left_lo));
1462                }
1463                (None, Some((tree, elt))) => {
1464                    left_inner = Some(elt);
1465                    left_tree = Some(tree);
1466                }
1467                (o, None) => left_tree = o,
1468            }
1469            match (right_tree, right) {
1470                (Some(right_lo), Some((right_hi, elt))) => {
1471                    right_tree = Some(right_lo.adjoin(elt, right_hi));
1472                }
1473                (None, Some((tree, elt))) => {
1474                    right_inner = Some(elt);
1475                    right_tree = Some(tree);
1476                }
1477                (o, None) => right_tree = o,
1478            }
1479            node = parent;
1480        }
1481        if let (Some(old), Some(elt)) = (left_tree.as_mut(), left_inner) {
1482            if let Some(new) = old.borrow_mut().push_back(elt) {
1483                left_tree = Some(new.forget_type());
1484            }
1485        }
1486        if let (Some(old), Some(elt)) = (right_tree.as_mut(), right_inner) {
1487            if let Some(new) = old.borrow_mut().push_front(elt) {
1488                right_tree = Some(new.forget_type());
1489            }
1490        }
1491        [left_tree, right_tree]
1492    }
1493}
1494
1495impl<BorrowType: Traversable, T>
1496    Handle<NodeRef<BorrowType, T, marker::LeafOrInternal>, marker::Edge>
1497{
1498    fn next(&mut self) {
1499        use ForceResult::*;
1500        let Self { node, idx, .. } = self;
1501        match node.force() {
1502            Leaf(_) => {
1503                let buflen = node.buflen() as usize;
1504                *idx += 1;
1505                if *idx < buflen {
1506                    return;
1507                }
1508                let mut parent = node.parent();
1509                while let Some(handle) = parent.as_ref() {
1510                    if handle.idx < usize::from(handle.node.buflen()) {
1511                        self.node.node = handle.node.node;
1512                        self.node.height = handle.node.height;
1513                        self.idx = handle.idx;
1514                        return;
1515                    }
1516                    parent = handle.node.parent();
1517                }
1518                // We have reached the last edge; nothing can be done.
1519            }
1520            Internal(internal) => {
1521                debug_assert!(*idx < usize::from(internal.buflen()));
1522                *idx += 1;
1523                let leaf = internal.child(*idx as _).unwrap().first_leaf();
1524                *self = leaf.forget_node_type();
1525            }
1526        }
1527    }
1528    fn next_back(&mut self) {
1529        use ForceResult::*;
1530        let Self { node, idx, .. } = self;
1531        match node.force() {
1532            Leaf(_) => {
1533                *idx -= 1;
1534                if *idx > 0 {
1535                    return;
1536                }
1537                let mut parent = node.parent();
1538                while let Some(handle) = parent.as_ref() {
1539                    if handle.idx > 0 {
1540                        self.node.node = handle.node.node;
1541                        self.node.height = handle.node.height;
1542                        self.idx = handle.idx;
1543                        return;
1544                    }
1545                    parent = handle.node.parent();
1546                }
1547                // We have reached the first edge; nothing can be done.
1548            }
1549            Internal(internal) => {
1550                debug_assert!(*idx > 0);
1551                *idx -= 1;
1552                let leaf = internal.child(*idx as _).unwrap().last_leaf();
1553                *self = leaf.forget_node_type();
1554            }
1555        }
1556    }
1557    fn eq(&self, other: &Self) -> bool {
1558        self.node.node == other.node.node && self.idx == other.idx
1559    }
1560}
1561
1562impl<T>
1563    Handle<NodeRef<marker::Dying, T, marker::LeafOrInternal>, marker::Edge>
1564{
1565    /// # Safety
1566    /// The element must not be taken twice.
1567    unsafe fn take_next(&self) -> T {
1568        let Self { node, idx, .. } = self;
1569        let ptr = node.node.as_ptr();
1570        unsafe { (*ptr).buf[*idx].assume_init_read() }
1571    }
1572    unsafe fn take_prev(&self) -> T {
1573        let Self { node, idx, .. } = self;
1574        let ptr = node.node.as_ptr();
1575        unsafe { (*ptr).buf[idx - 1].assume_init_read() }
1576    }
1577}
1578impl<'a, T>
1579    Handle<NodeRef<marker::Immut<'a>, T, marker::LeafOrInternal>, marker::Edge>
1580{
1581    fn get_next(&self) -> &'a T {
1582        let Self { node, idx, .. } = self;
1583        let ptr = node.node.as_ptr();
1584        unsafe { (*ptr).buf[*idx].assume_init_ref() }
1585    }
1586    fn get_prev(&self) -> &'a T {
1587        let Self { node, idx, .. } = self;
1588        let ptr = node.node.as_ptr();
1589        unsafe { (*ptr).buf[idx - 1].assume_init_ref() }
1590    }
1591}
1592impl<'a, T>
1593    Handle<NodeRef<marker::ValMut<'a>, T, marker::LeafOrInternal>, marker::Edge>
1594{
1595    fn get_mut_next(&self) -> &'a mut T {
1596        let Self { node, idx, .. } = self;
1597        let ptr = node.node.as_ptr();
1598        unsafe { (*ptr).buf[*idx].assume_init_mut() }
1599    }
1600    fn get_mut_prev(&self) -> &'a mut T {
1601        let Self { node, idx, .. } = self;
1602        let ptr = node.node.as_ptr();
1603        unsafe { (*ptr).buf[idx - 1].assume_init_mut() }
1604    }
1605}
1606
1607struct IterImpl<'a, T> {
1608    left: Handle<ImmutNodeRef<'a, T>, marker::Edge>,
1609    right: Handle<ImmutNodeRef<'a, T>, marker::Edge>,
1610}
1611
1612impl<'a, T> IterImpl<'a, T> {
1613    fn new(
1614        left: Handle<ImmutNodeRef<'a, T>, marker::Edge>,
1615        right: Handle<ImmutNodeRef<'a, T>, marker::Edge>,
1616    ) -> Self {
1617        Self { left, right }
1618    }
1619}
1620impl<'a, T: 'a> Iterator for IterImpl<'a, T> {
1621    type Item = &'a T;
1622    fn next(&mut self) -> Option<Self::Item> {
1623        (!self.left.eq(&self.right)).then(|| {
1624            let res = self.left.get_next();
1625            self.left.next();
1626            res
1627        })
1628    }
1629}
1630impl<'a, T: 'a> DoubleEndedIterator for IterImpl<'a, T> {
1631    fn next_back(&mut self) -> Option<Self::Item> {
1632        (!self.left.eq(&self.right)).then(|| {
1633            let res = self.right.get_prev();
1634            self.right.next_back();
1635            res
1636        })
1637    }
1638}
1639
1640struct IterMutImpl<'a, T> {
1641    left: Handle<ValMutNodeRef<'a, T>, marker::Edge>,
1642    right: Handle<ValMutNodeRef<'a, T>, marker::Edge>,
1643}
1644
1645impl<'a, T: 'a> IterMutImpl<'a, T> {
1646    fn new(
1647        left: Handle<ValMutNodeRef<'a, T>, marker::Edge>,
1648        right: Handle<ValMutNodeRef<'a, T>, marker::Edge>,
1649    ) -> Self {
1650        Self { left, right }
1651    }
1652}
1653impl<'a, T: 'a> Iterator for IterMutImpl<'a, T> {
1654    type Item = &'a mut T;
1655    fn next(&mut self) -> Option<Self::Item> {
1656        (!self.left.eq(&self.right)).then(|| {
1657            let res = self.left.get_mut_next();
1658            self.left.next();
1659            res
1660        })
1661    }
1662}
1663impl<'a, T: 'a> DoubleEndedIterator for IterMutImpl<'a, T> {
1664    fn next_back(&mut self) -> Option<Self::Item> {
1665        (!self.left.eq(&self.right)).then(|| {
1666            let res = self.right.get_mut_prev();
1667            self.right.next_back();
1668            res
1669        })
1670    }
1671}
1672
1673struct IntoIterImpl<T> {
1674    left: Handle<DyingNodeRef<T>, marker::Edge>,
1675    right: Handle<DyingNodeRef<T>, marker::Edge>,
1676}
1677
1678impl<T> IntoIterImpl<T> {
1679    fn new(
1680        left: Handle<DyingNodeRef<T>, marker::Edge>,
1681        right: Handle<DyingNodeRef<T>, marker::Edge>,
1682    ) -> Self {
1683        Self { left, right }
1684    }
1685}
1686impl<T> Iterator for IntoIterImpl<T> {
1687    type Item = T;
1688    fn next(&mut self) -> Option<Self::Item> {
1689        (!self.left.eq(&self.right)).then(|| {
1690            let res = unsafe { self.left.take_next() };
1691            self.left.next();
1692            res
1693        })
1694    }
1695}
1696impl<T> DoubleEndedIterator for IntoIterImpl<T> {
1697    fn next_back(&mut self) -> Option<Self::Item> {
1698        (!self.left.eq(&self.right)).then(|| {
1699            let res = unsafe { self.right.take_prev() };
1700            self.right.next_back();
1701            res
1702        })
1703    }
1704}
1705
1706pub struct Iter<'a, T>(Option<IterImpl<'a, T>>);
1707pub struct IterMut<'a, T>(Option<IterMutImpl<'a, T>>);
1708pub struct IntoIter<T>(Option<IntoIterImpl<T>>);
1709
1710impl<'a, T> Iter<'a, T> {
1711    fn new(root: Option<&'a OwnedNodeRef<T>>) -> Self {
1712        Self(root.map(|root| root.borrow().iter()))
1713    }
1714}
1715
1716impl<'a, T> IterMut<'a, T> {
1717    fn new(root: Option<&'a mut OwnedNodeRef<T>>) -> Self {
1718        Self(root.map(|root| root.borrow_valmut().iter()))
1719    }
1720}
1721
1722impl<T> IntoIter<T> {
1723    fn new(root: Option<OwnedNodeRef<T>>) -> Self {
1724        Self(root.map(|root| root.take().iter()))
1725    }
1726}
1727impl<T> Drop for IntoIter<T> {
1728    fn drop(&mut self) {
1729        if let Some(mut iter) = self.0.take() {
1730            while let Some(_) = iter.next() {}
1731            iter.left.node.root().drop_subtree(true);
1732        }
1733    }
1734}
1735
1736impl<'a, T: 'a> Iterator for Iter<'a, T> {
1737    type Item = &'a T;
1738    fn next(&mut self) -> Option<Self::Item> {
1739        self.0.as_mut().and_then(|iter| iter.next())
1740    }
1741}
1742impl<'a, T: 'a> DoubleEndedIterator for Iter<'a, T> {
1743    fn next_back(&mut self) -> Option<Self::Item> {
1744        self.0.as_mut().and_then(|iter| iter.next_back())
1745    }
1746}
1747impl<'a, T: 'a> Iterator for IterMut<'a, T> {
1748    type Item = &'a mut T;
1749    fn next(&mut self) -> Option<Self::Item> {
1750        self.0.as_mut().and_then(|iter| iter.next())
1751    }
1752}
1753impl<'a, T: 'a> DoubleEndedIterator for IterMut<'a, T> {
1754    fn next_back(&mut self) -> Option<Self::Item> {
1755        self.0.as_mut().and_then(|iter| iter.next_back())
1756    }
1757}
1758impl<T> Iterator for IntoIter<T> {
1759    type Item = T;
1760    fn next(&mut self) -> Option<Self::Item> {
1761        self.0.as_mut().and_then(|iter| iter.next())
1762    }
1763}
1764impl<T> DoubleEndedIterator for IntoIter<T> {
1765    fn next_back(&mut self) -> Option<Self::Item> {
1766        self.0.as_mut().and_then(|iter| iter.next_back())
1767    }
1768}
1769
1770pub struct Range<'a, T>(Option<IterImpl<'a, T>>);
1771pub struct RangeMut<'a, T>(Option<IterMutImpl<'a, T>>);
1772
1773impl<'a, T> Range<'a, T> {
1774    fn new(
1775        root: Option<&'a OwnedNodeRef<T>>,
1776        range: ops::Range<usize>,
1777    ) -> Self {
1778        Self(root.map(|root| unsafe { root.borrow().range(range) }))
1779    }
1780}
1781
1782impl<'a, T> RangeMut<'a, T> {
1783    fn new(
1784        root: Option<&'a mut OwnedNodeRef<T>>,
1785        range: ops::Range<usize>,
1786    ) -> Self {
1787        Self(root.map(|root| unsafe { root.borrow_valmut().range(range) }))
1788    }
1789}
1790
1791impl<'a, T: 'a> Iterator for Range<'a, T> {
1792    type Item = &'a T;
1793    fn next(&mut self) -> Option<Self::Item> {
1794        self.0.as_mut().and_then(|iter| iter.next())
1795    }
1796}
1797impl<'a, T: 'a> DoubleEndedIterator for Range<'a, T> {
1798    fn next_back(&mut self) -> Option<Self::Item> {
1799        self.0.as_mut().and_then(|iter| iter.next_back())
1800    }
1801}
1802impl<'a, T: 'a> Iterator for RangeMut<'a, T> {
1803    type Item = &'a mut T;
1804    fn next(&mut self) -> Option<Self::Item> {
1805        self.0.as_mut().and_then(|iter| iter.next())
1806    }
1807}
1808impl<'a, T: 'a> DoubleEndedIterator for RangeMut<'a, T> {
1809    fn next_back(&mut self) -> Option<Self::Item> {
1810        self.0.as_mut().and_then(|iter| iter.next_back())
1811    }
1812}
1813
1814impl<T> BTreeSeq<T> {
1815    pub fn new() -> Self { Self { root: None } }
1816
1817    pub fn len(&self) -> usize {
1818        self.root.as_ref().map(|root| root.treelen()).unwrap_or(0)
1819    }
1820    pub fn is_empty(&self) -> bool { self.root.is_none() }
1821
1822    pub fn push_back(&mut self, elt: T) {
1823        if let Some(root) = self.root.as_mut() {
1824            root.borrow_mut().push_back(elt);
1825        } else {
1826            *self = Self::singleton(elt);
1827        }
1828    }
1829    pub fn push_front(&mut self, elt: T) {
1830        if let Some(root) = self.root.as_mut() {
1831            root.borrow_mut().push_front(elt);
1832        } else {
1833            *self = Self::singleton(elt);
1834        }
1835    }
1836
1837    pub fn pop_back(&mut self) -> Option<T> {
1838        let len = self.len();
1839        self.root.take().map(|root| unsafe {
1840            let [left, right] = root.split_off(len - 1);
1841            self.root = left;
1842            right.unwrap().take_single()
1843        })
1844    }
1845    pub fn pop_front(&mut self) -> Option<T> {
1846        self.root.take().map(|root| unsafe {
1847            let [left, right] = root.split_off(1);
1848            self.root = right;
1849            left.unwrap().take_single()
1850        })
1851    }
1852
1853    pub fn adjoin(&mut self, elt: T, mut other: Self) {
1854        self.root = match (self.root.take(), other.root.take()) {
1855            (Some(left), Some(right)) => Some(left.adjoin(elt, right)),
1856            (Some(mut left), None) => left
1857                .borrow_mut()
1858                .push_back(elt)
1859                .map(|o| o.forget_type())
1860                .or_else(|| Some(left)),
1861            (None, Some(mut right)) => right
1862                .borrow_mut()
1863                .push_front(elt)
1864                .map(|o| o.forget_type())
1865                .or_else(|| Some(right)),
1866            (None, None) => Self::singleton(elt).root.take(),
1867        };
1868    }
1869    pub fn append(&mut self, mut other: Self) {
1870        if let Some(elt) = other.pop_front() {
1871            self.adjoin(elt, other)
1872        }
1873    }
1874
1875    pub fn split_off(&mut self, at: usize) -> Self {
1876        #[cold]
1877        fn assert_failed(at: usize, len: usize) -> ! {
1878            panic!("`at` split index (is {at}) should be <= len (is {len})");
1879        }
1880        if at > self.len() {
1881            assert_failed(at, self.len());
1882        }
1883
1884        if at == 0 {
1885            Self { root: self.root.take() }
1886        } else if at == self.len() {
1887            Self::new()
1888        } else {
1889            let [left, right] =
1890                unsafe { self.root.take().unwrap().split_off(at) };
1891            self.root = left;
1892            Self { root: right }
1893        }
1894    }
1895
1896    fn singleton(elt: T) -> Self {
1897        let mut root = NodeRef::new_leaf();
1898        unsafe {
1899            root.borrow_mut().insert(0, elt);
1900            Self { root: Some(root.forget_type()) }
1901        }
1902    }
1903
1904    pub fn iter<'a>(&'a self) -> Iter<'a, T> { Iter::new(self.root.as_ref()) }
1905    pub fn iter_mut<'a>(&'a mut self) -> IterMut<'a, T> {
1906        IterMut::new(self.root.as_mut())
1907    }
1908    pub fn into_iter(mut self) -> IntoIter<T> {
1909        IntoIter::new(self.root.take())
1910    }
1911
1912    pub fn range<'a>(&'a self, range: impl RangeBounds<usize>) -> Range<'a, T> {
1913        let range = range.to_range(self.len());
1914        Range::new(self.root.as_ref(), range)
1915    }
1916    pub fn range_mut<'a>(
1917        &'a mut self,
1918        range: impl RangeBounds<usize>,
1919    ) -> RangeMut<'a, T> {
1920        let range = range.to_range(self.len());
1921        RangeMut::new(self.root.as_mut(), range)
1922    }
1923
1924    pub fn bisect<'a, F>(&'a self, predicate: F) -> (Option<&'a T>, usize)
1925    where
1926        F: Fn(&T) -> bool,
1927    {
1928        let len = self.len();
1929        self.root.as_ref().map_or((None, 0), |root| unsafe {
1930            let idx = root.borrow().bisect_index(predicate);
1931            ((idx < len).then(|| root.borrow().select_value(idx).get()), idx)
1932        })
1933    }
1934    pub fn bisect_mut<'a, F>(
1935        &'a mut self,
1936        predicate: F,
1937    ) -> (Option<&'a mut T>, usize)
1938    where
1939        F: Fn(&T) -> bool,
1940    {
1941        let len = self.len();
1942        self.root.as_mut().map_or((None, 0), |root| unsafe {
1943            let idx = root.borrow_valmut().bisect_index(predicate);
1944            (
1945                (idx < len)
1946                    .then(|| root.borrow_valmut().select_value(idx).get_mut()),
1947                idx,
1948            )
1949        })
1950    }
1951
1952    pub fn insert(&mut self, at: usize, elt: T) {
1953        #[cold]
1954        fn assert_failed(at: usize, len: usize) -> ! {
1955            panic!("`at` insert index (is {at}) should be <= len (is {len})");
1956        }
1957        if at > self.len() {
1958            assert_failed(at, self.len());
1959        }
1960        let tmp = self.split_off(at);
1961        self.adjoin(elt, tmp);
1962    }
1963    pub fn remove(&mut self, at: usize) -> T {
1964        #[cold]
1965        fn assert_failed(at: usize, len: usize) -> ! {
1966            panic!("`at` remove index (is {at}) should be < len (is {len})");
1967        }
1968        if at >= self.len() {
1969            assert_failed(at, self.len());
1970        }
1971        let tmp = self.split_off(at + 1);
1972        let rm = self.pop_back().unwrap();
1973        self.append(tmp);
1974        rm
1975    }
1976    pub fn rotate(&mut self, new_first: usize) {
1977        #[cold]
1978        fn assert_failed(at: usize, len: usize) -> ! {
1979            panic!("`at` rotate index (is {at}) should be < len (is {len})");
1980        }
1981        if new_first >= self.len() {
1982            assert_failed(new_first, self.len());
1983        }
1984        let mut new_left = self.split_off(new_first);
1985        let new_right = self.split_off(0);
1986        new_left.append(new_right);
1987        self.root = new_left.root.take();
1988    }
1989
1990    /// # Safety
1991    /// `i < self.len()`
1992    pub unsafe fn get_unchecked(&self, index: usize) -> &T {
1993        debug_assert!(self.root.is_some()); // as `0 <= index < self.len()`
1994        let root = self.root.as_ref().unwrap();
1995        unsafe { root.borrow().select_value(index).get() }
1996    }
1997    /// # Safety
1998    /// `i < self.len()`
1999    pub unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
2000        debug_assert!(self.root.is_some()); // as `0 <= index < self.len()`
2001        let root = self.root.as_mut().unwrap();
2002        unsafe { root.borrow_valmut().select_value(index).get_mut() }
2003    }
2004
2005    pub fn get(&self, index: usize) -> Option<&T> {
2006        (index < self.len()).then(|| unsafe { self.get_unchecked(index) })
2007    }
2008    pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
2009        (index < self.len()).then(|| unsafe { self.get_unchecked_mut(index) })
2010    }
2011}
2012
2013impl<T> Default for BTreeSeq<T> {
2014    fn default() -> Self { Self::new() }
2015}
2016impl<T: Clone> Clone for BTreeSeq<T> {
2017    fn clone(&self) -> Self { self.iter().cloned().collect() }
2018}
2019
2020impl<T: PartialEq> PartialEq for BTreeSeq<T> {
2021    fn eq(&self, other: &Self) -> bool { self.iter().eq(other.iter()) }
2022}
2023impl<T: Eq> Eq for BTreeSeq<T> {}
2024
2025impl<T: PartialOrd> PartialOrd for BTreeSeq<T> {
2026    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
2027        self.iter().partial_cmp(other.iter())
2028    }
2029}
2030impl<T: Ord> Ord for BTreeSeq<T> {
2031    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
2032        self.iter().cmp(other.iter())
2033    }
2034}
2035
2036impl<T: fmt::Debug> fmt::Debug for BTreeSeq<T> {
2037    fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
2038        fmt.debug_list().entries(self.iter()).finish()
2039    }
2040}
2041
2042impl<T> FromIterator<T> for BTreeSeq<T> {
2043    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
2044        let mut root = NodeRef::new_leaf();
2045        let mut mut_node = root.borrow_mut();
2046        let mut trace_root = None;
2047        for elt in iter {
2048            if let Some(new_root) =
2049                unsafe { mut_node.insert(mut_node.buflen() as _, elt) }
2050            {
2051                let _ = trace_root.insert(new_root);
2052            }
2053        }
2054        let mut root = trace_root
2055            .map(|node| node.forget_type())
2056            .unwrap_or_else(|| root.forget_type());
2057        root.borrow_mut().correct_treelen_invariant_subtree();
2058
2059        if root.treelen() == 0 {
2060            unsafe { drop(Box::from_raw(root.node.as_ptr())) }
2061            Self::new()
2062        } else {
2063            Self { root: Some(root) }
2064        }
2065    }
2066}
2067impl<T> Extend<T> for BTreeSeq<T> {
2068    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
2069        let tmp: BTreeSeq<T> = iter.into_iter().collect();
2070        self.append(tmp);
2071    }
2072}
2073
2074impl<T> Index<usize> for BTreeSeq<T> {
2075    type Output = T;
2076    fn index(&self, index: usize) -> &Self::Output {
2077        #[cold]
2078        fn assert_failed(index: usize, len: usize) -> ! {
2079            panic!("`index` index (is {index}) should be < len (is {len})");
2080        }
2081        if index >= self.len() {
2082            assert_failed(index, self.len());
2083        }
2084        unsafe { self.get_unchecked(index) }
2085    }
2086}
2087impl<T> IndexMut<usize> for BTreeSeq<T> {
2088    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
2089        #[cold]
2090        fn assert_failed(index: usize, len: usize) -> ! {
2091            panic!("`index` index (is {index}) should be < len (is {len})");
2092        }
2093        if index >= self.len() {
2094            assert_failed(index, self.len());
2095        }
2096        unsafe { self.get_unchecked_mut(index) }
2097    }
2098}
2099
2100impl<'a, T> IntoIterator for &'a BTreeSeq<T> {
2101    type Item = &'a T;
2102    type IntoIter = Iter<'a, T>;
2103    fn into_iter(self) -> Self::IntoIter { self.iter() }
2104}
2105impl<'a, T> IntoIterator for &'a mut BTreeSeq<T> {
2106    type Item = &'a mut T;
2107    type IntoIter = IterMut<'a, T>;
2108    fn into_iter(self) -> Self::IntoIter { self.iter_mut() }
2109}
2110impl<T> IntoIterator for BTreeSeq<T> {
2111    type Item = T;
2112    type IntoIter = IntoIter<T>;
2113    fn into_iter(self) -> Self::IntoIter { self.into_iter() }
2114}
2115
2116impl<T> Drop for BTreeSeq<T> {
2117    fn drop(&mut self) { self.root.take().map(|mut root| root.drop_subtree()); }
2118}
2119
2120#[cfg(test)]
2121mod debug;
2122
2123#[cfg(test)]
2124mod tests_node {
2125    use super::*;
2126
2127    #[test]
2128    fn push_front() {
2129        let mut root = NodeRef::new_leaf();
2130        let mut mut_node = root.borrow_mut();
2131        let mut trace_root = None;
2132
2133        let start = 0;
2134        let end = 300;
2135        unsafe {
2136            for i in (start..end).rev() {
2137                if let Some(new_root) = mut_node.insert(0, i) {
2138                    let _ = trace_root.insert(new_root);
2139                }
2140            }
2141        }
2142
2143        let mut root = trace_root
2144            .map(|r| r.forget_type())
2145            .unwrap_or_else(|| root.forget_type());
2146        root.drop_subtree()
2147    }
2148    #[test]
2149    fn push_back() {
2150        let mut root = NodeRef::new_leaf();
2151        let mut mut_node = root.borrow_mut();
2152        let mut trace_root = None;
2153
2154        let start = 0;
2155        let end = 300;
2156        unsafe {
2157            for i in start..end {
2158                if let Some(new_root) =
2159                    mut_node.insert(mut_node.buflen() as _, i)
2160                {
2161                    let _ = trace_root.insert(new_root);
2162                }
2163
2164                // if let Some(r) = trace_root.as_ref() {
2165                //     eprintln!();
2166                //     debug::visualize(r.borrow().forget_type());
2167                // }
2168            }
2169        }
2170
2171        let mut root = trace_root
2172            .map(|r| r.forget_type())
2173            .unwrap_or_else(|| root.forget_type());
2174
2175        eprintln!();
2176        debug::visualize(root.borrow());
2177
2178        root.drop_subtree()
2179    }
2180
2181    fn from_iter<T>(iter: impl IntoIterator<Item = T>) -> OwnedNodeRef<T> {
2182        let mut root = NodeRef::new_leaf();
2183        let mut mut_node = root.borrow_mut();
2184        let mut trace_root = None;
2185        for elt in iter {
2186            if let Some(new_root) =
2187                unsafe { mut_node.insert(mut_node.buflen() as _, elt) }
2188            {
2189                let _ = trace_root.insert(new_root);
2190            }
2191        }
2192        let mut root = trace_root
2193            .map(|r| r.forget_type())
2194            .unwrap_or_else(|| root.forget_type());
2195        root.borrow_mut().correct_treelen_invariant_subtree();
2196        root
2197    }
2198
2199    fn from_iter_rev<T, I: Iterator<Item = T> + DoubleEndedIterator>(
2200        iter: impl IntoIterator<IntoIter = I>,
2201    ) -> OwnedNodeRef<T> {
2202        let mut root = NodeRef::new_leaf();
2203        let mut mut_node = root.borrow_mut();
2204        let mut trace_root = None;
2205        for elt in iter.into_iter().rev() {
2206            if let Some(new_root) = unsafe { mut_node.insert(0, elt) } {
2207                let _ = trace_root.insert(new_root);
2208            }
2209        }
2210        let mut root = trace_root
2211            .map(|r| r.forget_type())
2212            .unwrap_or_else(|| root.forget_type());
2213        root.borrow_mut().correct_treelen_invariant_subtree();
2214        root
2215    }
2216
2217    fn test_adjoin(lens: &[usize]) {
2218        for &leftlen in lens {
2219            for &rightlen in lens {
2220                let left_iter = 0..=leftlen - 1;
2221                let mid_elt = leftlen;
2222                let right_iter = leftlen + 1..=leftlen + rightlen;
2223
2224                let left = from_iter(left_iter);
2225                let right = from_iter_rev(right_iter);
2226                let mut root = left.adjoin(mid_elt, right);
2227                debug::assert_invariants(root.borrow());
2228
2229                let actual: Vec<_> = root.borrow().iter().copied().collect();
2230                let expected: Vec<_> = (0..=leftlen + rightlen).collect();
2231                assert_eq!(actual, expected);
2232                root.drop_subtree()
2233            }
2234        }
2235    }
2236
2237    #[test]
2238    #[cfg(not(miri))]
2239    fn adjoin_many() {
2240        let lens: Vec<_> = (1..=300).collect();
2241        test_adjoin(&lens);
2242        test_adjoin(&[100_000]);
2243    }
2244
2245    #[test]
2246    fn adjoin_corner() {
2247        let lens = [
2248            1,
2249            B - 1,
2250            B,
2251            2 * B - 1,
2252            2 * B,
2253            (2 * B - 1) * B + (B - 1),
2254            (2 * B - 1) * (B + 1),
2255            (2 * B + 1) * B,
2256            (2 * B - 1) * (B * B + B + 1),
2257            B * (2 * B * B + B + 1),
2258        ];
2259        test_adjoin(&lens);
2260    }
2261
2262    fn test_split(lens: &[usize]) {
2263        for &len in lens {
2264            for i in 1..len {
2265                eprintln!("testing: {:?}", (i, len));
2266
2267                let tree = from_iter(0..len);
2268                let [left, right] =
2269                    unsafe { tree.split_off(i).map(|o| o.unwrap()) };
2270
2271                assert!(left.borrow().iter().copied().eq(0..i));
2272                assert!(right.borrow().iter().copied().eq(i..len));
2273
2274                debug::assert_invariants(left.borrow());
2275                debug::assert_invariants(right.borrow());
2276
2277                let [mut left, mut right] = [left, right];
2278                left.drop_subtree();
2279                right.drop_subtree();
2280            }
2281        }
2282    }
2283
2284    #[test]
2285    fn split_corner() {
2286        let lens = [
2287            1,
2288            B - 1,
2289            B,
2290            2 * B - 1,
2291            2 * B,
2292            (2 * B - 1) * B + (B - 1),
2293            (2 * B - 1) * (B + 1),
2294            (2 * B + 1) * B,
2295            (2 * B - 1) * (B * B + B + 1),
2296            B * (2 * B * B + B + 1),
2297        ];
2298        test_split(&lens);
2299    }
2300
2301    #[test]
2302    #[cfg(not(miri))]
2303    fn split_many() {
2304        let lens: Vec<_> = (1..=300).collect();
2305        test_split(&lens);
2306    }
2307
2308    fn test_iter(n: usize) {
2309        let tree = from_iter(0..n);
2310
2311        assert!(tree.borrow().iter().copied().eq(0..n));
2312        assert!(tree.borrow().iter().copied().rev().eq((0..n).rev()));
2313
2314        let mut tree = tree;
2315        tree.drop_subtree()
2316    }
2317
2318    #[test]
2319    fn iter_once() { test_iter(300); }
2320
2321    #[test]
2322    #[cfg(not(miri))]
2323    fn iter_many() {
2324        for n in 1..=5000 {
2325            test_iter(n);
2326        }
2327        test_iter(1_000_000);
2328    }
2329}
2330
2331#[cfg(test)]
2332mod tests_tree {
2333    use super::*;
2334
2335    #[test]
2336    fn sanity_check() {
2337        let a = BTreeSeq::<()>::default();
2338        assert!(a.is_empty());
2339        assert_eq!(a.len(), 0);
2340        assert!(a.iter().eq(None::<&()>));
2341        assert_eq!(a, a);
2342        assert_eq!(a, a.clone());
2343
2344        let mut a: BTreeSeq<_> = Some(0).into_iter().collect();
2345        assert!(!a.is_empty());
2346        assert_eq!(a.len(), 1);
2347        assert!(a.iter().eq(Some(&0)));
2348        assert_eq!(a, a);
2349        assert_eq!(a, a.clone());
2350        assert_eq!(a[0], 0);
2351        a[0] = 1;
2352        assert_eq!(a[0], 1);
2353
2354        a.push_front(0);
2355        a.extend(2..30);
2356        assert_eq!(a.len(), 30);
2357        assert_eq!(a.bisect(|&x| x < 20), (Some(&20), 20));
2358        assert!(a.range(10..15).copied().eq(10..15));
2359    }
2360}