fix: fix insertion err

did not inc level
This commit is contained in:
Zixuan Chen 2022-08-10 19:24:37 +08:00
parent 460baf4cbf
commit 1f0f502be5
4 changed files with 45 additions and 8 deletions

View file

@ -34,6 +34,8 @@ impl<'a, T: Rle, A: RleTreeTrait<T>> 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<T>> 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)
}
}
}
}

View file

@ -57,7 +57,10 @@ impl<'a, T: Rle, A: RleTreeTrait<T>> 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<usize>) {
let (index_from, relative_from, pos_from) = A::find_pos_leaf(self, from);
@ -167,7 +170,6 @@ impl<'a, T: Rle, A: RleTreeTrait<T>> NodeTrait<'a, T, A> for LeafNode<'a, T, A>
from: Option<A::Int>,
to: Option<A::Int>,
) -> 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<T>> 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;

View file

@ -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<T>> {
type Child;
@ -14,3 +14,15 @@ pub(crate) trait NodeTrait<'a, T: Rle, A: RleTreeTrait<T>> {
new: Self::Child,
) -> Result<(), BumpBox<'a, Self>>;
}
impl<'a, T: Rle, A: RleTreeTrait<T>> From<BumpBox<'a, InternalNode<'a, T, A>>> for Node<'a, T, A> {
fn from(node: BumpBox<'a, InternalNode<'a, T, A>>) -> Self {
Node::Internal(node)
}
}
impl<'a, T: Rle, A: RleTreeTrait<T>> From<BumpBox<'a, LeafNode<'a, T, A>>> for Node<'a, T, A> {
fn from(node: BumpBox<'a, LeafNode<'a, T, A>>) -> Self {
Node::Leaf(node)
}
}

View file

@ -124,7 +124,21 @@ fn delete() {
}
#[test]
fn delete_that_need_merge() {}
fn insert_50times() {
let mut t: RleTree<Range<usize>, 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() {}