@@ -142,8 +142,17 @@ impl<K, V> NodeRef<marker::Owned, K, V, marker::Leaf> {
142142}
143143
144144impl < K , V > NodeRef < marker:: Owned , K , V , marker:: Internal > {
145+ fn new_internal ( child : Root < K , V > ) -> Self {
146+ let mut new_node = Box :: new ( unsafe { InternalNode :: new ( ) } ) ;
147+ new_node. edges [ 0 ] . write ( child. node ) ;
148+ NodeRef :: from_new_internal ( new_node, child. height + 1 )
149+ }
150+
145151 fn from_new_internal ( internal : Box < InternalNode < K , V > > , height : usize ) -> Self {
146- NodeRef { height, node : NonNull :: from ( Box :: leak ( internal) ) . cast ( ) , _marker : PhantomData }
152+ let node = NonNull :: from ( Box :: leak ( internal) ) . cast ( ) ;
153+ let mut this = NodeRef { height, node, _marker : PhantomData } ;
154+ this. borrow_mut ( ) . correct_all_childrens_parent_links ( ) ;
155+ this
147156 }
148157}
149158
@@ -167,11 +176,7 @@ impl<K, V> NodeRef<marker::Owned, K, V, marker::LeafOrInternal> {
167176 /// make that new node the root node, and return it. This increases the height by 1
168177 /// and is the opposite of `pop_internal_level`.
169178 pub fn push_internal_level ( & mut self ) -> NodeRef < marker:: Mut < ' _ > , K , V , marker:: Internal > {
170- let mut new_node = Box :: new ( unsafe { InternalNode :: new ( ) } ) ;
171- new_node. edges [ 0 ] . write ( self . node ) ;
172- let mut new_root = NodeRef :: from_new_internal ( new_node, self . height + 1 ) ;
173- new_root. borrow_mut ( ) . first_edge ( ) . correct_parent_link ( ) ;
174- * self = new_root. forget_type ( ) ;
179+ super :: mem:: take_mut ( self , |old_root| NodeRef :: new_internal ( old_root) . forget_type ( ) ) ;
175180
176181 // `self.borrow_mut()`, except that we just forgot we're internal now:
177182 NodeRef { height : self . height , node : self . node , _marker : PhantomData }
@@ -1193,9 +1198,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
11931198 ) ;
11941199
11951200 let height = self . node . height ;
1196- let mut right = NodeRef :: from_new_internal ( new_node, height) ;
1197-
1198- right. borrow_mut ( ) . correct_childrens_parent_links ( 0 ..new_len + 1 ) ;
1201+ let right = NodeRef :: from_new_internal ( new_node, height) ;
11991202
12001203 SplitResult { left : self . node , kv, right }
12011204 }
0 commit comments