1mod inner_node;
2mod slice_utils;
3use std::{borrow::Borrow, mem::ManuallyDrop};
4
5mod consts;
6
7pub use inner_node::*;
8mod leaf_node;
9pub use leaf_node::*;
10mod node_id;
11pub use node_id::*;
12mod cursor;
13pub use cursor::*;
14mod iterator;
15pub use iterator::*;
16mod node_stores;
17pub use node_stores::*;
18
19pub mod visit;
20
21mod bulk_load;
22pub use crate::argument::*;
23
24use self::entry_ref::{EntryRef, VisitStack};
25mod entry_ref;
26
27mod tree_remove;
28
29#[derive(Clone)]
87pub struct BPlusTree<S: NodeStore> {
88 root: NodeId,
89 root_argument: S::Argument,
90 len: usize,
91 node_store: ManuallyDrop<S>,
92 st: Statistic,
93}
94
95impl<S> BPlusTree<S>
96where
97 S: NodeStore,
98{
99 pub fn new(mut node_store: S) -> Self {
101 let (root_id, _) = node_store.new_empty_leaf();
102 Self {
103 root: NodeId::Leaf(root_id),
104 root_argument: S::Argument::default(),
105 node_store: ManuallyDrop::new(node_store),
106 len: 0,
107
108 st: Statistic::default(),
109 }
110 }
111
112 fn new_from_parts(mut node_store: S, root: NodeId, len: usize) -> Self {
114 let argument = if len > 0 {
115 Self::new_argument_for_id(&mut node_store, root)
116 } else {
117 S::Argument::default()
118 };
119
120 let me = Self {
121 root,
122 root_argument: argument,
123 node_store: ManuallyDrop::new(node_store),
124 len,
125
126 st: Statistic::default(),
127 };
128
129 #[cfg(test)]
130 me.validate();
131
132 me
133 }
134
135 pub fn node_store(&self) -> &S {
137 &self.node_store
138 }
139
140 pub fn len(&self) -> usize {
142 self.len
143 }
144
145 pub fn is_empty(&self) -> bool {
147 self.len() == 0
148 }
149
150 pub fn root_argument(&self) -> &S::Argument {
152 &self.root_argument
153 }
154
155 pub fn insert(&mut self, k: S::K, v: S::V) -> Option<S::V> {
157 let node_id = self.root;
158
159 let result = match self.descend_insert(node_id, k, v) {
160 DescendInsertResult::Inserted => {
161 self.root_argument = Self::new_argument_for_id(&self.node_store, node_id);
162 None
163 }
164 DescendInsertResult::Updated(prev_v) => Some(prev_v),
165 DescendInsertResult::Split(k, new_child_id) => {
166 let prev_root_argument = Self::new_argument_for_id(&self.node_store, node_id);
167 let new_argument = Self::new_argument_for_id(&self.node_store, new_child_id);
168
169 let new_root = InnerNode::<S::K, S::Argument>::new(
170 [k],
171 [node_id, new_child_id],
172 [prev_root_argument, new_argument],
173 );
174 let new_root_argument =
175 S::Argument::from_inner(new_root.keys(), new_root.arguments());
176
177 let new_root_id = self.node_store.add_inner(new_root);
178 self.root = new_root_id.into();
179 self.root_argument = new_root_argument;
180 None
181 }
182 };
183
184 if result.is_none() {
185 self.len += 1;
186 }
187
188 #[cfg(test)]
189 self.validate();
190
191 result
192 }
193
194 fn into_parts(self) -> (S, NodeId, usize) {
196 let mut me = ManuallyDrop::new(self);
197 (
198 unsafe { ManuallyDrop::take(&mut me.node_store) },
199 me.root,
200 me.len,
201 )
202 }
203
204 pub fn statistic(&self) -> &Statistic {
205 &self.st
206 }
207
208 fn descend_insert(
209 &mut self,
210 node_id: NodeId,
211 k: S::K,
212 v: S::V,
213 ) -> DescendInsertResult<S::K, S::V> {
214 match node_id {
215 NodeId::Inner(id) => self.insert_inner(id, k, v),
216 NodeId::Leaf(leaf_id) => self.insert_leaf(leaf_id, k, v),
217 }
218 }
219
220 fn insert_inner(
221 &mut self,
222 mut id: InnerNodeId,
223 k: S::K,
224 v: S::V,
225 ) -> DescendInsertResult<S::K, S::V> {
226 let mut stack = VisitStack::new();
227 let mut r = loop {
228 let node = self.node_store.get_inner(id);
229 let (child_idx, child_id) = node.locate_child(&k);
230 stack.push(id, child_idx, child_id);
231
232 match child_id {
233 NodeId::Inner(child_inner) => {
234 id = child_inner;
235 continue;
236 }
237 NodeId::Leaf(leaf_id) => break self.insert_leaf(leaf_id, k, v),
238 }
239 };
240
241 loop {
242 match stack.pop() {
244 Some((id, child_idx, child_id)) => match r {
245 DescendInsertResult::Split(key, right_child) => {
246 let right_child_argument =
247 Self::new_argument_for_id(&mut self.node_store, right_child);
248 let child_argument =
249 Self::new_argument_for_id(&mut self.node_store, child_id);
250
251 let inner_node = self.node_store.get_mut_inner(id);
252 inner_node.set_argument(child_idx, child_argument);
255
256 if !inner_node.is_full() {
257 let slot = child_idx;
258 inner_node.insert_at(slot, key, right_child, right_child_argument);
259 r = DescendInsertResult::Inserted;
260 } else {
261 let (prompt_k, new_node) =
262 inner_node.split(child_idx, key, right_child, right_child_argument);
263 let new_node_id = self.node_store.add_inner(new_node);
264 r = DescendInsertResult::Split(prompt_k, NodeId::Inner(new_node_id));
265 }
266 }
267 DescendInsertResult::Inserted => {
268 let child_argument =
269 Self::new_argument_for_id(&mut self.node_store, child_id);
270 let inner_node = self.node_store.get_mut_inner(id);
271 inner_node.set_argument(child_idx, child_argument);
272
273 continue;
274 }
275 DescendInsertResult::Updated(_) => {
276 continue;
278 }
279 },
280 None => return r,
281 }
282 }
283 }
284
285 fn new_argument_for_id(node_store: &S, id: NodeId) -> S::Argument {
286 match id {
287 NodeId::Inner(inner) => {
288 let inner = node_store.get_inner(inner);
289 S::Argument::from_inner(inner.keys(), inner.arguments())
290 }
291 NodeId::Leaf(leaf) => {
292 let leaf = node_store.get_leaf(leaf);
293 S::Argument::from_leaf(leaf.keys())
294 }
295 }
296 }
297
298 fn insert_leaf(&mut self, id: LeafNodeId, k: S::K, v: S::V) -> DescendInsertResult<S::K, S::V> {
299 let leaf_node = self.node_store.get_mut_leaf(id);
300 match leaf_node.try_upsert(k, v) {
301 LeafUpsertResult::Inserted => {
302 self.node_store.cache_leaf(id);
303 DescendInsertResult::Inserted
304 }
305 LeafUpsertResult::Updated(v) => DescendInsertResult::Updated(v),
306 LeafUpsertResult::IsFull(idx, k, v) => {
307 let right_id = self.node_store.reserve_leaf();
308
309 let l_leaf = self.node_store.get_mut_leaf(id);
310 let r_leaf = l_leaf.split_new_leaf(idx, (k, v), right_id, id);
311 let slot_key: S::K = r_leaf.data_at(0).0.clone();
312
313 if let Some(next) = r_leaf.next() {
315 self.node_store.get_mut_leaf(next).set_prev(Some(right_id));
316 }
317 self.node_store.assign_leaf(right_id, r_leaf);
318
319 let updated_id = if idx >= S::leaf_n() as usize / 2 {
320 right_id
321 } else {
322 id
323 };
324 self.node_store.cache_leaf(updated_id);
325 DescendInsertResult::Split(slot_key, NodeId::Leaf(right_id))
326 }
327 }
328 }
329
330 pub fn get<Q: ?Sized + Ord>(&self, k: &Q) -> Option<&S::V>
332 where
333 S::K: Borrow<Q>,
334 {
335 if let Some(leaf_id) = self.node_store.try_cache(k) {
336 return self.find_in_leaf(leaf_id, k);
338 }
339
340 self.find_descend(self.root, k)
341 }
342
343 pub fn get_mut<Q: ?Sized + Ord>(&mut self, k: &Q) -> Option<&mut S::V>
345 where
346 S::K: Borrow<Q>,
347 {
348 let mut cache_leaf_id: Option<LeafNodeId> = None;
349 if let Some(leaf_id) = self.node_store.try_cache(k) {
350 cache_leaf_id = Some(leaf_id);
352 }
353
354 if let Some(leaf_id) = cache_leaf_id {
355 return self.find_in_leaf_mut(leaf_id, k);
356 }
357
358 self.find_descend_mut(self.root, k)
359 }
360
361 pub fn first(&self) -> Option<(&S::K, &S::V)> {
363 if self.is_empty() {
364 return None;
365 }
366
367 let mut node_id = self.root;
368 loop {
369 match node_id {
370 NodeId::Inner(inner_id) => {
371 let inner_node = self.node_store.get_inner(inner_id);
372 node_id = inner_node.child_id(0);
373 continue;
374 }
375 NodeId::Leaf(leaf_id) => {
376 let leaf_node = self.node_store.get_leaf(leaf_id);
377 return Some(leaf_node.data_at(0));
378 }
379 }
380 }
381 }
382
383 pub fn last(&self) -> Option<(&S::K, &S::V)> {
385 if self.is_empty() {
386 return None;
387 }
388
389 let mut node_id = self.root;
390 loop {
391 match node_id {
392 NodeId::Inner(inner_id) => {
393 let inner_node = self.node_store.get_inner(inner_id);
394 node_id = inner_node.child_id(inner_node.len());
395 continue;
396 }
397 NodeId::Leaf(leaf_id) => {
398 let leaf_node = self.node_store.get_leaf(leaf_id);
399 return Some(leaf_node.data_at(leaf_node.len() - 1));
400 }
401 }
402 }
403 }
404
405 fn find_descend<Q: ?Sized + Ord>(&self, mut node_id: NodeId, k: &Q) -> Option<&S::V>
406 where
407 S::K: Borrow<Q>,
408 {
409 loop {
410 match node_id {
411 NodeId::Inner(inner_id) => {
412 let inner_node = self.node_store.get_inner(inner_id);
413 let (_, child_id) = inner_node.locate_child(k);
414 node_id = child_id;
415 continue;
416 }
417 NodeId::Leaf(leaf_id) => return self.find_in_leaf_and_cache_it(leaf_id, k),
418 }
419 }
420 }
421
422 fn find_in_leaf<Q: ?Sized + Ord>(&self, leaf_id: LeafNodeId, k: &Q) -> Option<&S::V>
423 where
424 S::K: Borrow<Q>,
425 {
426 let leaf_node = self.node_store.get_leaf(leaf_id);
427 let (_, kv) = leaf_node.locate_slot_with_value(k);
428 kv
429 }
430
431 fn find_descend_mut<Q: ?Sized + Ord>(&mut self, node_id: NodeId, k: &Q) -> Option<&mut S::V>
432 where
433 S::K: Borrow<Q>,
434 {
435 match node_id {
436 NodeId::Inner(inner_id) => {
437 let inner_node = self.node_store.get_inner(inner_id);
438 let (_, child_id) = inner_node.locate_child(k);
439 self.find_descend_mut(child_id, k)
440 }
441 NodeId::Leaf(leaf_id) => self.find_in_leaf_mut_and_cache_it(leaf_id, k),
442 }
443 }
444
445 fn find_in_leaf_mut<Q: ?Sized + Ord>(&mut self, leaf_id: LeafNodeId, k: &Q) -> Option<&mut S::V>
446 where
447 S::K: Borrow<Q>,
448 {
449 let leaf_node = self.node_store.get_mut_leaf(leaf_id);
450 let (_, v) = leaf_node.locate_slot_mut(k);
451 v
452 }
453
454 fn find_in_leaf_mut_and_cache_it<Q: ?Sized + Ord>(
455 &mut self,
456 leaf_id: LeafNodeId,
457 k: &Q,
458 ) -> Option<&mut S::V>
459 where
460 S::K: Borrow<Q>,
461 {
462 self.node_store.cache_leaf(leaf_id);
463 let leaf_node = self.node_store.get_mut_leaf(leaf_id);
464 let (_, kv) = leaf_node.locate_slot_mut(k);
465 kv
466 }
467
468 fn find_in_leaf_and_cache_it<Q: ?Sized + Ord>(
471 &self,
472 leaf_id: LeafNodeId,
473 k: &Q,
474 ) -> Option<&S::V>
475 where
476 S::K: Borrow<Q>,
477 {
478 self.node_store.cache_leaf(leaf_id);
479 let leaf = self.node_store.get_leaf(leaf_id);
480 let (_, v) = leaf.locate_slot_with_value(k);
481 v
482 }
483
484 pub fn remove<Q: ?Sized>(&mut self, k: &Q) -> Option<S::V>
486 where
487 Q: Ord,
488 S::K: Borrow<Q>,
489 {
490 self.remove_impl(k).map(|kv| kv.1)
491 }
492
493 fn key_to_ref<'a, Q: ?Sized>(&'a self, k: &Q) -> Option<EntryRef<&Self>>
494 where
495 Q: Ord,
496 S::K: Borrow<Q>,
497 {
498 let mut inner_stack = VisitStack::new();
499 let mut node_id = self.root;
500 loop {
501 match node_id {
502 NodeId::Inner(inner_id) => {
503 let inner_node = self.node_store.get_inner(inner_id);
504 let (child_offset, child_id) = inner_node.locate_child(k);
505 inner_stack.push(inner_id, child_offset, child_id);
506
507 node_id = child_id;
508 }
509 NodeId::Leaf(leaf_id) => {
510 let leaf = self.node_store.get_leaf(leaf_id);
511
512 match leaf.locate_slot(k) {
513 Ok(idx) => return Some(EntryRef::new(self, inner_stack, leaf_id, idx)),
514 Err(_) => return None,
515 };
516 }
517 }
518 }
519 }
520
521 pub(crate) fn first_leaf(&self) -> Option<LeafNodeId> {
523 match self.root {
524 NodeId::Inner(inner_id) => {
525 let mut result = None;
526
527 self.descend_visit_inner(inner_id, |inner_node| {
528 let first_child_id = inner_node.child_id(0);
529 match first_child_id {
530 NodeId::Inner(inner_id) => Some(inner_id),
531 NodeId::Leaf(leaf_id) => {
532 result = Some(leaf_id);
533 None
534 }
535 }
536 });
537
538 result
539 }
540 NodeId::Leaf(leaf_id) => Some(leaf_id),
541 }
542 }
543
544 pub(crate) fn last_leaf(&self) -> Option<LeafNodeId> {
546 match self.root {
547 NodeId::Inner(inner_id) => {
548 let mut result = None;
549
550 self.descend_visit_inner(inner_id, |inner_node| {
551 let child_id = inner_node.child_id(inner_node.len());
552 match child_id {
553 NodeId::Inner(inner_id) => Some(inner_id),
554 NodeId::Leaf(leaf_id) => {
555 result = Some(leaf_id);
556 None
557 }
558 }
559 });
560
561 result
562 }
563 NodeId::Leaf(leaf_id) => Some(leaf_id),
564 }
565 }
566
567 pub(crate) fn locate_leaf(&self, k: &S::K) -> Option<LeafNodeId> {
571 if let Some(leaf_id) = self.node_store.try_cache(k) {
572 return Some(leaf_id);
573 }
574
575 let leaf_id = match self.root {
576 NodeId::Inner(inner_id) => {
577 let mut result = None;
578 self.descend_visit_inner(inner_id, |inner_node| {
579 let (_idx, node_id) = inner_node.locate_child(k);
580 match node_id {
581 NodeId::Inner(inner_node) => Some(inner_node),
582 NodeId::Leaf(leaf_id) => {
583 result = Some(leaf_id);
584 None
585 }
586 }
587 });
588 result
589 }
590 NodeId::Leaf(leaf_id) => Some(leaf_id),
591 }?;
592
593 Some(leaf_id)
594 }
595
596 fn descend_visit_inner(
597 &self,
598 mut node_id: InnerNodeId,
599 mut f: impl FnMut(&InnerNode<S::K, S::Argument>) -> Option<InnerNodeId>,
600 ) -> Option<()> {
601 loop {
602 let inner = self.node_store.get_inner(node_id);
603 match f(inner) {
604 None => {
605 return None;
606 }
607 Some(id_to_visit) => node_id = id_to_visit,
608 }
609 }
610 }
611
612 pub fn iter(&self) -> iterator::Iter<S> {
614 iterator::Iter::new(self)
615 }
616
617 pub fn into_iter(self) -> iterator::IntoIter<S> {
619 iterator::IntoIter::new(self)
620 }
621
622 pub fn cursor_first(&self) -> Option<Cursor<S::K>> {
624 Cursor::first(self).map(|c| c.0)
625 }
626
627 pub fn get_cursor(&self, k: &S::K) -> Option<(Cursor<S::K>, Option<&S::V>)> {
629 let node_id = self.root;
630 let leaf_id = match node_id {
631 NodeId::Inner(inner_id) => {
632 let mut result = None;
633 self.descend_visit_inner(inner_id, |inner_node| {
634 let (_idx, node_id) = inner_node.locate_child(k);
635 match node_id {
636 NodeId::Inner(inner_node) => Some(inner_node),
637 NodeId::Leaf(leaf_id) => {
638 result = Some(leaf_id);
639 None
640 }
641 }
642 });
643 result
644 }
645 NodeId::Leaf(leaf_id) => Some(leaf_id),
646 }?;
647
648 let leaf = self.node_store.get_leaf(leaf_id);
649 let (idx, v) = leaf.locate_slot_with_value(k);
650 Some((Cursor::new(k.clone(), leaf_id, idx), v))
651 }
652
653 pub fn clear(&mut self) {
655 std::mem::drop(std::mem::replace(self, Self::new(S::default())));
657 }
658
659 fn get_ref_by_argument<Q>(&self, mut query: Q) -> Option<EntryRef<&Self>>
661 where
662 S::Argument: SearchArgument<S::K, Query = Q>,
663 {
664 let mut node_id = self.root;
665 let mut stack = VisitStack::new();
666
667 loop {
668 match node_id {
669 NodeId::Inner(inner_id) => {
670 let inner = self.node_store.get_inner(inner_id);
671 let (offset, new_query) = <S::Argument as SearchArgument<_>>::locate_in_inner(
672 query,
673 inner.keys(),
674 inner.arguments(),
675 )?;
676 node_id = inner.child_id(offset);
677
678 stack.push(inner_id, offset, node_id);
679 query = new_query;
680 }
681 NodeId::Leaf(leaf_id) => {
682 let leaf = self.node_store.get_leaf(leaf_id);
683 let slot =
684 <S::Argument as SearchArgument<_>>::locate_in_leaf(query, leaf.keys())?;
685
686 return Some(EntryRef::new(self, stack, leaf_id, slot));
687 }
688 }
689 }
690 }
691
692 pub fn get_by_argument<Q>(&self, query: Q) -> Option<(&S::K, &S::V)>
694 where
695 S::Argument: SearchArgument<S::K, Query = Q>,
696 {
697 let entry_ref = self.get_ref_by_argument(query)?;
698 Self::get_by_ref(entry_ref)
699 }
700
701 pub fn get_mut_by_argument<Q>(&mut self, query: Q) -> Option<&mut S::V>
703 where
704 S::Argument: SearchArgument<S::K, Query = Q>,
705 {
706 let entry_ref = self.get_ref_by_argument(query)?;
707 Some(Self::get_mut_by_ref(entry_ref.to_detached().to_ref(self)))
708 }
709
710 pub fn rank_by_argument<R>(&self, k: &S::K) -> Result<R, R>
712 where
713 S::Argument: RankArgument<S::K, Rank = R>,
714 {
715 let mut node_id = self.root;
716 let mut rank = <S::Argument as RankArgument<S::K>>::initial_value();
717
718 loop {
719 match node_id {
720 NodeId::Inner(inner_id) => {
721 let inner = self.node_store.get_inner(inner_id);
722 let (child_idx, child_id) = inner.locate_child(k);
723 node_id = child_id;
724 let arguments = &inner.arguments()[0..child_idx];
725 rank = <S::Argument as RankArgument<S::K>>::fold_inner(k, rank, arguments);
726 }
727 NodeId::Leaf(leaf_id) => {
728 let leaf = self.node_store.get_leaf(leaf_id);
729 let slot = leaf.locate_slot(k);
730 return <S::Argument as RankArgument<_>>::fold_leaf(k, rank, slot, leaf.keys());
731 }
732 }
733 }
734 }
735
736 pub fn remove_by_argument<Q>(&mut self, query: Q) -> Option<(S::K, S::V)>
738 where
739 S::Argument: SearchArgument<S::K, Query = Q>,
740 {
741 let entry_ref = self.get_ref_by_argument(query)?;
742 Self::remove_by_ref(entry_ref.to_detached().to_ref(self))
743 }
744
745 fn get_by_ref(entry_ref: EntryRef<&Self>) -> Option<(&S::K, &S::V)> {
747 let leaf = entry_ref.tree.node_store.get_leaf(entry_ref.leaf_id);
748 let slot = entry_ref.offset;
749 Some(leaf.data_at(slot))
750 }
751
752 fn get_mut_by_ref(entry_ref: EntryRef<&mut Self>) -> &mut S::V {
754 let EntryRef {
755 tree,
756 leaf_id,
757 offset,
758 ..
759 } = entry_ref;
760
761 let leaf = tree.node_store.get_mut_leaf(leaf_id);
762 let slot = offset;
763 leaf.value_at_mut(slot)
764 }
765
766 #[cfg(test)]
767 fn validate(&self) {
768 let Some(mut leaf_id) = self.first_leaf() else { return; };
769 let mut last_leaf_id: Option<LeafNodeId> = None;
770
771 loop {
773 let leaf = self.node_store.get_leaf(leaf_id);
774
775 let p = leaf.prev();
776 let n = leaf.next();
777
778 if let Some(last_leaf_id) = last_leaf_id {
779 assert_eq!(last_leaf_id, p.unwrap());
780 }
781
782 if n.is_none() {
783 break;
784 }
785
786 last_leaf_id = Some(leaf_id);
787 leaf_id = n.unwrap();
788 }
789 }
790}
791
792impl<S: NodeStore> Drop for BPlusTree<S> {
793 fn drop(&mut self) {
794 unsafe { drop(std::ptr::read(self).into_iter()) }
795 }
796}
797
798#[derive(Default, Debug, Clone)]
800pub struct Statistic {
801 pub rotate_right_inner: u64,
802 pub rotate_left_inner: u64,
803
804 pub merge_with_left_inner: u64,
805 pub merge_with_right_inner: u64,
806
807 pub rotate_right_leaf: u64,
808 pub rotate_left_leaf: u64,
809
810 pub merge_with_left_leaf: u64,
811 pub merge_with_right_leaf: u64,
812}
813
814enum DescendInsertResult<K, V> {
815 Updated(V),
817 Inserted,
819 Split(K, NodeId),
821}
822
823pub trait NodeStore: Default {
826 type K: Key;
828 type V;
830
831 type Argument: Argument<Self::K>;
833
834 fn inner_n() -> u16;
836 fn leaf_n() -> u16;
838
839 #[cfg(test)]
841 fn new_empty_inner(&mut self) -> InnerNodeId;
842
843 fn add_inner(&mut self, node: Box<InnerNode<Self::K, Self::Argument>>) -> InnerNodeId;
845
846 fn get_inner(&self, id: InnerNodeId) -> &InnerNode<Self::K, Self::Argument>;
850
851 fn try_get_inner(&self, id: InnerNodeId) -> Option<&InnerNode<Self::K, Self::Argument>>;
854
855 fn get_mut_inner(&mut self, id: InnerNodeId) -> &mut InnerNode<Self::K, Self::Argument>;
857
858 unsafe fn get_mut_inner_ptr(
861 &mut self,
862 id: InnerNodeId,
863 ) -> *mut InnerNode<Self::K, Self::Argument>;
864
865 fn take_inner(&mut self, id: InnerNodeId) -> Box<InnerNode<Self::K, Self::Argument>>;
867
868 fn put_back_inner(&mut self, id: InnerNodeId, node: Box<InnerNode<Self::K, Self::Argument>>);
870
871 fn new_empty_leaf(&mut self) -> (LeafNodeId, &mut LeafNode<Self::K, Self::V>);
873
874 fn reserve_leaf(&mut self) -> LeafNodeId;
876
877 fn get_leaf(&self, id: LeafNodeId) -> &LeafNode<Self::K, Self::V>;
880
881 fn try_get_leaf(&self, id: LeafNodeId) -> Option<&LeafNode<Self::K, Self::V>>;
884
885 fn get_mut_leaf(&mut self, id: LeafNodeId) -> &mut LeafNode<Self::K, Self::V>;
888
889 fn take_leaf(&mut self, id: LeafNodeId) -> Box<LeafNode<Self::K, Self::V>>;
891
892 fn assign_leaf(&mut self, id: LeafNodeId, leaf: Box<LeafNode<Self::K, Self::V>>);
894
895 fn cache_leaf(&self, leaf_id: LeafNodeId);
897
898 fn try_cache<Q: ?Sized>(&self, k: &Q) -> Option<LeafNodeId>
900 where
901 Q: Ord,
902 Self::K: Borrow<Q>;
903
904 #[cfg(test)]
905 fn debug(&self)
906 where
907 Self::K: std::fmt::Debug,
908 Self::V: std::fmt::Debug + Clone,
909 Self::Argument: std::fmt::Debug;
910}
911
912pub trait Key: Clone + Ord {}
915
916impl<T> Key for T where T: Clone + Ord {}
917
918fn _ensure_send<V: Send>() {
920 fn _assert_send<T: Send>() {}
921 _assert_send::<BPlusTree<NodeStoreVec<u64, V>>>();
922}
923
924#[cfg(test)]
925mod tests {
926 use std::rc::Rc;
927
928 use rand::seq::SliceRandom;
929
930 use crate::argument::count::Count;
931
932 use super::*;
933
934 #[test]
935 fn test_round_trip_one() {
936 round_trip_one();
937 }
938
939 fn round_trip_one() {
940 let node_store = NodeStoreVec::<i64, i64, Count>::new();
941 let mut tree = BPlusTree::new(node_store);
942
943 let size: i64 = 100000;
944
945 let mut keys = (0..size).collect::<Vec<_>>();
946 keys.shuffle(&mut rand::thread_rng());
947
948 for i in keys {
949 tree.insert(i, i % 13);
950 assert_eq!(tree.root_argument.count(), tree.len());
951 }
952
953 let mut keys = (0..size).collect::<Vec<_>>();
954 keys.shuffle(&mut rand::thread_rng());
955 for i in keys {
956 assert_eq!(*tree.get(&i).unwrap(), i % 13);
957 }
958
959 let mut keys = (0..size).collect::<Vec<_>>();
960 keys.shuffle(&mut rand::thread_rng());
961
962 for i in keys {
963 let k = i;
964 println!("\ndeleting {i}");
965
966 let delete_result = tree.remove(&k);
967 assert!(delete_result.is_some());
968 assert_eq!(tree.root_argument.count(), tree.len());
969 }
970
971 assert!(tree.is_empty());
972
973 tree.clear();
975 }
976
977 #[test]
978 fn test_tree_clear() {
979 let (mut tree, keys) = create_test_tree::<100>();
980 tree.clear();
981 assert!(tree.is_empty());
982
983 for k in keys.clone() {
985 tree.insert(k, k % 13);
986 }
987 assert_eq!(tree.len(), keys.len());
988 }
989
990 #[test]
991 fn test_first_leaf() {
992 let node_store = NodeStoreVec::<i64, i64>::new();
993 let mut tree = BPlusTree::new(node_store);
994 let size: i64 = 500;
995 let keys = (0..size).collect::<Vec<_>>();
996 for i in keys {
997 tree.insert(i, i % 13);
998 }
999
1000 let first_leaf_id = tree.first_leaf().unwrap();
1001 let first_leaf = tree.node_store.get_leaf(first_leaf_id);
1002 assert_eq!(first_leaf.data_at(0).0.clone(), 0);
1003 }
1004
1005 #[test]
1006 fn test_get_mut() {
1007 let (mut tree, _) = create_test_tree::<30>();
1008 let v = tree.get_mut(&1).unwrap();
1009 *v = 100;
1010 assert_eq!(tree.get(&1).unwrap().clone(), 100);
1011 }
1012
1013 #[test]
1014 fn test_cursor() {
1015 let (mut tree, _) = create_test_tree::<30>();
1016
1017 let (cursor, _kv) = tree.get_cursor(&10).unwrap();
1018 assert_eq!(cursor.key().clone(), 10);
1019 assert_eq!(cursor.value(&tree).unwrap().clone(), 10);
1020
1021 {
1022 let prev = cursor.prev(&tree).unwrap();
1023 assert_eq!(prev.key().clone(), 9);
1024
1025 let next = cursor.next(&tree).unwrap();
1026 assert_eq!(next.key().clone(), 11);
1027 }
1028
1029 tree.remove(&10);
1030
1031 {
1032 assert_eq!(cursor.key().clone(), 10);
1033 assert!(cursor.value(&tree).is_none());
1034
1035 let prev = cursor.prev(&tree).unwrap();
1036 assert_eq!(prev.key().clone(), 9);
1037
1038 let next = cursor.next(&tree).unwrap();
1039 assert_eq!(next.key().clone(), 11);
1040 }
1041
1042 let (cursor, kv) = tree.get_cursor(&10).unwrap();
1043 assert_eq!(cursor.key().clone(), 10);
1044 assert!(kv.is_none());
1045 }
1046
1047 pub fn create_test_tree<const N: usize>() -> (BPlusTree<NodeStoreVec<i64, i64>>, Vec<i64>) {
1048 let node_store = NodeStoreVec::<i64, i64>::new();
1049 let mut tree = BPlusTree::new(node_store);
1050
1051 let size: i64 = N as i64;
1052
1053 let mut keys = (0..size).collect::<Vec<_>>();
1054 keys.shuffle(&mut rand::thread_rng());
1055
1056 for i in keys.iter() {
1057 tree.insert(*i, i % 13);
1058 }
1059
1060 assert_eq!(tree.len(), N);
1061
1062 (tree, keys)
1063 }
1064
1065 struct TestKey {
1066 key: i32,
1067 counter: Rc<std::sync::atomic::AtomicU64>,
1068 panic_flag: Rc<std::sync::atomic::AtomicU64>,
1069 }
1070
1071 impl Ord for TestKey {
1072 fn cmp(&self, other: &Self) -> std::cmp::Ordering {
1073 self.key.cmp(&other.key)
1074 }
1075 }
1076
1077 impl PartialOrd for TestKey {
1078 fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
1079 self.key.partial_cmp(&other.key)
1080 }
1081 }
1082
1083 impl PartialEq for TestKey {
1084 fn eq(&self, other: &Self) -> bool {
1085 self.key == other.key
1086 }
1087 }
1088
1089 impl Eq for TestKey {}
1090
1091 impl Clone for TestKey {
1092 fn clone(&self) -> Self {
1093 self.counter
1094 .fetch_add(1, std::sync::atomic::Ordering::Relaxed);
1095 Self {
1096 key: self.key,
1097 panic_flag: self.panic_flag.clone(),
1098 counter: self.counter.clone(),
1099 }
1100 }
1101 }
1102
1103 impl TestKey {
1104 fn new(
1105 key: i32,
1106 counter: Rc<std::sync::atomic::AtomicU64>,
1107 panic_flag: Rc<std::sync::atomic::AtomicU64>,
1108 ) -> Self {
1109 counter.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
1110 Self {
1111 key,
1112 counter,
1113 panic_flag,
1114 }
1115 }
1116 }
1117
1118 impl Drop for TestKey {
1119 fn drop(&mut self) {
1120 self.panic_flag
1121 .fetch_sub(1, std::sync::atomic::Ordering::Relaxed);
1122 self.counter
1123 .fetch_sub(1, std::sync::atomic::Ordering::Relaxed);
1124 }
1125 }
1126
1127 #[derive(Clone)]
1128 struct TestValue {
1129 counter: Rc<std::sync::atomic::AtomicU64>,
1130 }
1131
1132 impl TestValue {
1133 fn new(counter: Rc<std::sync::atomic::AtomicU64>) -> Self {
1134 Self { counter }
1135 }
1136 }
1137
1138 impl Drop for TestValue {
1139 fn drop(&mut self) {
1140 self.counter
1141 .fetch_add(1, std::sync::atomic::Ordering::Relaxed);
1142 }
1143 }
1144
1145 #[test]
1146 fn test_drop() {
1147 let count: u64 = 16000;
1148 let node_store = NodeStoreVec::<TestKey, TestValue>::new();
1150 let mut tree = BPlusTree::new(node_store);
1151 let drop_counter = Rc::new(std::sync::atomic::AtomicU64::new(0));
1152 let key_counter = Rc::new(std::sync::atomic::AtomicU64::new(0));
1153 let panic_flag = Rc::new(std::sync::atomic::AtomicU64::new(0));
1154
1155 macro_rules! get {
1156 ($id: ident) => {
1157 $id.load(std::sync::atomic::Ordering::Relaxed)
1158 };
1159 }
1160
1161 for i in 0..count {
1162 tree.insert(
1163 TestKey::new(i as i32, key_counter.clone(), panic_flag.clone()),
1164 TestValue::new(drop_counter.clone()),
1165 );
1166 }
1167
1168 {
1169 let key_count_inserted = key_counter.load(std::sync::atomic::Ordering::Relaxed);
1170 let another_tree = tree.clone();
1171 let key_count_cloned = get!(key_counter);
1172 assert_eq!(key_count_cloned, key_count_inserted * 2);
1173 drop(another_tree);
1174
1175 let key_count_drop_clone = key_counter.load(std::sync::atomic::Ordering::Relaxed);
1176 assert_eq!(key_count_drop_clone, key_count_inserted);
1177 }
1178
1179 {
1180 let keys = tree.iter().map(|(k, _v)| k.clone()).collect::<Vec<_>>();
1181 for k in keys {
1182 panic_flag.store(1, std::sync::atomic::Ordering::Relaxed);
1183
1184 let prev = get!(key_counter);
1185 assert!(tree.remove(&k).is_some());
1186 let delta = prev - get!(key_counter);
1187 if delta > 3 {
1188 panic!();
1189 }
1190
1191 panic_flag.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
1193 }
1194 }
1195
1196 drop(tree);
1197
1198 assert_eq!(
1199 drop_counter.load(std::sync::atomic::Ordering::Relaxed),
1200 count * 2,
1201 );
1202 assert_eq!(key_counter.load(std::sync::atomic::Ordering::Relaxed), 0);
1203 }
1204}