Skip to content

Commit 68b75db

Browse files
authored
Rollup merge of rust-lang#80006 - ssomers:btree_cleanup_6, r=Mark-Simulacrum
BTreeMap: more expressive local variables in merge r? ```@Mark-Simulacrum```
2 parents fe2af20 + 94fd1d3 commit 68b75db

File tree

1 file changed

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

1 file changed

+27
-28
lines changed

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

+27-28
Original file line numberDiff line numberDiff line change
@@ -1355,66 +1355,65 @@ impl<'a, K: 'a, V: 'a> BalancingContext<'a, K, V> {
13551355
///
13561356
/// Panics unless we `.can_merge()`.
13571357
pub fn merge(
1358-
mut self,
1358+
self,
13591359
track_edge_idx: Option<LeftOrRight<usize>>,
13601360
) -> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>, marker::Edge> {
1361+
let Handle { node: mut parent_node, idx: parent_idx, _marker } = self.parent;
1362+
let old_parent_len = parent_node.len();
13611363
let mut left_node = self.left_child;
1362-
let left_len = left_node.len();
1364+
let old_left_len = left_node.len();
13631365
let right_node = self.right_child;
13641366
let right_len = right_node.len();
1367+
let new_left_len = old_left_len + 1 + right_len;
13651368

1366-
assert!(left_len + right_len < CAPACITY);
1369+
assert!(new_left_len <= CAPACITY);
13671370
assert!(match track_edge_idx {
13681371
None => true,
1369-
Some(LeftOrRight::Left(idx)) => idx <= left_len,
1372+
Some(LeftOrRight::Left(idx)) => idx <= old_left_len,
13701373
Some(LeftOrRight::Right(idx)) => idx <= right_len,
13711374
});
13721375

13731376
unsafe {
1374-
*left_node.reborrow_mut().into_len_mut() += right_len as u16 + 1;
1377+
*left_node.reborrow_mut().into_len_mut() = new_left_len as u16;
13751378

1376-
let parent_key = slice_remove(
1377-
self.parent.node.reborrow_mut().into_key_area_slice(),
1378-
self.parent.idx,
1379-
);
1380-
left_node.reborrow_mut().into_key_area_mut_at(left_len).write(parent_key);
1379+
let parent_key =
1380+
slice_remove(parent_node.reborrow_mut().into_key_area_slice(), parent_idx);
1381+
left_node.reborrow_mut().into_key_area_mut_at(old_left_len).write(parent_key);
13811382
ptr::copy_nonoverlapping(
13821383
right_node.reborrow().key_area().as_ptr(),
1383-
left_node.reborrow_mut().into_key_area_slice().as_mut_ptr().add(left_len + 1),
1384+
left_node.reborrow_mut().into_key_area_slice().as_mut_ptr().add(old_left_len + 1),
13841385
right_len,
13851386
);
13861387

1387-
let parent_val = slice_remove(
1388-
self.parent.node.reborrow_mut().into_val_area_slice(),
1389-
self.parent.idx,
1390-
);
1391-
left_node.reborrow_mut().into_val_area_mut_at(left_len).write(parent_val);
1388+
let parent_val =
1389+
slice_remove(parent_node.reborrow_mut().into_val_area_slice(), parent_idx);
1390+
left_node.reborrow_mut().into_val_area_mut_at(old_left_len).write(parent_val);
13921391
ptr::copy_nonoverlapping(
13931392
right_node.reborrow().val_area().as_ptr(),
1394-
left_node.reborrow_mut().into_val_area_slice().as_mut_ptr().add(left_len + 1),
1393+
left_node.reborrow_mut().into_val_area_slice().as_mut_ptr().add(old_left_len + 1),
13951394
right_len,
13961395
);
13971396

1398-
slice_remove(
1399-
&mut self.parent.node.reborrow_mut().into_edge_area_slice(),
1400-
self.parent.idx + 1,
1401-
);
1402-
let parent_old_len = self.parent.node.len();
1403-
self.parent.node.correct_childrens_parent_links(self.parent.idx + 1..parent_old_len);
1404-
*self.parent.node.reborrow_mut().into_len_mut() -= 1;
1397+
slice_remove(&mut parent_node.reborrow_mut().into_edge_area_slice(), parent_idx + 1);
1398+
parent_node.correct_childrens_parent_links(parent_idx + 1..old_parent_len);
1399+
*parent_node.reborrow_mut().into_len_mut() -= 1;
14051400

1406-
if self.parent.node.height > 1 {
1401+
if parent_node.height > 1 {
14071402
// SAFETY: the height of the nodes being merged is one below the height
14081403
// of the node of this edge, thus above zero, so they are internal.
14091404
let mut left_node = left_node.reborrow_mut().cast_to_internal_unchecked();
14101405
let right_node = right_node.cast_to_internal_unchecked();
14111406
ptr::copy_nonoverlapping(
14121407
right_node.reborrow().edge_area().as_ptr(),
1413-
left_node.reborrow_mut().into_edge_area_slice().as_mut_ptr().add(left_len + 1),
1408+
left_node
1409+
.reborrow_mut()
1410+
.into_edge_area_slice()
1411+
.as_mut_ptr()
1412+
.add(old_left_len + 1),
14141413
right_len + 1,
14151414
);
14161415

1417-
left_node.correct_childrens_parent_links(left_len + 1..=left_len + 1 + right_len);
1416+
left_node.correct_childrens_parent_links(old_left_len + 1..new_left_len + 1);
14181417

14191418
Global.deallocate(right_node.node.cast(), Layout::new::<InternalNode<K, V>>());
14201419
} else {
@@ -1424,7 +1423,7 @@ impl<'a, K: 'a, V: 'a> BalancingContext<'a, K, V> {
14241423
let new_idx = match track_edge_idx {
14251424
None => 0,
14261425
Some(LeftOrRight::Left(idx)) => idx,
1427-
Some(LeftOrRight::Right(idx)) => left_len + 1 + idx,
1426+
Some(LeftOrRight::Right(idx)) => old_left_len + 1 + idx,
14281427
};
14291428
Handle::new_edge(left_node, new_idx)
14301429
}

0 commit comments

Comments
 (0)