From 81b8f2c591233521e703148766c6ee9b1e29e820 Mon Sep 17 00:00:00 2001 From: Zixuan Chen Date: Thu, 13 Oct 2022 16:55:36 +0800 Subject: [PATCH] fix: simplify create level when apply update --- crates/rle/src/rle_tree/node/internal_impl.rs | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/crates/rle/src/rle_tree/node/internal_impl.rs b/crates/rle/src/rle_tree/node/internal_impl.rs index 2f9b3acf..d1508318 100644 --- a/crates/rle/src/rle_tree/node/internal_impl.rs +++ b/crates/rle/src/rle_tree/node/internal_impl.rs @@ -334,14 +334,31 @@ impl<'a, T: Rle, A: RleTreeTrait> InternalNode<'a, T, A> { }; if result.is_err() && self.is_root() { - let mut new = result.unwrap_err(); - assert!(new.len() == 1); - let new = new.pop().unwrap(); - let inner = new.as_internal_mut().unwrap(); - self._balance(inner); + let new_vec = result.unwrap_err(); + { + // create level + let origin_root = self.bump.alloc(Node::Internal(InternalNode::new( + 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(inner); - self._create_level(new); Ok(()) } else { result