@@ -170,6 +170,22 @@ impl<K, V> Root<K, V> {
170170 NodeRef { height : self . height , node : self . node . as_ptr ( ) , _marker : PhantomData }
171171 }
172172
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+
173189 pub fn node_as_valmut ( & mut self ) -> NodeRef < marker:: ValMut < ' _ > , K , V , marker:: LeafOrInternal > {
174190 NodeRef { height : self . height , node : self . node . as_ptr ( ) , _marker : PhantomData }
175191 }
@@ -188,14 +204,11 @@ impl<K, V> Root<K, V> {
188204 self . node = BoxedNode :: from_internal ( new_node) ;
189205 self . height += 1 ;
190206
191- let mut ret =
192- NodeRef { height : self . height , node : self . node . as_ptr ( ) , _marker : PhantomData } ;
193-
194207 unsafe {
208+ let mut ret = self . internal_node_as_mut ( ) ;
195209 ret. reborrow_mut ( ) . first_edge ( ) . correct_parent_link ( ) ;
210+ ret
196211 }
197-
198- ret
199212 }
200213
201214 /// Removes the internal root node, using its first child as the new root node.
@@ -212,11 +225,8 @@ impl<K, V> Root<K, V> {
212225
213226 let top = self . node . ptr ;
214227
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 ) } ;
220230 self . height -= 1 ;
221231 self . node_as_mut ( ) . as_leaf_mut ( ) . parent = None ;
222232
@@ -443,9 +453,9 @@ impl<K, V> NodeRef<marker::Owned, K, V, marker::LeafOrInternal> {
443453}
444454
445455impl < ' 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 ) ;
449459 NodeRef { height : self . height , node : self . node , _marker : PhantomData }
450460 }
451461
@@ -943,10 +953,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, mark
943953 Handle :: new_edge ( left. reborrow_mut ( ) , insert_idx)
944954 } ,
945955 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)
950957 } ,
951958 } ;
952959 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>,
10061013 Handle :: new_edge ( left. reborrow_mut ( ) , insert_idx)
10071014 } ,
10081015 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)
10131017 } ,
10141018 } ;
10151019 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>,
12051209
12061210 let mut new_root = Root { node : BoxedNode :: from_internal ( new_node) , height } ;
12071211
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) ;
12091213
12101214 ( self . node , k, v, new_root)
12111215 }
@@ -1258,8 +1262,8 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
12581262 if self . node . height > 1 {
12591263 // SAFETY: the height of the nodes being merged is one below the height
12601264 // 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 ( ) ;
12631267 ptr:: copy_nonoverlapping (
12641268 right_node. edge_at ( 0 ) ,
12651269 left_node. edges_mut ( ) . as_mut_ptr ( ) . add ( left_len + 1 ) ,
0 commit comments