@@ -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
}
@@ -1131,7 +1131,7 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, marker::KV>
1131
1131
}
1132
1132
1133
1133
/// Removes the key/value pair pointed to by this handle and returns it, along with the edge
1134
- /// between the now adjacent key/value pairs (if any) to the left and right of this handle .
1134
+ /// that the key/value pair collapsed into .
1135
1135
pub fn remove (
1136
1136
mut self ,
1137
1137
) -> ( ( K , V ) , Handle < NodeRef < marker:: Mut < ' a > , K , V , marker:: Leaf > , marker:: Edge > ) {
@@ -1189,18 +1189,17 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::
1189
1189
/// to by this handle, and the node immediately to the right of this handle into one new
1190
1190
/// child of the underlying node, returning an edge referencing that new child.
1191
1191
///
1192
- /// Assumes that this edge `.can_merge()`.
1192
+ /// Panics unless this edge `.can_merge()`.
1193
1193
pub fn merge (
1194
1194
mut self ,
1195
1195
) -> Handle < NodeRef < marker:: Mut < ' a > , K , V , marker:: Internal > , marker:: Edge > {
1196
1196
let self1 = unsafe { ptr:: read ( & self ) } ;
1197
1197
let self2 = unsafe { ptr:: read ( & self ) } ;
1198
1198
let mut left_node = self1. left_edge ( ) . descend ( ) ;
1199
1199
let left_len = left_node. len ( ) ;
1200
- let mut right_node = self2. right_edge ( ) . descend ( ) ;
1200
+ let right_node = self2. right_edge ( ) . descend ( ) ;
1201
1201
let right_len = right_node. len ( ) ;
1202
1202
1203
- // necessary for correctness, but in a private module
1204
1203
assert ! ( left_len + right_len < CAPACITY ) ;
1205
1204
1206
1205
unsafe {
@@ -1231,28 +1230,25 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::
1231
1230
1232
1231
( * left_node. as_leaf_mut ( ) ) . len += right_len as u16 + 1 ;
1233
1232
1234
- let layout = if self . node . height > 1 {
1233
+ if self . node . height > 1 {
1234
+ // SAFETY: the height of the nodes being merged is one below the height
1235
+ // of the node of this edge, thus above zero, so they are internal.
1236
+ let mut left_node = left_node. cast_unchecked ( ) ;
1237
+ let right_node = right_node. cast_unchecked ( ) ;
1235
1238
ptr:: copy_nonoverlapping (
1236
- right_node. cast_unchecked ( ) . as_internal ( ) . edges . as_ptr ( ) ,
1237
- left_node
1238
- . cast_unchecked ( )
1239
- . as_internal_mut ( )
1240
- . edges
1241
- . as_mut_ptr ( )
1242
- . add ( left_len + 1 ) ,
1239
+ right_node. reborrow ( ) . as_internal ( ) . edges . as_ptr ( ) ,
1240
+ left_node. reborrow_mut ( ) . as_internal_mut ( ) . edges . as_mut_ptr ( ) . add ( left_len + 1 ) ,
1243
1241
right_len + 1 ,
1244
1242
) ;
1245
1243
1246
1244
for i in left_len + 1 ..left_len + right_len + 2 {
1247
- Handle :: new_edge ( left_node. cast_unchecked ( ) . reborrow_mut ( ) , i)
1248
- . correct_parent_link ( ) ;
1245
+ Handle :: new_edge ( left_node. reborrow_mut ( ) , i) . correct_parent_link ( ) ;
1249
1246
}
1250
1247
1251
- Layout :: new :: < InternalNode < K , V > > ( )
1248
+ Global . dealloc ( right_node . node . cast ( ) , Layout :: new :: < InternalNode < K , V > > ( ) ) ;
1252
1249
} else {
1253
- Layout :: new :: < LeafNode < K , V > > ( )
1254
- } ;
1255
- Global . dealloc ( right_node. node . cast ( ) , layout) ;
1250
+ Global . dealloc ( right_node. node . cast ( ) , Layout :: new :: < LeafNode < K , V > > ( ) ) ;
1251
+ }
1256
1252
1257
1253
Handle :: new_edge ( self . node , self . idx )
1258
1254
}
0 commit comments