@@ -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