mirror of
https://github.com/loro-dev/loro.git
synced 2025-02-02 11:06:14 +00:00
fix: fix insertion err
did not inc level
This commit is contained in:
parent
460baf4cbf
commit
1f0f502be5
4 changed files with 45 additions and 8 deletions
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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() {}
|
||||
|
|
Loading…
Reference in a new issue