mirror of
https://github.com/loro-dev/loro.git
synced 2025-02-11 14:53:12 +00:00
fix: simplify create level when apply update
This commit is contained in:
parent
506350a45a
commit
81b8f2c591
1 changed files with 24 additions and 7 deletions
|
@ -334,14 +334,31 @@ impl<'a, T: Rle, A: RleTreeTrait<T>> InternalNode<'a, T, A> {
|
||||||
};
|
};
|
||||||
|
|
||||||
if result.is_err() && self.is_root() {
|
if result.is_err() && self.is_root() {
|
||||||
let mut new = result.unwrap_err();
|
let new_vec = result.unwrap_err();
|
||||||
assert!(new.len() == 1);
|
{
|
||||||
let new = new.pop().unwrap();
|
// create level
|
||||||
let inner = new.as_internal_mut().unwrap();
|
let origin_root = self.bump.alloc(Node::Internal(InternalNode::new(
|
||||||
self._balance(inner);
|
self.bump,
|
||||||
|
Some(self.into()),
|
||||||
|
)));
|
||||||
|
let origin_root_internal = origin_root.as_internal_mut().unwrap();
|
||||||
|
std::mem::swap(&mut self.children, &mut origin_root_internal.children);
|
||||||
|
let ptr = origin_root_internal.into();
|
||||||
|
for child in origin_root_internal.children.iter_mut() {
|
||||||
|
child.set_parent(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
A::update_cache_internal(origin_root_internal);
|
||||||
|
self.children.push(origin_root);
|
||||||
|
}
|
||||||
|
|
||||||
|
let ptr = self.into();
|
||||||
|
for new_node in new_vec {
|
||||||
|
new_node.set_parent(ptr);
|
||||||
|
self.children.push(new_node);
|
||||||
|
}
|
||||||
|
|
||||||
A::update_cache_internal(self);
|
A::update_cache_internal(self);
|
||||||
A::update_cache_internal(inner);
|
|
||||||
self._create_level(new);
|
|
||||||
Ok(())
|
Ok(())
|
||||||
} else {
|
} else {
|
||||||
result
|
result
|
||||||
|
|
Loading…
Reference in a new issue