@@ -170,6 +170,22 @@ impl<K, V> Root<K, V> {
170
170
NodeRef { height : self . height , node : self . node . as_ptr ( ) , _marker : PhantomData }
171
171
}
172
172
173
+ /// Borrows and returns a mutable reference to the leaf node owned by the root.
174
+ /// # Safety
175
+ /// The root node is a leaf.
176
+ unsafe fn leaf_node_as_mut ( & mut self ) -> NodeRef < marker:: Mut < ' _ > , K , V , marker:: Leaf > {
177
+ debug_assert ! ( self . height == 0 ) ;
178
+ NodeRef { height : self . height , node : self . node . as_ptr ( ) , _marker : PhantomData }
179
+ }
180
+
181
+ /// Borrows and returns a mutable reference to the internal node owned by the root.
182
+ /// # Safety
183
+ /// The root node is not a leaf.
184
+ unsafe fn internal_node_as_mut ( & mut self ) -> NodeRef < marker:: Mut < ' _ > , K , V , marker:: Internal > {
185
+ debug_assert ! ( self . height > 0 ) ;
186
+ NodeRef { height : self . height , node : self . node . as_ptr ( ) , _marker : PhantomData }
187
+ }
188
+
173
189
pub fn node_as_valmut ( & mut self ) -> NodeRef < marker:: ValMut < ' _ > , K , V , marker:: LeafOrInternal > {
174
190
NodeRef { height : self . height , node : self . node . as_ptr ( ) , _marker : PhantomData }
175
191
}
@@ -188,14 +204,11 @@ impl<K, V> Root<K, V> {
188
204
self . node = BoxedNode :: from_internal ( new_node) ;
189
205
self . height += 1 ;
190
206
191
- let mut ret =
192
- NodeRef { height : self . height , node : self . node . as_ptr ( ) , _marker : PhantomData } ;
193
-
194
207
unsafe {
208
+ let mut ret = self . internal_node_as_mut ( ) ;
195
209
ret. reborrow_mut ( ) . first_edge ( ) . correct_parent_link ( ) ;
210
+ ret
196
211
}
197
-
198
- ret
199
212
}
200
213
201
214
/// Removes the internal root node, using its first child as the new root node.
@@ -212,11 +225,8 @@ impl<K, V> Root<K, V> {
212
225
213
226
let top = self . node . ptr ;
214
227
215
- self . node = unsafe {
216
- BoxedNode :: from_ptr (
217
- self . node_as_mut ( ) . cast_unchecked :: < marker:: Internal > ( ) . first_edge ( ) . descend ( ) . node ,
218
- )
219
- } ;
228
+ let internal_node = unsafe { self . internal_node_as_mut ( ) } ;
229
+ self . node = unsafe { BoxedNode :: from_ptr ( internal_node. first_edge ( ) . descend ( ) . node ) } ;
220
230
self . height -= 1 ;
221
231
self . node_as_mut ( ) . as_leaf_mut ( ) . parent = None ;
222
232
@@ -443,9 +453,9 @@ impl<K, V> NodeRef<marker::Owned, K, V, marker::LeafOrInternal> {
443
453
}
444
454
445
455
impl < ' a , K , V , Type > NodeRef < marker:: Mut < ' a > , K , V , Type > {
446
- /// Unsafely asserts to the compiler some static information about whether this
447
- /// node is a `Leaf` or an ` Internal`.
448
- unsafe fn cast_unchecked < NewType > ( self ) -> NodeRef < marker :: Mut < ' a > , K , V , NewType > {
456
+ /// Unsafely asserts to the compiler the static information that this node is an `Internal`.
457
+ unsafe fn cast_to_internal_unchecked ( self ) -> NodeRef < marker :: Mut < ' a > , K , V , marker :: Internal > {
458
+ debug_assert ! ( self . height > 0 ) ;
449
459
NodeRef { height : self . height , node : self . node , _marker : PhantomData }
450
460
}
451
461
@@ -943,10 +953,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, mark
943
953
Handle :: new_edge ( left. reborrow_mut ( ) , insert_idx)
944
954
} ,
945
955
InsertionPlace :: Right ( insert_idx) => unsafe {
946
- Handle :: new_edge (
947
- right. node_as_mut ( ) . cast_unchecked :: < marker:: Leaf > ( ) ,
948
- insert_idx,
949
- )
956
+ Handle :: new_edge ( right. leaf_node_as_mut ( ) , insert_idx)
950
957
} ,
951
958
} ;
952
959
let val_ptr = insertion_edge. insert_fit ( key, val) ;
@@ -1006,10 +1013,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
1006
1013
Handle :: new_edge ( left. reborrow_mut ( ) , insert_idx)
1007
1014
} ,
1008
1015
InsertionPlace :: Right ( insert_idx) => unsafe {
1009
- Handle :: new_edge (
1010
- right. node_as_mut ( ) . cast_unchecked :: < marker:: Internal > ( ) ,
1011
- insert_idx,
1012
- )
1016
+ Handle :: new_edge ( right. internal_node_as_mut ( ) , insert_idx)
1013
1017
} ,
1014
1018
} ;
1015
1019
insertion_edge. insert_fit ( key, val, edge) ;
@@ -1205,7 +1209,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
1205
1209
1206
1210
let mut new_root = Root { node : BoxedNode :: from_internal ( new_node) , height } ;
1207
1211
1208
- new_root. node_as_mut ( ) . cast_unchecked ( ) . correct_childrens_parent_links ( 0 ..=new_len) ;
1212
+ new_root. internal_node_as_mut ( ) . correct_childrens_parent_links ( 0 ..=new_len) ;
1209
1213
1210
1214
( self . node , k, v, new_root)
1211
1215
}
@@ -1258,8 +1262,8 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
1258
1262
if self . node . height > 1 {
1259
1263
// SAFETY: the height of the nodes being merged is one below the height
1260
1264
// of the node of this edge, thus above zero, so they are internal.
1261
- let mut left_node = left_node. cast_unchecked :: < marker :: Internal > ( ) ;
1262
- let right_node = right_node. cast_unchecked :: < marker :: Internal > ( ) ;
1265
+ let mut left_node = left_node. cast_to_internal_unchecked ( ) ;
1266
+ let right_node = right_node. cast_to_internal_unchecked ( ) ;
1263
1267
ptr:: copy_nonoverlapping (
1264
1268
right_node. edge_at ( 0 ) ,
1265
1269
left_node. edges_mut ( ) . as_mut_ptr ( ) . add ( left_len + 1 ) ,
0 commit comments