@@ -119,85 +119,83 @@ struct BoxedNode<K, V> {
119119}
120120
121121impl < 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 ( ) ) } }
124124 }
125125
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 > > {
131127 NonNull :: from ( self . ptr )
132128 }
133129}
134130
135131/// An owned tree.
136132///
137133/// 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 > ;
143135
144136unsafe impl < K : Sync , V : Sync > Sync for Root < K , V > { }
145137unsafe impl < K : Send , V : Send > Send for Root < K , V > { }
146138
147139impl < 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 ( ) } ) )
151143 }
152144
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 }
156151 }
157152
158- /// Borrows and returns an immutable reference to the node owned by the root .
153+ /// Reborrows the owned node as an immutable reference .
159154 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 }
161156 }
162157
163- /// Borrows and returns a mutable reference to the node owned by the root .
158+ /// Reborrows the owned node as a mutable reference .
164159 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 }
166161 }
167162
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 .
169164 /// # Safety
170- /// The root node is a leaf.
165+ /// The owned node must be a leaf.
171166 unsafe fn leaf_node_as_mut ( & mut self ) -> NodeRef < marker:: Mut < ' _ > , K , V , marker:: Leaf > {
172167 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 }
174169 }
175170
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 .
177172 /// # Safety
178- /// The root node is not a leaf.
173+ /// The owned node must not be a leaf.
179174 unsafe fn internal_node_as_mut ( & mut self ) -> NodeRef < marker:: Mut < ' _ > , K , V , marker:: Internal > {
180175 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 }
182177 }
183178
179+ /// Reborrows the owned internal node as a slightly mutable reference.
184180 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 }
186182 }
187183
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 )
190187 }
191188
192189 /// Adds a new internal node with a single edge pointing to the previous root node,
193190 /// make that new node the root node, and return it. This increases the height by 1
194191 /// and is the opposite of `pop_internal_level`.
195192 pub fn push_internal_level ( & mut self ) -> NodeRef < marker:: Mut < ' _ > , K , V , marker:: Internal > {
196193 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+ } ) ;
201199
202200 unsafe {
203201 let mut ret = self . internal_node_as_mut ( ) ;
@@ -218,15 +216,14 @@ impl<K, V> Root<K, V> {
218216 pub fn pop_internal_level ( & mut self ) {
219217 assert ! ( self . height > 0 ) ;
220218
221- let top = self . node . ptr ;
219+ let top = self . node ;
222220
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 ( ) ;
226223 self . node_as_mut ( ) . as_leaf_mut ( ) . parent = None ;
227224
228225 unsafe {
229- Global . dealloc ( NonNull :: from ( top) . cast ( ) , Layout :: new :: < InternalNode < K , V > > ( ) ) ;
226+ Global . dealloc ( top. cast ( ) , Layout :: new :: < InternalNode < K , V > > ( ) ) ;
230227 }
231228 }
232229}
@@ -368,6 +365,10 @@ impl<BorrowType, K, V> NodeRef<BorrowType, K, V, marker::Internal> {
368365}
369366
370367impl < 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+
371372 /// Finds the parent of the current node. Returns `Ok(handle)` if the current
372373 /// node actually has a parent, where `handle` points to the edge of the parent
373374 /// 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> {
650651 unsafe {
651652 ptr:: write ( self . key_mut_at ( idx) , key) ;
652653 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 ( ) ) ;
654655 Handle :: new_edge ( self . reborrow_mut ( ) , idx + 1 ) . correct_parent_link ( ) ;
655656 }
656657 }
@@ -664,7 +665,7 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
664665 unsafe {
665666 slice_insert ( self . keys_mut ( ) , 0 , key) ;
666667 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 ( ) ) ;
668669 }
669670
670671 self . as_leaf_mut ( ) . len += 1 ;
@@ -688,10 +689,10 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
688689 let edge = match self . reborrow_mut ( ) . force ( ) {
689690 ForceResult :: Leaf ( _) => None ,
690691 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 )
695696 }
696697 } ;
697698
@@ -714,13 +715,13 @@ impl<'a, K: 'a, V: 'a> NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal> {
714715 let edge = match self . reborrow_mut ( ) . force ( ) {
715716 ForceResult :: Leaf ( _) => None ,
716717 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 ;
720721
721722 internal. correct_childrens_parent_links ( 0 ..old_len) ;
722723
723- Some ( new_root )
724+ Some ( edge )
724725 }
725726 } ;
726727
@@ -984,7 +985,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
984985 unsafe {
985986 slice_insert ( self . node . keys_mut ( ) , self . idx , key) ;
986987 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 ( ) ) ;
988989 self . node . as_leaf_mut ( ) . len += 1 ;
989990
990991 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
10741075 // reference (Rust issue #73987) and invalidate any other references
10751076 // to or inside the array, should any be around.
10761077 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+ )
10821082 }
10831083}
10841084
@@ -1163,7 +1163,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, mark
11631163
11641164 let ( k, v) = self . split_leaf_data ( & mut new_node) ;
11651165
1166- let right = Root { node : BoxedNode :: from_leaf ( new_node) , height : 0 } ;
1166+ let right = Root :: from_leaf ( new_node) ;
11671167 ( self . node , k, v, right)
11681168 }
11691169 }
@@ -1215,7 +1215,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
12151215 let ( k, v) = self . split_leaf_data ( & mut new_node. data ) ;
12161216
12171217 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) ;
12191219
12201220 right. internal_node_as_mut ( ) . correct_childrens_parent_links ( 0 ..=new_len) ;
12211221
0 commit comments