@@ -127,10 +127,6 @@ impl<K, V> BoxedNode<K, V> {
127
127
BoxedNode { ptr : Unique :: from ( & mut Box :: leak ( node) . data ) }
128
128
}
129
129
130
- unsafe fn from_ptr ( ptr : NonNull < LeafNode < K , V > > ) -> Self {
131
- BoxedNode { ptr : unsafe { Unique :: new_unchecked ( ptr. as_ptr ( ) ) } }
132
- }
133
-
134
130
fn as_ptr ( & self ) -> NonNull < LeafNode < K , V > > {
135
131
NonNull :: from ( self . ptr )
136
132
}
@@ -198,7 +194,7 @@ impl<K, V> Root<K, V> {
198
194
/// and is the opposite of `pop_internal_level`.
199
195
pub fn push_internal_level ( & mut self ) -> NodeRef < marker:: Mut < ' _ > , K , V , marker:: Internal > {
200
196
let mut new_node = Box :: new ( unsafe { InternalNode :: new ( ) } ) ;
201
- new_node. edges [ 0 ] . write ( unsafe { BoxedNode :: from_ptr ( self . node . as_ptr ( ) ) } ) ;
197
+ new_node. edges [ 0 ] . write ( unsafe { ptr :: read ( & mut self . node ) } ) ;
202
198
203
199
self . node = BoxedNode :: from_internal ( new_node) ;
204
200
self . height += 1 ;
@@ -224,8 +220,8 @@ impl<K, V> Root<K, V> {
224
220
225
221
let top = self . node . ptr ;
226
222
227
- let internal_node = unsafe { self . internal_node_as_mut ( ) } ;
228
- self . node = unsafe { BoxedNode :: from_ptr ( internal_node. first_edge ( ) . descend ( ) . node ) } ;
223
+ let mut internal_node = unsafe { self . internal_node_as_mut ( ) } ;
224
+ self . node = unsafe { internal_node. as_internal_mut ( ) . edges [ 0 ] . assume_init_read ( ) } ;
229
225
self . height -= 1 ;
230
226
self . node_as_mut ( ) . as_leaf_mut ( ) . parent = None ;
231
227
@@ -615,7 +611,7 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::Leaf> {
615
611
616
612
/// Adds a key/value pair to the beginning of the node.
617
613
fn push_front ( & mut self , key : K , val : V ) {
618
- debug_assert ! ( self . len( ) < CAPACITY ) ;
614
+ assert ! ( self . len( ) < CAPACITY ) ;
619
615
620
616
unsafe {
621
617
slice_insert ( self . keys_mut ( ) , 0 , key) ;
@@ -668,14 +664,7 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
668
664
unsafe {
669
665
slice_insert ( self . keys_mut ( ) , 0 , key) ;
670
666
slice_insert ( self . vals_mut ( ) , 0 , val) ;
671
- slice_insert (
672
- slice:: from_raw_parts_mut (
673
- MaybeUninit :: slice_as_mut_ptr ( & mut self . as_internal_mut ( ) . edges ) ,
674
- self . len ( ) + 1 ,
675
- ) ,
676
- 0 ,
677
- edge. node ,
678
- ) ;
667
+ slice_insert ( self . edges_mut ( ) , 0 , edge. node ) ;
679
668
}
680
669
681
670
self . as_leaf_mut ( ) . len += 1 ;
@@ -925,33 +914,22 @@ fn splitpoint(edge_idx: usize) -> (usize, InsertionPlace) {
925
914
}
926
915
}
927
916
928
- impl < ' a , K : ' a , V : ' a , NodeType > Handle < NodeRef < marker:: Mut < ' a > , K , V , NodeType > , marker:: Edge > {
929
- /// Helps implementations of `insert_fit` for a particular `NodeType`,
930
- /// by taking care of leaf data.
917
+ impl < ' a , K : ' a , V : ' a > Handle < NodeRef < marker:: Mut < ' a > , K , V , marker:: Leaf > , marker:: Edge > {
931
918
/// Inserts a new key/value pair between the key/value pairs to the right and left of
932
919
/// this edge. This method assumes that there is enough space in the node for the new
933
920
/// pair to fit.
934
- fn leafy_insert_fit ( & mut self , key : K , val : V ) {
921
+ ///
922
+ /// The returned pointer points to the inserted value.
923
+ fn insert_fit ( & mut self , key : K , val : V ) -> * mut V {
935
924
debug_assert ! ( self . node. len( ) < CAPACITY ) ;
936
925
937
926
unsafe {
938
927
slice_insert ( self . node . keys_mut ( ) , self . idx , key) ;
939
928
slice_insert ( self . node . vals_mut ( ) , self . idx , val) ;
940
-
941
929
self . node . as_leaf_mut ( ) . len += 1 ;
942
- }
943
- }
944
- }
945
930
946
- impl < ' a , K : ' a , V : ' a > Handle < NodeRef < marker:: Mut < ' a > , K , V , marker:: Leaf > , marker:: Edge > {
947
- /// Inserts a new key/value pair between the key/value pairs to the right and left of
948
- /// this edge. This method assumes that there is enough space in the node for the new
949
- /// pair to fit.
950
- ///
951
- /// The returned pointer points to the inserted value.
952
- fn insert_fit ( & mut self , key : K , val : V ) -> * mut V {
953
- self . leafy_insert_fit ( key, val) ;
954
- unsafe { self . node . val_mut_at ( self . idx ) }
931
+ self . node . val_mut_at ( self . idx )
932
+ }
955
933
}
956
934
}
957
935
@@ -1000,11 +978,14 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
1000
978
/// between this edge and the key/value pair to the right of this edge. This method assumes
1001
979
/// that there is enough space in the node for the new pair to fit.
1002
980
fn insert_fit ( & mut self , key : K , val : V , edge : Root < K , V > ) {
981
+ debug_assert ! ( self . node. len( ) < CAPACITY ) ;
1003
982
debug_assert ! ( edge. height == self . node. height - 1 ) ;
1004
983
1005
984
unsafe {
985
+ slice_insert ( self . node . keys_mut ( ) , self . idx , key) ;
986
+ slice_insert ( self . node . vals_mut ( ) , self . idx , val) ;
1006
987
slice_insert ( self . node . edges_mut ( ) , self . idx + 1 , edge. node ) ;
1007
- self . leafy_insert_fit ( key , val ) ;
988
+ self . node . as_leaf_mut ( ) . len += 1 ;
1008
989
1009
990
self . node . correct_childrens_parent_links ( ( self . idx + 1 ) ..=self . node . len ( ) ) ;
1010
991
}
@@ -1135,15 +1116,21 @@ impl<'a, K: 'a, V: 'a, NodeType> Handle<NodeRef<marker::Mut<'a>, K, V, NodeType>
1135
1116
}
1136
1117
1137
1118
impl < ' a , K : ' a , V : ' a , NodeType > Handle < NodeRef < marker:: Mut < ' a > , K , V , NodeType > , marker:: KV > {
1119
+ /// Helps implementations of `split` for a particular `NodeType`,
1120
+ /// by calculating the length of the new node.
1121
+ fn split_new_node_len ( & self ) -> usize {
1122
+ debug_assert ! ( self . idx < self . node. len( ) ) ;
1123
+ self . node . len ( ) - self . idx - 1
1124
+ }
1125
+
1138
1126
/// Helps implementations of `split` for a particular `NodeType`,
1139
1127
/// by taking care of leaf data.
1140
- fn leafy_split ( & mut self , new_node : & mut LeafNode < K , V > ) -> ( K , V , usize ) {
1128
+ fn split_leaf_data ( & mut self , new_node : & mut LeafNode < K , V > ) -> ( K , V ) {
1129
+ let new_len = self . split_new_node_len ( ) ;
1141
1130
unsafe {
1142
1131
let k = ptr:: read ( self . node . key_at ( self . idx ) ) ;
1143
1132
let v = ptr:: read ( self . node . val_at ( self . idx ) ) ;
1144
1133
1145
- let new_len = self . node . len ( ) - self . idx - 1 ;
1146
-
1147
1134
ptr:: copy_nonoverlapping (
1148
1135
self . node . key_at ( self . idx + 1 ) ,
1149
1136
MaybeUninit :: slice_as_mut_ptr ( & mut new_node. keys ) ,
@@ -1157,15 +1144,15 @@ impl<'a, K: 'a, V: 'a, NodeType> Handle<NodeRef<marker::Mut<'a>, K, V, NodeType>
1157
1144
1158
1145
self . node . as_leaf_mut ( ) . len = self . idx as u16 ;
1159
1146
new_node. len = new_len as u16 ;
1160
- ( k, v, new_len )
1147
+ ( k, v)
1161
1148
}
1162
1149
}
1163
1150
}
1164
1151
1165
1152
impl < ' a , K : ' a , V : ' a > Handle < NodeRef < marker:: Mut < ' a > , K , V , marker:: Leaf > , marker:: KV > {
1166
1153
/// Splits the underlying node into three parts:
1167
1154
///
1168
- /// - The node is truncated to only contain the key/value pairs to the right of
1155
+ /// - The node is truncated to only contain the key/value pairs to the left of
1169
1156
/// this handle.
1170
1157
/// - The key and value pointed to by this handle are extracted.
1171
1158
/// - All the key/value pairs to the right of this handle are put into a newly
@@ -1174,9 +1161,10 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, mark
1174
1161
unsafe {
1175
1162
let mut new_node = Box :: new ( LeafNode :: new ( ) ) ;
1176
1163
1177
- let ( k, v, _ ) = self . leafy_split ( & mut new_node) ;
1164
+ let ( k, v) = self . split_leaf_data ( & mut new_node) ;
1178
1165
1179
- ( self . node , k, v, Root { node : BoxedNode :: from_leaf ( new_node) , height : 0 } )
1166
+ let right = Root { node : BoxedNode :: from_leaf ( new_node) , height : 0 } ;
1167
+ ( self . node , k, v, right)
1180
1168
}
1181
1169
}
1182
1170
@@ -1210,29 +1198,28 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
1210
1198
/// Splits the underlying node into three parts:
1211
1199
///
1212
1200
/// - The node is truncated to only contain the edges and key/value pairs to the
1213
- /// right of this handle.
1201
+ /// left of this handle.
1214
1202
/// - The key and value pointed to by this handle are extracted.
1215
1203
/// - All the edges and key/value pairs to the right of this handle are put into
1216
1204
/// a newly allocated node.
1217
1205
pub fn split ( mut self ) -> ( NodeRef < marker:: Mut < ' a > , K , V , marker:: Internal > , K , V , Root < K , V > ) {
1218
1206
unsafe {
1219
1207
let mut new_node = Box :: new ( InternalNode :: new ( ) ) ;
1220
-
1221
- let ( k, v, new_len) = self . leafy_split ( & mut new_node. data ) ;
1222
- let height = self . node . height ;
1223
- let old_node = & * self . node . as_internal_ptr ( ) ;
1224
-
1208
+ // Move edges out before reducing length:
1209
+ let new_len = self . split_new_node_len ( ) ;
1225
1210
ptr:: copy_nonoverlapping (
1226
- old_node . edges . as_ptr ( ) . add ( self . idx + 1 ) ,
1227
- new_node. edges . as_mut_ptr ( ) ,
1211
+ self . node . edge_at ( self . idx + 1 ) ,
1212
+ MaybeUninit :: slice_as_mut_ptr ( & mut new_node. edges ) ,
1228
1213
new_len + 1 ,
1229
1214
) ;
1215
+ let ( k, v) = self . split_leaf_data ( & mut new_node. data ) ;
1230
1216
1231
- let mut new_root = Root { node : BoxedNode :: from_internal ( new_node) , height } ;
1217
+ let height = self . node . height ;
1218
+ let mut right = Root { node : BoxedNode :: from_internal ( new_node) , height } ;
1232
1219
1233
- new_root . internal_node_as_mut ( ) . correct_childrens_parent_links ( 0 ..=new_len) ;
1220
+ right . internal_node_as_mut ( ) . correct_childrens_parent_links ( 0 ..=new_len) ;
1234
1221
1235
- ( self . node , k, v, new_root )
1222
+ ( self . node , k, v, right )
1236
1223
}
1237
1224
}
1238
1225
0 commit comments