Rollup merge of #81526 - ojeda:btree-use-unwrap_unchecked, r=scottmcm

btree: use Option's unwrap_unchecked()

Now that https://github.com/rust-lang/rust/issues/81383 is available, start using it.
This commit is contained in:
Guillaume Gomez 2021-02-07 14:45:46 +01:00 committed by GitHub
commit 6e1f7139c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 13 additions and 31 deletions

View File

@ -11,7 +11,6 @@
use super::borrow::DormantMutRef;
use super::node::{self, marker, ForceResult::*, Handle, NodeRef, Root};
use super::search::SearchResult::*;
use super::unwrap_unchecked;
mod entry;
pub use entry::{Entry, OccupiedEntry, VacantEntry};
@ -1433,7 +1432,7 @@ fn drop(&mut self) {
unsafe {
let mut node =
unwrap_unchecked(ptr::read(&self.0.front)).into_node().forget_type();
ptr::read(&self.0.front).unwrap_unchecked().into_node().forget_type();
while let Some(parent) = node.deallocate_and_ascend() {
node = parent.into_node().forget_type();
}
@ -1758,7 +1757,7 @@ fn is_empty(&self) -> bool {
}
unsafe fn next_unchecked(&mut self) -> (&'a K, &'a V) {
unsafe { unwrap_unchecked(self.front.as_mut()).next_unchecked() }
unsafe { self.front.as_mut().unwrap_unchecked().next_unchecked() }
}
}
@ -1847,7 +1846,7 @@ fn next_back(&mut self) -> Option<(&'a K, &'a V)> {
impl<'a, K, V> Range<'a, K, V> {
unsafe fn next_back_unchecked(&mut self) -> (&'a K, &'a V) {
unsafe { unwrap_unchecked(self.back.as_mut()).next_back_unchecked() }
unsafe { self.back.as_mut().unwrap_unchecked().next_back_unchecked() }
}
}
@ -1893,7 +1892,7 @@ fn is_empty(&self) -> bool {
}
unsafe fn next_unchecked(&mut self) -> (&'a K, &'a mut V) {
unsafe { unwrap_unchecked(self.front.as_mut()).next_unchecked() }
unsafe { self.front.as_mut().unwrap_unchecked().next_unchecked() }
}
/// Returns an iterator of references over the remaining items.
@ -1923,7 +1922,7 @@ impl<K, V> FusedIterator for RangeMut<'_, K, V> {}
impl<'a, K, V> RangeMut<'a, K, V> {
unsafe fn next_back_unchecked(&mut self) -> (&'a K, &'a mut V) {
unsafe { unwrap_unchecked(self.back.as_mut()).next_back_unchecked() }
unsafe { self.back.as_mut().unwrap_unchecked().next_back_unchecked() }
}
}

View File

@ -19,22 +19,6 @@ trait Recover<Q: ?Sized> {
fn replace(&mut self, key: Self::Key) -> Option<Self::Key>;
}
/// Same purpose as `Option::unwrap` but doesn't always guarantee a panic
/// if the option contains no value.
/// SAFETY: the caller must ensure that the option contains a value.
#[inline(always)]
pub unsafe fn unwrap_unchecked<T>(val: Option<T>) -> T {
val.unwrap_or_else(|| {
if cfg!(debug_assertions) {
panic!("'unchecked' unwrap on None in BTreeMap");
} else {
unsafe {
core::intrinsics::unreachable();
}
}
})
}
#[cfg(test)]
/// XorShiftRng
struct DeterministicRng {

View File

@ -6,7 +6,6 @@
use super::node::{marker, ForceResult::*, Handle, NodeRef};
use super::search::SearchResult;
use super::unwrap_unchecked;
/// Finds the leaf edges delimiting a specified range in or underneath a node.
///
@ -310,7 +309,7 @@ unsafe fn $name <K, V>(
Err(last_edge) => {
unsafe {
let parent_edge = last_edge.into_node().deallocate_and_ascend();
unwrap_unchecked(parent_edge).forget_node_type()
parent_edge.unwrap_unchecked().forget_node_type()
}
}
}
@ -331,7 +330,7 @@ impl<'a, K, V> Handle<NodeRef<marker::Immut<'a>, K, V, marker::Leaf>, marker::Ed
pub unsafe fn next_unchecked(&mut self) -> (&'a K, &'a V) {
super::mem::replace(self, |leaf_edge| {
let kv = leaf_edge.next_kv();
let kv = unsafe { unwrap_unchecked(kv.ok()) };
let kv = unsafe { kv.ok().unwrap_unchecked() };
(kv.next_leaf_edge(), kv.into_kv())
})
}
@ -344,7 +343,7 @@ pub unsafe fn next_unchecked(&mut self) -> (&'a K, &'a V) {
pub unsafe fn next_back_unchecked(&mut self) -> (&'a K, &'a V) {
super::mem::replace(self, |leaf_edge| {
let kv = leaf_edge.next_back_kv();
let kv = unsafe { unwrap_unchecked(kv.ok()) };
let kv = unsafe { kv.ok().unwrap_unchecked() };
(kv.next_back_leaf_edge(), kv.into_kv())
})
}
@ -359,7 +358,7 @@ impl<'a, K, V> Handle<NodeRef<marker::ValMut<'a>, K, V, marker::Leaf>, marker::E
pub unsafe fn next_unchecked(&mut self) -> (&'a K, &'a mut V) {
let kv = super::mem::replace(self, |leaf_edge| {
let kv = leaf_edge.next_kv();
let kv = unsafe { unwrap_unchecked(kv.ok()) };
let kv = unsafe { kv.ok().unwrap_unchecked() };
(unsafe { ptr::read(&kv) }.next_leaf_edge(), kv)
});
// Doing this last is faster, according to benchmarks.
@ -374,7 +373,7 @@ pub unsafe fn next_unchecked(&mut self) -> (&'a K, &'a mut V) {
pub unsafe fn next_back_unchecked(&mut self) -> (&'a K, &'a mut V) {
let kv = super::mem::replace(self, |leaf_edge| {
let kv = leaf_edge.next_back_kv();
let kv = unsafe { unwrap_unchecked(kv.ok()) };
let kv = unsafe { kv.ok().unwrap_unchecked() };
(unsafe { ptr::read(&kv) }.next_back_leaf_edge(), kv)
});
// Doing this last is faster, according to benchmarks.

View File

@ -1,6 +1,5 @@
use super::map::MIN_LEN;
use super::node::{marker, ForceResult::*, Handle, LeftOrRight::*, NodeRef};
use super::unwrap_unchecked;
impl<'a, K: 'a, V: 'a> Handle<NodeRef<marker::Mut<'a>, K, V, marker::LeafOrInternal>, marker::KV> {
/// Removes a key-value pair from the tree, and returns that pair, as well as
@ -77,12 +76,12 @@ fn remove_internal_kv<F: FnOnce()>(
// the element we were asked to remove. Prefer the left adjacent KV,
// for the reasons listed in `choose_parent_kv`.
let left_leaf_kv = self.left_edge().descend().last_leaf_edge().left_kv();
let left_leaf_kv = unsafe { unwrap_unchecked(left_leaf_kv.ok()) };
let left_leaf_kv = unsafe { left_leaf_kv.ok().unwrap_unchecked() };
let (left_kv, left_hole) = left_leaf_kv.remove_leaf_kv(handle_emptied_internal_root);
// The internal node may have been stolen from or merged. Go back right
// to find where the original KV ended up.
let mut internal = unsafe { unwrap_unchecked(left_hole.next_kv().ok()) };
let mut internal = unsafe { left_hole.next_kv().ok().unwrap_unchecked() };
let old_kv = internal.replace_kv(left_kv.0, left_kv.1);
let pos = internal.next_leaf_edge();
(old_kv, pos)

View File

@ -111,6 +111,7 @@
#![feature(nll)]
#![feature(nonnull_slice_from_raw_parts)]
#![feature(auto_traits)]
#![feature(option_result_unwrap_unchecked)]
#![feature(or_patterns)]
#![feature(pattern)]
#![feature(ptr_internals)]