@@ -819,13 +819,13 @@ impl<BorrowType, K, V, NodeType> Handle<NodeRef<BorrowType, K, V, NodeType>, mar
819819    } 
820820} 
821821
822- impl < ' a ,  K ,  V >  Handle < NodeRef < marker:: Mut < ' a > ,  K ,  V ,  marker:: Leaf > ,  marker:: Edge >  { 
822+ impl < ' a ,  K ,  V ,  NodeType >  Handle < NodeRef < marker:: Mut < ' a > ,  K ,  V ,  NodeType > ,  marker:: Edge >  { 
823+     /// Helps implementations of `insert_fit` for a particular `NodeType`, 
824+ /// by taking care of leaf data. 
823825/// Inserts a new key/value pair between the key/value pairs to the right and left of 
824826/// this edge. This method assumes that there is enough space in the node for the new 
825827/// pair to fit. 
826- /// 
827- /// The returned pointer points to the inserted value. 
828- fn  insert_fit ( & mut  self ,  key :  K ,  val :  V )  -> * mut  V  { 
828+ fn  leafy_insert_fit ( & mut  self ,  key :  K ,  val :  V )  { 
829829        // Necessary for correctness, but in a private module 
830830        debug_assert ! ( self . node. len( )  < CAPACITY ) ; 
831831
@@ -834,11 +834,23 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::Edge
834834            slice_insert ( self . node . vals_mut ( ) ,  self . idx ,  val) ; 
835835
836836            ( * self . node . as_leaf_mut ( ) ) . len  += 1 ; 
837- 
838-             self . node . vals_mut ( ) . get_unchecked_mut ( self . idx ) 
839837        } 
840838    } 
839+ } 
841840
841+ impl < ' a ,  K ,  V >  Handle < NodeRef < marker:: Mut < ' a > ,  K ,  V ,  marker:: Leaf > ,  marker:: Edge >  { 
842+     /// Inserts a new key/value pair between the key/value pairs to the right and left of 
843+ /// this edge. This method assumes that there is enough space in the node for the new 
844+ /// pair to fit. 
845+ /// 
846+ /// The returned pointer points to the inserted value. 
847+ fn  insert_fit ( & mut  self ,  key :  K ,  val :  V )  -> * mut  V  { 
848+         self . leafy_insert_fit ( key,  val) ; 
849+         unsafe  {  self . node . vals_mut ( ) . get_unchecked_mut ( self . idx )  } 
850+     } 
851+ } 
852+ 
853+ impl < ' a ,  K ,  V >  Handle < NodeRef < marker:: Mut < ' a > ,  K ,  V ,  marker:: Leaf > ,  marker:: Edge >  { 
842854    /// Inserts a new key/value pair between the key/value pairs to the right and left of 
843855/// this edge. This method splits the node if there isn't enough room. 
844856/// 
@@ -880,14 +892,6 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::
880892        } 
881893    } 
882894
883-     /// Unsafely asserts to the compiler some static information about whether the underlying 
884- /// node of this handle is a `Leaf` or an `Internal`. 
885- unsafe  fn  cast_unchecked < NewType > ( 
886-         & mut  self , 
887-     )  -> Handle < NodeRef < marker:: Mut < ' _ > ,  K ,  V ,  NewType > ,  marker:: Edge >  { 
888-         unsafe  {  Handle :: new_edge ( self . node . cast_unchecked ( ) ,  self . idx )  } 
889-     } 
890- 
891895    /// Inserts a new key/value pair and an edge that will go to the right of that new pair 
892896/// between this edge and the key/value pair to the right of this edge. This method assumes 
893897/// that there is enough space in the node for the new pair to fit. 
@@ -897,8 +901,7 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::
897901        debug_assert ! ( edge. height == self . node. height - 1 ) ; 
898902
899903        unsafe  { 
900-             // This cast is a lie, but it allows us to reuse the key/value insertion logic. 
901-             self . cast_unchecked :: < marker:: Leaf > ( ) . insert_fit ( key,  val) ; 
904+             self . leafy_insert_fit ( key,  val) ; 
902905
903906            slice_insert ( 
904907                slice:: from_raw_parts_mut ( 
@@ -994,18 +997,11 @@ impl<'a, K, V, NodeType> Handle<NodeRef<marker::Mut<'a>, K, V, NodeType>, marker
994997    } 
995998} 
996999
997- impl < ' a ,  K ,  V >  Handle < NodeRef < marker:: Mut < ' a > ,  K ,  V ,  marker:: Leaf > ,  marker:: KV >  { 
998-     /// Splits the underlying node into three parts: 
999- /// 
1000- /// - The node is truncated to only contain the key/value pairs to the right of 
1001- ///   this handle. 
1002- /// - The key and value pointed to by this handle and extracted. 
1003- /// - All the key/value pairs to the right of this handle are put into a newly 
1004- ///   allocated node. 
1005- pub  fn  split ( mut  self )  -> ( NodeRef < marker:: Mut < ' a > ,  K ,  V ,  marker:: Leaf > ,  K ,  V ,  Root < K ,  V > )  { 
1000+ impl < ' a ,  K ,  V ,  NodeType >  Handle < NodeRef < marker:: Mut < ' a > ,  K ,  V ,  NodeType > ,  marker:: KV >  { 
1001+     /// Helps implementations of `split` for a particular `NodeType`, 
1002+ /// by taking care of leaf data. 
1003+ fn  leafy_split ( & mut  self ,  new_node :  & mut  LeafNode < K ,  V > )  -> ( K ,  V ,  usize )  { 
10061004        unsafe  { 
1007-             let  mut  new_node = Box :: new ( LeafNode :: new ( ) ) ; 
1008- 
10091005            let  k = ptr:: read ( self . node . keys ( ) . get_unchecked ( self . idx ) ) ; 
10101006            let  v = ptr:: read ( self . node . vals ( ) . get_unchecked ( self . idx ) ) ; 
10111007
@@ -1024,6 +1020,24 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::KV>
10241020
10251021            ( * self . node . as_leaf_mut ( ) ) . len  = self . idx  as  u16 ; 
10261022            new_node. len  = new_len as  u16 ; 
1023+             ( k,  v,  new_len) 
1024+         } 
1025+     } 
1026+ } 
1027+ 
1028+ impl < ' a ,  K ,  V >  Handle < NodeRef < marker:: Mut < ' a > ,  K ,  V ,  marker:: Leaf > ,  marker:: KV >  { 
1029+     /// Splits the underlying node into three parts: 
1030+ /// 
1031+ /// - The node is truncated to only contain the key/value pairs to the right of 
1032+ ///   this handle. 
1033+ /// - The key and value pointed to by this handle and extracted. 
1034+ /// - All the key/value pairs to the right of this handle are put into a newly 
1035+ ///   allocated node. 
1036+ pub  fn  split ( mut  self )  -> ( NodeRef < marker:: Mut < ' a > ,  K ,  V ,  marker:: Leaf > ,  K ,  V ,  Root < K ,  V > )  { 
1037+         unsafe  { 
1038+             let  mut  new_node = Box :: new ( LeafNode :: new ( ) ) ; 
1039+ 
1040+             let  ( k,  v,  _)  = self . leafy_split ( & mut  new_node) ; 
10271041
10281042            ( self . node ,  k,  v,  Root  {  node :  BoxedNode :: from_leaf ( new_node) ,  height :  0  } ) 
10291043        } 
@@ -1055,31 +1069,15 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::
10551069        unsafe  { 
10561070            let  mut  new_node = Box :: new ( InternalNode :: new ( ) ) ; 
10571071
1058-             let  k = ptr:: read ( self . node . keys ( ) . get_unchecked ( self . idx ) ) ; 
1059-             let  v = ptr:: read ( self . node . vals ( ) . get_unchecked ( self . idx ) ) ; 
1060- 
1072+             let  ( k,  v,  new_len)  = self . leafy_split ( & mut  new_node. data ) ; 
10611073            let  height = self . node . height ; 
1062-             let  new_len = self . node . len ( )  - self . idx  - 1 ; 
10631074
1064-             ptr:: copy_nonoverlapping ( 
1065-                 self . node . keys ( ) . as_ptr ( ) . add ( self . idx  + 1 ) , 
1066-                 new_node. data . keys . as_mut_ptr ( )  as  * mut  K , 
1067-                 new_len, 
1068-             ) ; 
1069-             ptr:: copy_nonoverlapping ( 
1070-                 self . node . vals ( ) . as_ptr ( ) . add ( self . idx  + 1 ) , 
1071-                 new_node. data . vals . as_mut_ptr ( )  as  * mut  V , 
1072-                 new_len, 
1073-             ) ; 
10741075            ptr:: copy_nonoverlapping ( 
10751076                self . node . as_internal ( ) . edges . as_ptr ( ) . add ( self . idx  + 1 ) , 
10761077                new_node. edges . as_mut_ptr ( ) , 
10771078                new_len + 1 , 
10781079            ) ; 
10791080
1080-             ( * self . node . as_leaf_mut ( ) ) . len  = self . idx  as  u16 ; 
1081-             new_node. data . len  = new_len as  u16 ; 
1082- 
10831081            let  mut  new_root = Root  {  node :  BoxedNode :: from_internal ( new_node) ,  height } ; 
10841082
10851083            for  i in  0 ..( new_len + 1 )  { 
0 commit comments