@@ -413,7 +413,7 @@ impl<K, V> NodeRef<marker::Owned, K, V, marker::LeafOrInternal> {
413
413
impl < ' a , K , V , Type > NodeRef < marker:: Mut < ' a > , K , V , Type > {
414
414
/// Unsafely asserts to the compiler some static information about whether this
415
415
/// node is a `Leaf` or an `Internal`.
416
- unsafe fn cast_unchecked < NewType > ( & mut self ) -> NodeRef < marker:: Mut < ' _ > , K , V , NewType > {
416
+ unsafe fn cast_unchecked < NewType > ( self ) -> NodeRef < marker:: Mut < ' a > , K , V , NewType > {
417
417
NodeRef { height : self . height , node : self . node , root : self . root , _marker : PhantomData }
418
418
}
419
419
@@ -721,7 +721,7 @@ impl<Node: Copy, Type> Clone for Handle<Node, Type> {
721
721
}
722
722
723
723
impl < Node , Type > Handle < Node , Type > {
724
- /// Retrieves the node that contains the edge of key/value pair this handle points to.
724
+ /// Retrieves the node that contains the edge or key/value pair this handle points to.
725
725
pub fn into_node ( self ) -> Node {
726
726
self . node
727
727
}
@@ -1082,7 +1082,7 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::KV>
1082
1082
}
1083
1083
1084
1084
/// Removes the key/value pair pointed to by this handle and returns it, along with the edge
1085
- /// between the now adjacent key/value pairs (if any) to the left and right of this handle .
1085
+ /// that the key/value pair collapsed into .
1086
1086
pub fn remove (
1087
1087
mut self ,
1088
1088
) -> ( ( K , V ) , Handle < NodeRef < marker:: Mut < ' a > , K , V , marker:: Leaf > , marker:: Edge > ) {
@@ -1140,18 +1140,17 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::
1140
1140
/// to by this handle, and the node immediately to the right of this handle into one new
1141
1141
/// child of the underlying node, returning an edge referencing that new child.
1142
1142
///
1143
- /// Assumes that this edge `.can_merge()`.
1143
+ /// Panics unless this edge `.can_merge()`.
1144
1144
pub fn merge (
1145
1145
mut self ,
1146
1146
) -> Handle < NodeRef < marker:: Mut < ' a > , K , V , marker:: Internal > , marker:: Edge > {
1147
1147
let self1 = unsafe { ptr:: read ( & self ) } ;
1148
1148
let self2 = unsafe { ptr:: read ( & self ) } ;
1149
1149
let mut left_node = self1. left_edge ( ) . descend ( ) ;
1150
1150
let left_len = left_node. len ( ) ;
1151
- let mut right_node = self2. right_edge ( ) . descend ( ) ;
1151
+ let right_node = self2. right_edge ( ) . descend ( ) ;
1152
1152
let right_len = right_node. len ( ) ;
1153
1153
1154
- // necessary for correctness, but in a private module
1155
1154
assert ! ( left_len + right_len < CAPACITY ) ;
1156
1155
1157
1156
unsafe {
@@ -1182,28 +1181,25 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::
1182
1181
1183
1182
( * left_node. as_leaf_mut ( ) ) . len += right_len as u16 + 1 ;
1184
1183
1185
- let layout = if self . node . height > 1 {
1184
+ if self . node . height > 1 {
1185
+ // SAFETY: the height of the nodes being merged is one below the height
1186
+ // of the node of this edge, thus above zero, so they are internal.
1187
+ let mut left_node = left_node. cast_unchecked ( ) ;
1188
+ let right_node = right_node. cast_unchecked ( ) ;
1186
1189
ptr:: copy_nonoverlapping (
1187
- right_node. cast_unchecked ( ) . as_internal ( ) . edges . as_ptr ( ) ,
1188
- left_node
1189
- . cast_unchecked ( )
1190
- . as_internal_mut ( )
1191
- . edges
1192
- . as_mut_ptr ( )
1193
- . add ( left_len + 1 ) ,
1190
+ right_node. reborrow ( ) . as_internal ( ) . edges . as_ptr ( ) ,
1191
+ left_node. reborrow_mut ( ) . as_internal_mut ( ) . edges . as_mut_ptr ( ) . add ( left_len + 1 ) ,
1194
1192
right_len + 1 ,
1195
1193
) ;
1196
1194
1197
1195
for i in left_len + 1 ..left_len + right_len + 2 {
1198
- Handle :: new_edge ( left_node. cast_unchecked ( ) . reborrow_mut ( ) , i)
1199
- . correct_parent_link ( ) ;
1196
+ Handle :: new_edge ( left_node. reborrow_mut ( ) , i) . correct_parent_link ( ) ;
1200
1197
}
1201
1198
1202
- Layout :: new :: < InternalNode < K , V > > ( )
1199
+ Global . dealloc ( right_node . node . cast ( ) , Layout :: new :: < InternalNode < K , V > > ( ) ) ;
1203
1200
} else {
1204
- Layout :: new :: < LeafNode < K , V > > ( )
1205
- } ;
1206
- Global . dealloc ( right_node. node . cast ( ) , layout) ;
1201
+ Global . dealloc ( right_node. node . cast ( ) , Layout :: new :: < LeafNode < K , V > > ( ) ) ;
1202
+ }
1207
1203
1208
1204
Handle :: new_edge ( self . node , self . idx )
1209
1205
}
0 commit comments