Rollup merge of #75195 - ssomers:btree_split_up_into_kv_mut, r=Mark-Simulacrum
BTreeMap: purge innocent use of into_kv_mut Replace the use of `into_kv_mut` into more precise calls. This makes more sense if you know that the single remaining use of `into_kv_mut` is in fact evil and can be trialled in court (#75200) and sent to a correction facility (#73971). No real performance difference reported (but functions that might benefit a tiny constant bit like `BTreeMap::get_mut` aren't benchmarked): ``` benchcmp old new --threshold 5 name old ns/iter new ns/iter diff ns/iter diff % speedup btree::map::clone_fat_100 63,073 59,256 -3,817 -6.05% x 1.06 btree::map::iter_100 3,514 3,235 -279 -7.94% x 1.09 ```
This commit is contained in:
commit
83e75acdec
2 changed files with 19 additions and 9 deletions
|
@ -245,7 +245,7 @@ where
|
||||||
fn replace(&mut self, key: K) -> Option<K> {
|
fn replace(&mut self, key: K) -> Option<K> {
|
||||||
let root = Self::ensure_is_owned(&mut self.root);
|
let root = Self::ensure_is_owned(&mut self.root);
|
||||||
match search::search_tree::<marker::Mut<'_>, K, (), K>(root.node_as_mut(), &key) {
|
match search::search_tree::<marker::Mut<'_>, K, (), K>(root.node_as_mut(), &key) {
|
||||||
Found(handle) => Some(mem::replace(handle.into_kv_mut().0, key)),
|
Found(handle) => Some(mem::replace(handle.into_key_mut(), key)),
|
||||||
GoDown(handle) => {
|
GoDown(handle) => {
|
||||||
VacantEntry { key, handle, length: &mut self.length, _marker: PhantomData }
|
VacantEntry { key, handle, length: &mut self.length, _marker: PhantomData }
|
||||||
.insert(());
|
.insert(());
|
||||||
|
@ -811,7 +811,7 @@ impl<K: Ord, V> BTreeMap<K, V> {
|
||||||
{
|
{
|
||||||
let root_node = self.root.as_mut()?.node_as_mut();
|
let root_node = self.root.as_mut()?.node_as_mut();
|
||||||
match search::search_tree(root_node, key) {
|
match search::search_tree(root_node, key) {
|
||||||
Found(handle) => Some(handle.into_kv_mut().1),
|
Found(handle) => Some(handle.into_val_mut()),
|
||||||
GoDown(_) => None,
|
GoDown(_) => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2748,7 +2748,7 @@ impl<'a, K: Ord, V> OccupiedEntry<'a, K, V> {
|
||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
pub fn into_mut(self) -> &'a mut V {
|
pub fn into_mut(self) -> &'a mut V {
|
||||||
self.handle.into_kv_mut().1
|
self.handle.into_val_mut()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the value of the entry with the `OccupiedEntry`'s key,
|
/// Sets the value of the entry with the `OccupiedEntry`'s key,
|
||||||
|
|
|
@ -1067,6 +1067,16 @@ impl<'a, K: 'a, V: 'a, NodeType> Handle<NodeRef<marker::Immut<'a>, K, V, NodeTyp
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, K: 'a, V: 'a, NodeType> Handle<NodeRef<marker::Mut<'a>, K, V, NodeType>, marker::KV> {
|
impl<'a, K: 'a, V: 'a, NodeType> Handle<NodeRef<marker::Mut<'a>, K, V, NodeType>, marker::KV> {
|
||||||
|
pub fn into_key_mut(self) -> &'a mut K {
|
||||||
|
let keys = self.node.into_key_slice_mut();
|
||||||
|
unsafe { keys.get_unchecked_mut(self.idx) }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn into_val_mut(self) -> &'a mut V {
|
||||||
|
let vals = self.node.into_val_slice_mut();
|
||||||
|
unsafe { vals.get_unchecked_mut(self.idx) }
|
||||||
|
}
|
||||||
|
|
||||||
pub fn into_kv_mut(self) -> (&'a mut K, &'a mut V) {
|
pub fn into_kv_mut(self) -> (&'a mut K, &'a mut V) {
|
||||||
unsafe {
|
unsafe {
|
||||||
let (keys, vals) = self.node.into_slices_mut();
|
let (keys, vals) = self.node.into_slices_mut();
|
||||||
|
@ -1261,8 +1271,8 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::
|
||||||
unsafe {
|
unsafe {
|
||||||
let (k, v, edge) = self.reborrow_mut().left_edge().descend().pop();
|
let (k, v, edge) = self.reborrow_mut().left_edge().descend().pop();
|
||||||
|
|
||||||
let k = mem::replace(self.reborrow_mut().into_kv_mut().0, k);
|
let k = mem::replace(self.kv_mut().0, k);
|
||||||
let v = mem::replace(self.reborrow_mut().into_kv_mut().1, v);
|
let v = mem::replace(self.kv_mut().1, v);
|
||||||
|
|
||||||
match self.reborrow_mut().right_edge().descend().force() {
|
match self.reborrow_mut().right_edge().descend().force() {
|
||||||
ForceResult::Leaf(mut leaf) => leaf.push_front(k, v),
|
ForceResult::Leaf(mut leaf) => leaf.push_front(k, v),
|
||||||
|
@ -1278,8 +1288,8 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::
|
||||||
unsafe {
|
unsafe {
|
||||||
let (k, v, edge) = self.reborrow_mut().right_edge().descend().pop_front();
|
let (k, v, edge) = self.reborrow_mut().right_edge().descend().pop_front();
|
||||||
|
|
||||||
let k = mem::replace(self.reborrow_mut().into_kv_mut().0, k);
|
let k = mem::replace(self.kv_mut().0, k);
|
||||||
let v = mem::replace(self.reborrow_mut().into_kv_mut().1, v);
|
let v = mem::replace(self.kv_mut().1, v);
|
||||||
|
|
||||||
match self.reborrow_mut().left_edge().descend().force() {
|
match self.reborrow_mut().left_edge().descend().force() {
|
||||||
ForceResult::Leaf(mut leaf) => leaf.push(k, v),
|
ForceResult::Leaf(mut leaf) => leaf.push(k, v),
|
||||||
|
@ -1307,7 +1317,7 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::
|
||||||
let left_kv = left_node.reborrow_mut().into_kv_pointers_mut();
|
let left_kv = left_node.reborrow_mut().into_kv_pointers_mut();
|
||||||
let right_kv = right_node.reborrow_mut().into_kv_pointers_mut();
|
let right_kv = right_node.reborrow_mut().into_kv_pointers_mut();
|
||||||
let parent_kv = {
|
let parent_kv = {
|
||||||
let kv = self.reborrow_mut().into_kv_mut();
|
let kv = self.kv_mut();
|
||||||
(kv.0 as *mut K, kv.1 as *mut V)
|
(kv.0 as *mut K, kv.1 as *mut V)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1364,7 +1374,7 @@ impl<'a, K, V> Handle<NodeRef<marker::Mut<'a>, K, V, marker::Internal>, marker::
|
||||||
let left_kv = left_node.reborrow_mut().into_kv_pointers_mut();
|
let left_kv = left_node.reborrow_mut().into_kv_pointers_mut();
|
||||||
let right_kv = right_node.reborrow_mut().into_kv_pointers_mut();
|
let right_kv = right_node.reborrow_mut().into_kv_pointers_mut();
|
||||||
let parent_kv = {
|
let parent_kv = {
|
||||||
let kv = self.reborrow_mut().into_kv_mut();
|
let kv = self.kv_mut();
|
||||||
(kv.0 as *mut K, kv.1 as *mut V)
|
(kv.0 as *mut K, kv.1 as *mut V)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue