@@ -142,8 +142,17 @@ impl<K, V> NodeRef<marker::Owned, K, V, marker::Leaf> {
142
142
}
143
143
144
144
impl < 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
+
145
151
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
147
156
}
148
157
}
149
158
@@ -167,11 +176,7 @@ impl<K, V> NodeRef<marker::Owned, K, V, marker::LeafOrInternal> {
167
176
/// make that new node the root node, and return it. This increases the height by 1
168
177
/// and is the opposite of `pop_internal_level`.
169
178
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 ( ) ) ;
175
180
176
181
// `self.borrow_mut()`, except that we just forgot we're internal now:
177
182
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>,
1193
1198
) ;
1194
1199
1195
1200
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) ;
1199
1202
1200
1203
SplitResult { left : self . node , kv, right }
1201
1204
}
0 commit comments