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 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 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 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 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 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 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 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 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 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 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 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 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 left.append(mid, right);
614 unsafe { left.promote() }
615 } else {
616 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 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 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 pub unsafe fn insert(
761 &mut self,
762 i: usize,
763 elt: T,
764 ) -> Option<NodeRef<marker::Owned, T, marker::Internal>> {
765 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 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 self.merge(left, false);
854 if parent.buflen() == 0 {
855 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 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 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 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 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 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 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 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 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 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 }
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 }
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 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 pub unsafe fn get_unchecked(&self, index: usize) -> &T {
1993 debug_assert!(self.root.is_some()); let root = self.root.as_ref().unwrap();
1995 unsafe { root.borrow().select_value(index).get() }
1996 }
1997 pub unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
2000 debug_assert!(self.root.is_some()); 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 }
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}