@@ -119,85 +119,83 @@ struct BoxedNode<K, V> {
119
119
}
120
120
121
121
impl < K , V > BoxedNode < K , V > {
122
- fn from_leaf ( node : Box < LeafNode < K , V > > ) -> Self {
123
- BoxedNode { ptr : Box :: into_unique ( node) }
122
+ fn from_owned ( mut node : NonNull < LeafNode < K , V > > ) -> Self {
123
+ BoxedNode { ptr : unsafe { Unique :: new_unchecked ( node. as_mut ( ) ) } }
124
124
}
125
125
126
- fn from_internal ( node : Box < InternalNode < K , V > > ) -> Self {
127
- BoxedNode { ptr : Unique :: from ( & mut Box :: leak ( node) . data ) }
128
- }
129
-
130
- fn as_ptr ( & self ) -> NonNull < LeafNode < K , V > > {
126
+ fn as_nonnull ( & self ) -> NonNull < LeafNode < K , V > > {
131
127
NonNull :: from ( self . ptr )
132
128
}
133
129
}
134
130
135
131
/// An owned tree.
136
132
///
137
133
/// Note that this does not have a destructor, and must be cleaned up manually.
138
- pub struct Root < K , V > {
139
- node : BoxedNode < K , V > ,
140
- /// The number of levels below the root node.
141
- height : usize ,
142
- }
134
+ pub type Root < K , V > = NodeRef < marker:: Owned , K , V , marker:: LeafOrInternal > ;
143
135
144
136
unsafe impl < K : Sync , V : Sync > Sync for Root < K , V > { }
145
137
unsafe impl < K : Send , V : Send > Send for Root < K , V > { }
146
138
147
139
impl < K , V > Root < K , V > {
148
- /// Returns the number of levels below the root .
149
- pub fn height ( & self ) -> usize {
150
- self . height
140
+ /// Returns a new root node that is initially empty .
141
+ pub fn new_leaf ( ) -> Self {
142
+ Self :: from_leaf ( Box :: new ( unsafe { LeafNode :: new ( ) } ) )
151
143
}
152
144
153
- /// Returns a new owned tree, with its own root node that is initially empty.
154
- pub fn new_leaf ( ) -> Self {
155
- Root { node : BoxedNode :: from_leaf ( Box :: new ( unsafe { LeafNode :: new ( ) } ) ) , height : 0 }
145
+ fn from_leaf ( leaf : Box < LeafNode < K , V > > ) -> Self {
146
+ NodeRef { height : 0 , node : NonNull :: from ( Box :: leak ( leaf) ) , _marker : PhantomData }
147
+ }
148
+
149
+ fn from_internal ( internal : Box < InternalNode < K , V > > , height : usize ) -> Self {
150
+ NodeRef { height, node : NonNull :: from ( & mut Box :: leak ( internal) . data ) , _marker : PhantomData }
156
151
}
157
152
158
- /// Borrows and returns an immutable reference to the node owned by the root .
153
+ /// Reborrows the owned node as an immutable reference .
159
154
pub fn node_as_ref ( & self ) -> NodeRef < marker:: Immut < ' _ > , K , V , marker:: LeafOrInternal > {
160
- NodeRef { height : self . height , node : self . node . as_ptr ( ) , _marker : PhantomData }
155
+ NodeRef { height : self . height , node : self . node , _marker : PhantomData }
161
156
}
162
157
163
- /// Borrows and returns a mutable reference to the node owned by the root .
158
+ /// Reborrows the owned node as a mutable reference .
164
159
pub fn node_as_mut ( & mut self ) -> NodeRef < marker:: Mut < ' _ > , K , V , marker:: LeafOrInternal > {
165
- NodeRef { height : self . height , node : self . node . as_ptr ( ) , _marker : PhantomData }
160
+ NodeRef { height : self . height , node : self . node , _marker : PhantomData }
166
161
}
167
162
168
- /// Borrows and returns a mutable reference to the leaf node owned by the root .
163
+ /// Reborrows the owned leaf node as a mutable reference .
169
164
/// # Safety
170
- /// The root node is a leaf.
165
+ /// The owned node must be a leaf.
171
166
unsafe fn leaf_node_as_mut ( & mut self ) -> NodeRef < marker:: Mut < ' _ > , K , V , marker:: Leaf > {
172
167
debug_assert ! ( self . height == 0 ) ;
173
- NodeRef { height : self . height , node : self . node . as_ptr ( ) , _marker : PhantomData }
168
+ NodeRef { height : self . height , node : self . node , _marker : PhantomData }
174
169
}
175
170
176
- /// Borrows and returns a mutable reference to the internal node owned by the root .
171
+ /// Reborrows the owned internal node as a mutable reference .
177
172
/// # Safety
178
- /// The root node is not a leaf.
173
+ /// The owned node must not be a leaf.
179
174
unsafe fn internal_node_as_mut ( & mut self ) -> NodeRef < marker:: Mut < ' _ > , K , V , marker:: Internal > {
180
175
debug_assert ! ( self . height > 0 ) ;
181
- NodeRef { height : self . height , node : self . node . as_ptr ( ) , _marker : PhantomData }
176
+ NodeRef { height : self . height , node : self . node , _marker : PhantomData }
182
177
}
183
178
179
+ /// Reborrows the owned internal node as a slightly mutable reference.
184
180
pub fn node_as_valmut ( & mut self ) -> NodeRef < marker:: ValMut < ' _ > , K , V , marker:: LeafOrInternal > {
185
- NodeRef { height : self . height , node : self . node . as_ptr ( ) , _marker : PhantomData }
181
+ NodeRef { height : self . height , node : self . node , _marker : PhantomData }
186
182
}
187
183
188
- pub fn into_ref ( self ) -> NodeRef < marker:: Owned , K , V , marker:: LeafOrInternal > {
189
- NodeRef { height : self . height , node : self . node . as_ptr ( ) , _marker : PhantomData }
184
+ /// Narrows the type-specific node reference to a type-agnostic pointer.
185
+ fn into_boxed_node ( self ) -> BoxedNode < K , V > {
186
+ BoxedNode :: from_owned ( self . node )
190
187
}
191
188
192
189
/// Adds a new internal node with a single edge pointing to the previous root node,
193
190
/// make that new node the root node, and return it. This increases the height by 1
194
191
/// and is the opposite of `pop_internal_level`.
195
192
pub fn push_internal_level ( & mut self ) -> NodeRef < marker:: Mut < ' _ > , K , V , marker:: Internal > {
196
193
let mut new_node = Box :: new ( unsafe { InternalNode :: new ( ) } ) ;
197
- new_node. edges [ 0 ] . write ( unsafe { ptr:: read ( & mut self . node ) } ) ;
198
-
199
- self . node = BoxedNode :: from_internal ( new_node) ;
200
- self . height += 1 ;
194
+ let new_height = self . height + 1 ;
195
+ super :: mem:: take_mut ( self , |root| {
196
+ new_node. edges [ 0 ] . write ( root. into_boxed_node ( ) ) ;
197
+ Root :: from_internal ( new_node, new_height)
198
+ } ) ;
201
199
202
200
unsafe {
203
201
let mut ret = self . internal_node_as_mut ( ) ;
@@ -218,15 +216,14 @@ impl<K, V> Root<K, V> {
218
216
pub fn pop_internal_level ( & mut self ) {
219
217
assert ! ( self . height > 0 ) ;
220
218
221
- let top = self . node . ptr ;
219
+ let top = self . node ;
222
220
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 ( ) } ;
225
- self . height -= 1 ;
221
+ let internal_node = NodeRef { height : self . height , node : self . node , _marker : PhantomData } ;
222
+ * self = internal_node. first_edge ( ) . descend ( ) ;
226
223
self . node_as_mut ( ) . as_leaf_mut ( ) . parent = None ;
227
224
228
225
unsafe {
229
- Global . dealloc ( NonNull :: from ( top) . cast ( ) , Layout :: new :: < InternalNode < K , V > > ( ) ) ;
226
+ Global . dealloc ( top. cast ( ) , Layout :: new :: < InternalNode < K , V > > ( ) ) ;
230
227
}
231
228
}
232
229
}
@@ -368,6 +365,10 @@ impl<BorrowType, K, V> NodeRef<BorrowType, K, V, marker::Internal> {
368
365
}
369
366
370
367
impl < BorrowType , K , V , Type > NodeRef < BorrowType , K , V , Type > {
368
+ fn from_boxed_node ( edge : BoxedNode < K , V > , height : usize ) -> Self {
369
+ NodeRef { height, node : edge. as_nonnull ( ) , _marker : PhantomData }
370
+ }
371
+
371
372
/// Finds the parent of the current node. Returns `Ok(handle)` if the current
372
373
/// node actually has a parent, where `handle` points to the edge of the parent
373
374
/// that points to the current node. Returns `Err(self)` if the current node has
@@ -650,7 +651,7 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
650
651
unsafe {
651
652
ptr:: write ( self . key_mut_at ( idx) , key) ;
652
653
ptr:: write ( self . val_mut_at ( idx) , val) ;
653
- self . as_internal_mut ( ) . edges . get_unchecked_mut ( idx + 1 ) . write ( edge. node ) ;
654
+ self . as_internal_mut ( ) . edges . get_unchecked_mut ( idx + 1 ) . write ( edge. into_boxed_node ( ) ) ;
654
655
Handle :: new_edge ( self . reborrow_mut ( ) , idx + 1 ) . correct_parent_link ( ) ;
655
656
}
656
657
}
@@ -664,7 +665,7 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
664
665
unsafe {
665
666
slice_insert ( self . keys_mut ( ) , 0 , key) ;
666
667
slice_insert ( self . vals_mut ( ) , 0 , val) ;
667
- slice_insert ( self . edges_mut ( ) , 0 , edge. node ) ;
668
+ slice_insert ( self . edges_mut ( ) , 0 , edge. into_boxed_node ( ) ) ;
668
669
}
669
670
670
671
self . as_leaf_mut ( ) . len += 1 ;
@@ -688,10 +689,10 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
688
689
let edge = match self . reborrow_mut ( ) . force ( ) {
689
690
ForceResult :: Leaf ( _) => None ,
690
691
ForceResult :: Internal ( internal) => {
691
- let edge = ptr:: read ( internal. edge_at ( idx + 1 ) ) ;
692
- let mut new_root = Root { node : edge , height : internal. height - 1 } ;
693
- new_root . node_as_mut ( ) . as_leaf_mut ( ) . parent = None ;
694
- Some ( new_root )
692
+ let boxed_node = ptr:: read ( internal. edge_at ( idx + 1 ) ) ;
693
+ let mut edge = Root :: from_boxed_node ( boxed_node , internal. height - 1 ) ;
694
+ edge . node_as_mut ( ) . as_leaf_mut ( ) . parent = None ;
695
+ Some ( edge )
695
696
}
696
697
} ;
697
698
@@ -714,13 +715,13 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
714
715
let edge = match self . reborrow_mut ( ) . force ( ) {
715
716
ForceResult :: Leaf ( _) => None ,
716
717
ForceResult :: Internal ( mut internal) => {
717
- let edge = slice_remove ( internal. edges_mut ( ) , 0 ) ;
718
- let mut new_root = Root { node : edge , height : internal. height - 1 } ;
719
- new_root . node_as_mut ( ) . as_leaf_mut ( ) . parent = None ;
718
+ let boxed_node = slice_remove ( internal. edges_mut ( ) , 0 ) ;
719
+ let mut edge = Root :: from_boxed_node ( boxed_node , internal. height - 1 ) ;
720
+ edge . node_as_mut ( ) . as_leaf_mut ( ) . parent = None ;
720
721
721
722
internal. correct_childrens_parent_links ( 0 ..old_len) ;
722
723
723
- Some ( new_root )
724
+ Some ( edge )
724
725
}
725
726
} ;
726
727
@@ -984,7 +985,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
984
985
unsafe {
985
986
slice_insert ( self . node . keys_mut ( ) , self . idx , key) ;
986
987
slice_insert ( self . node . vals_mut ( ) , self . idx , val) ;
987
- slice_insert ( self . node . edges_mut ( ) , self . idx + 1 , edge. node ) ;
988
+ slice_insert ( self . node . edges_mut ( ) , self . idx + 1 , edge. into_boxed_node ( ) ) ;
988
989
self . node . as_leaf_mut ( ) . len += 1 ;
989
990
990
991
self . node . correct_childrens_parent_links ( ( self . idx + 1 ) ..=self . node . len ( ) ) ;
@@ -1074,11 +1075,10 @@ impl<BorrowType, K, V> Handle<NodeRef<BorrowType, K, V, marker::Internal>, marke
1074
1075
// reference (Rust issue #73987) and invalidate any other references
1075
1076
// to or inside the array, should any be around.
1076
1077
let internal_node = self . node . as_internal_ptr ( ) ;
1077
- NodeRef {
1078
- height : self . node . height - 1 ,
1079
- node : unsafe { ( & * ( * internal_node) . edges . get_unchecked ( self . idx ) . as_ptr ( ) ) . as_ptr ( ) } ,
1080
- _marker : PhantomData ,
1081
- }
1078
+ NodeRef :: from_boxed_node (
1079
+ unsafe { ( * internal_node) . edges . get_unchecked ( self . idx ) . assume_init_read ( ) } ,
1080
+ self . node . height - 1 ,
1081
+ )
1082
1082
}
1083
1083
}
1084
1084
@@ -1163,7 +1163,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, mark
1163
1163
1164
1164
let ( k, v) = self . split_leaf_data ( & mut new_node) ;
1165
1165
1166
- let right = Root { node : BoxedNode :: from_leaf ( new_node) , height : 0 } ;
1166
+ let right = Root :: from_leaf ( new_node) ;
1167
1167
( self . node , k, v, right)
1168
1168
}
1169
1169
}
@@ -1215,7 +1215,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
1215
1215
let ( k, v) = self . split_leaf_data ( & mut new_node. data ) ;
1216
1216
1217
1217
let height = self . node . height ;
1218
- let mut right = Root { node : BoxedNode :: from_internal ( new_node) , height } ;
1218
+ let mut right = Root :: from_internal ( new_node, height) ;
1219
1219
1220
1220
right. internal_node_as_mut ( ) . correct_childrens_parent_links ( 0 ..=new_len) ;
1221
1221
0 commit comments