Skip to content

Commit d199c5b

Browse files
committed
BTreeMap: expose new_internal function and sanitize from_new_internal
1 parent efdb859 commit d199c5b

File tree

2 files changed

+14
-13
lines changed

2 files changed

+14
-13
lines changed

library/alloc/src/collections/btree/node.rs

+12-9
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,17 @@ impl<K, V> NodeRef<marker::Owned, K, V, marker::Leaf> {
142142
}
143143

144144
impl<K, V> NodeRef<marker::Owned, K, V, marker::Internal> {
145+
fn new_internal(child: Root<K, V>) -> Self {
146+
let mut new_node = Box::new(unsafe { InternalNode::new() });
147+
new_node.edges[0].write(child.node);
148+
NodeRef::from_new_internal(new_node, child.height + 1)
149+
}
150+
145151
fn from_new_internal(internal: Box<InternalNode<K, V>>, height: usize) -> Self {
146-
NodeRef { height, node: NonNull::from(Box::leak(internal)).cast(), _marker: PhantomData }
152+
let node = NonNull::from(Box::leak(internal)).cast();
153+
let mut this = NodeRef { height, node, _marker: PhantomData };
154+
this.borrow_mut().correct_all_childrens_parent_links();
155+
this
147156
}
148157
}
149158

@@ -167,11 +176,7 @@ impl<K, V> NodeRef<marker::Owned, K, V, marker::LeafOrInternal> {
167176
/// make that new node the root node, and return it. This increases the height by 1
168177
/// and is the opposite of `pop_internal_level`.
169178
pub fn push_internal_level(&mut self) -> NodeRef<marker::Mut<'_>, K, V, marker::Internal> {
170-
let mut new_node = Box::new(unsafe { InternalNode::new() });
171-
new_node.edges[0].write(self.node);
172-
let mut new_root = NodeRef::from_new_internal(new_node, self.height + 1);
173-
new_root.borrow_mut().first_edge().correct_parent_link();
174-
*self = new_root.forget_type();
179+
super::mem::take_mut(self, |old_root| NodeRef::new_internal(old_root).forget_type());
175180

176181
// `self.borrow_mut()`, except that we just forgot we're internal now:
177182
NodeRef { height: self.height, node: self.node, _marker: PhantomData }
@@ -1193,9 +1198,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
11931198
);
11941199

11951200
let height = self.node.height;
1196-
let mut right = NodeRef::from_new_internal(new_node, height);
1197-
1198-
right.borrow_mut().correct_childrens_parent_links(0..new_len + 1);
1201+
let right = NodeRef::from_new_internal(new_node, height);
11991202

12001203
SplitResult { left: self.node, kv, right }
12011204
}

library/alloc/src/collections/btree/node/tests.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,8 @@ fn test_splitpoint() {
7979
#[test]
8080
fn test_partial_cmp_eq() {
8181
let mut root1 = NodeRef::new_leaf();
82-
let mut leaf1 = root1.borrow_mut();
83-
leaf1.push(1, ());
84-
let mut root1 = root1.forget_type();
85-
root1.push_internal_level();
82+
root1.borrow_mut().push(1, ());
83+
let mut root1 = NodeRef::new_internal(root1.forget_type()).forget_type();
8684
let root2 = Root::new();
8785
root1.reborrow().assert_back_pointers();
8886
root2.reborrow().assert_back_pointers();

0 commit comments

Comments
 (0)