From 1f0f502be536ebc12a6f7966a6627339d9a6f35d Mon Sep 17 00:00:00 2001 From: Zixuan Chen Date: Wed, 10 Aug 2022 19:24:37 +0800 Subject: [PATCH] fix: fix insertion err did not inc level --- crates/rle/src/rle_tree/node/internal_impl.rs | 14 +++++++++++++- crates/rle/src/rle_tree/node/leaf_impl.rs | 9 ++++----- crates/rle/src/rle_tree/node/node_trait.rs | 14 +++++++++++++- crates/rle/src/rle_tree/test/range_rle_test.rs | 16 +++++++++++++++- 4 files changed, 45 insertions(+), 8 deletions(-) diff --git a/crates/rle/src/rle_tree/node/internal_impl.rs b/crates/rle/src/rle_tree/node/internal_impl.rs index 611c52f3..7613e6ca 100644 --- a/crates/rle/src/rle_tree/node/internal_impl.rs +++ b/crates/rle/src/rle_tree/node/internal_impl.rs @@ -34,6 +34,8 @@ impl<'a, T: Rle, A: RleTreeTrait> InternalNode<'a, T, A> { #[cfg(test)] pub(crate) fn check(&self) { + assert!(self.children.len() >= A::MIN_CHILDREN_NUM); + assert!(self.children.len() <= A::MAX_CHILDREN_NUM); for child in self.children.iter() { match child { Node::Internal(node) => node.check(), @@ -69,7 +71,17 @@ impl<'a, T: Rle, A: RleTreeTrait> InternalNode<'a, T, A> { Err(mut new) => { A::update_cache_internal(self); A::update_cache_internal(&mut new); - Err(new) + if self.parent.is_none() { + let mut left = BumpBox::new_in(InternalNode::new(self.bump, None), self.bump); + std::mem::swap(&mut *left, self); + left.parent = Some(NonNull::new(self).unwrap()); + self.children.push(left.into()); + self.children.push(new.into()); + A::update_cache_internal(self); + Ok(()) + } else { + Err(new) + } } } } diff --git a/crates/rle/src/rle_tree/node/leaf_impl.rs b/crates/rle/src/rle_tree/node/leaf_impl.rs index 6baf4306..ab3c0a13 100644 --- a/crates/rle/src/rle_tree/node/leaf_impl.rs +++ b/crates/rle/src/rle_tree/node/leaf_impl.rs @@ -57,7 +57,10 @@ impl<'a, T: Rle, A: RleTreeTrait> LeafNode<'a, T, A> { } #[cfg(test)] - pub(crate) fn check(&self) {} + pub(crate) fn check(&self) { + assert!(self.children.len() >= A::MIN_CHILDREN_NUM); + assert!(self.children.len() <= A::MAX_CHILDREN_NUM); + } fn _delete_start(&mut self, from: A::Int) -> (usize, Option) { let (index_from, relative_from, pos_from) = A::find_pos_leaf(self, from); @@ -167,7 +170,6 @@ impl<'a, T: Rle, A: RleTreeTrait> NodeTrait<'a, T, A> for LeafNode<'a, T, A> from: Option, to: Option, ) -> Result<(), BumpBox<'a, Self>> { - dbg!(&from, &to); let (del_start, del_relative_from) = from.map_or((0, None), |x| self._delete_start(x)); let (del_end, del_relative_to) = to.map_or((self.children.len(), None), |x| self._delete_end(x)); @@ -183,9 +185,6 @@ impl<'a, T: Rle, A: RleTreeTrait> NodeTrait<'a, T, A> for LeafNode<'a, T, A> end.slice(del_relative_to, end.len()), ); - dbg!(del_relative_from, del_relative_to); - dbg!(&left); - dbg!(&right); *end = left; result = self._insert_with_split(del_end + 1, right); handled = true; diff --git a/crates/rle/src/rle_tree/node/node_trait.rs b/crates/rle/src/rle_tree/node/node_trait.rs index 748548c2..4699af64 100644 --- a/crates/rle/src/rle_tree/node/node_trait.rs +++ b/crates/rle/src/rle_tree/node/node_trait.rs @@ -1,6 +1,6 @@ use crate::{rle_tree::tree_trait::RleTreeTrait, Rle}; -use super::{BumpBox, InternalNode, Node}; +use super::{BumpBox, InternalNode, LeafNode, Node}; pub(crate) trait NodeTrait<'a, T: Rle, A: RleTreeTrait> { type Child; @@ -14,3 +14,15 @@ pub(crate) trait NodeTrait<'a, T: Rle, A: RleTreeTrait> { new: Self::Child, ) -> Result<(), BumpBox<'a, Self>>; } + +impl<'a, T: Rle, A: RleTreeTrait> From>> for Node<'a, T, A> { + fn from(node: BumpBox<'a, InternalNode<'a, T, A>>) -> Self { + Node::Internal(node) + } +} + +impl<'a, T: Rle, A: RleTreeTrait> From>> for Node<'a, T, A> { + fn from(node: BumpBox<'a, LeafNode<'a, T, A>>) -> Self { + Node::Leaf(node) + } +} diff --git a/crates/rle/src/rle_tree/test/range_rle_test.rs b/crates/rle/src/rle_tree/test/range_rle_test.rs index 5863bf73..77751afc 100644 --- a/crates/rle/src/rle_tree/test/range_rle_test.rs +++ b/crates/rle/src/rle_tree/test/range_rle_test.rs @@ -124,7 +124,21 @@ fn delete() { } #[test] -fn delete_that_need_merge() {} +fn insert_50times() { + let mut t: RleTree, RangeTreeTrait> = RleTree::new(); + let tree = t.get_mut(); + for i in (0..100).step_by(2) { + assert_eq!(tree.len(), i / 2); + tree.insert(tree.len(), i..i + 1); + } + tree.debug_check(); +} + +#[test] +fn delete_that_need_merge_to_sibling() {} + +#[test] +fn delete_that_need_borrow_from_sibling() {} #[test] fn delete_that_causes_removing_a_level() {}