Skip to content

Commit 6a59621

Browse files
authored
Rollup merge of #77569 - ssomers:btree_cleanup_1, r=Mark-Simulacrum
BTreeMap: type-specific variants of node_as_mut and cast_unchecked Improves debug checking and shortens some expressions. Extracted from #77408
2 parents 16612a9 + 97beb07 commit 6a59621

File tree

1 file changed

+28
-24
lines changed
  • library/alloc/src/collections/btree

1 file changed

+28
-24
lines changed

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

+28-24
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,22 @@ impl<K, V> Root<K, V> {
170170
NodeRef { height: self.height, node: self.node.as_ptr(), _marker: PhantomData }
171171
}
172172

173+
/// Borrows and returns a mutable reference to the leaf node owned by the root.
174+
/// # Safety
175+
/// The root node is a leaf.
176+
unsafe fn leaf_node_as_mut(&mut self) -> NodeRef<marker::Mut<'_>, K, V, marker::Leaf> {
177+
debug_assert!(self.height == 0);
178+
NodeRef { height: self.height, node: self.node.as_ptr(), _marker: PhantomData }
179+
}
180+
181+
/// Borrows and returns a mutable reference to the internal node owned by the root.
182+
/// # Safety
183+
/// The root node is not a leaf.
184+
unsafe fn internal_node_as_mut(&mut self) -> NodeRef<marker::Mut<'_>, K, V, marker::Internal> {
185+
debug_assert!(self.height > 0);
186+
NodeRef { height: self.height, node: self.node.as_ptr(), _marker: PhantomData }
187+
}
188+
173189
pub fn node_as_valmut(&mut self) -> NodeRef<marker::ValMut<'_>, K, V, marker::LeafOrInternal> {
174190
NodeRef { height: self.height, node: self.node.as_ptr(), _marker: PhantomData }
175191
}
@@ -188,14 +204,11 @@ impl<K, V> Root<K, V> {
188204
self.node = BoxedNode::from_internal(new_node);
189205
self.height += 1;
190206

191-
let mut ret =
192-
NodeRef { height: self.height, node: self.node.as_ptr(), _marker: PhantomData };
193-
194207
unsafe {
208+
let mut ret = self.internal_node_as_mut();
195209
ret.reborrow_mut().first_edge().correct_parent_link();
210+
ret
196211
}
197-
198-
ret
199212
}
200213

201214
/// Removes the internal root node, using its first child as the new root node.
@@ -212,11 +225,8 @@ impl<K, V> Root<K, V> {
212225

213226
let top = self.node.ptr;
214227

215-
self.node = unsafe {
216-
BoxedNode::from_ptr(
217-
self.node_as_mut().cast_unchecked::<marker::Internal>().first_edge().descend().node,
218-
)
219-
};
228+
let internal_node = unsafe { self.internal_node_as_mut() };
229+
self.node = unsafe { BoxedNode::from_ptr(internal_node.first_edge().descend().node) };
220230
self.height -= 1;
221231
self.node_as_mut().as_leaf_mut().parent = None;
222232

@@ -443,9 +453,9 @@ impl<K, V> NodeRef<marker::Owned, K, V, marker::LeafOrInternal> {
443453
}
444454

445455
impl<'a, K, V, Type> NodeRef<marker::Mut<'a>, K, V, Type> {
446-
/// Unsafely asserts to the compiler some static information about whether this
447-
/// node is a `Leaf` or an `Internal`.
448-
unsafe fn cast_unchecked<NewType>(self) -> NodeRef<marker::Mut<'a>, K, V, NewType> {
456+
/// Unsafely asserts to the compiler the static information that this node is an `Internal`.
457+
unsafe fn cast_to_internal_unchecked(self) -> NodeRef<marker::Mut<'a>, K, V, marker::Internal> {
458+
debug_assert!(self.height > 0);
449459
NodeRef { height: self.height, node: self.node, _marker: PhantomData }
450460
}
451461

@@ -943,10 +953,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Leaf>, mark
943953
Handle::new_edge(left.reborrow_mut(), insert_idx)
944954
},
945955
InsertionPlace::Right(insert_idx) => unsafe {
946-
Handle::new_edge(
947-
right.node_as_mut().cast_unchecked::<marker::Leaf>(),
948-
insert_idx,
949-
)
956+
Handle::new_edge(right.leaf_node_as_mut(), insert_idx)
950957
},
951958
};
952959
let val_ptr = insertion_edge.insert_fit(key, val);
@@ -1006,10 +1013,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
10061013
Handle::new_edge(left.reborrow_mut(), insert_idx)
10071014
},
10081015
InsertionPlace::Right(insert_idx) => unsafe {
1009-
Handle::new_edge(
1010-
right.node_as_mut().cast_unchecked::<marker::Internal>(),
1011-
insert_idx,
1012-
)
1016+
Handle::new_edge(right.internal_node_as_mut(), insert_idx)
10131017
},
10141018
};
10151019
insertion_edge.insert_fit(key, val, edge);
@@ -1205,7 +1209,7 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
12051209

12061210
let mut new_root = Root { node: BoxedNode::from_internal(new_node), height };
12071211

1208-
new_root.node_as_mut().cast_unchecked().correct_childrens_parent_links(0..=new_len);
1212+
new_root.internal_node_as_mut().correct_childrens_parent_links(0..=new_len);
12091213

12101214
(self.node, k, v, new_root)
12111215
}
@@ -1258,8 +1262,8 @@ impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>,
12581262
if self.node.height > 1 {
12591263
// SAFETY: the height of the nodes being merged is one below the height
12601264
// of the node of this edge, thus above zero, so they are internal.
1261-
let mut left_node = left_node.cast_unchecked::<marker::Internal>();
1262-
let right_node = right_node.cast_unchecked::<marker::Internal>();
1265+
let mut left_node = left_node.cast_to_internal_unchecked();
1266+
let right_node = right_node.cast_to_internal_unchecked();
12631267
ptr::copy_nonoverlapping(
12641268
right_node.edge_at(0),
12651269
left_node.edges_mut().as_mut_ptr().add(left_len + 1),

0 commit comments

Comments
 (0)