From 62f98a2509df9d660524334c5ea02b6269d695f4 Mon Sep 17 00:00:00 2001 From: Miguel Ojeda Date: Fri, 29 Jan 2021 16:21:12 +0100 Subject: [PATCH] btree: use Option's unwrap_unchecked() Now that https://github.com/rust-lang/rust/issues/81383 is available, start using it. Signed-off-by: Miguel Ojeda --- library/alloc/src/collections/btree/map.rs | 11 +++++------ library/alloc/src/collections/btree/mod.rs | 16 ---------------- library/alloc/src/collections/btree/navigate.rs | 11 +++++------ library/alloc/src/collections/btree/remove.rs | 5 ++--- library/alloc/src/lib.rs | 1 + 5 files changed, 13 insertions(+), 31 deletions(-) diff --git a/library/alloc/src/collections/btree/map.rs b/library/alloc/src/collections/btree/map.rs index 79dc694e6be82..bd5ed985404f5 100644 --- a/library/alloc/src/collections/btree/map.rs +++ b/library/alloc/src/collections/btree/map.rs @@ -11,7 +11,6 @@ use core::ptr; 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}; @@ -1386,7 +1385,7 @@ impl Drop for IntoIter { 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(); } @@ -1711,7 +1710,7 @@ impl<'a, K, V> Range<'a, K, V> { } 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() } } } @@ -1800,7 +1799,7 @@ impl<'a, K, V> DoubleEndedIterator for Range<'a, K, 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() } } } @@ -1846,7 +1845,7 @@ impl<'a, K, V> RangeMut<'a, K, V> { } 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. @@ -1876,7 +1875,7 @@ impl 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() } } } diff --git a/library/alloc/src/collections/btree/mod.rs b/library/alloc/src/collections/btree/mod.rs index cdb39104047f0..cf91c17b511cc 100644 --- a/library/alloc/src/collections/btree/mod.rs +++ b/library/alloc/src/collections/btree/mod.rs @@ -19,22 +19,6 @@ trait Recover { fn replace(&mut self, key: Self::Key) -> Option; } -/// 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(val: Option) -> 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 { diff --git a/library/alloc/src/collections/btree/navigate.rs b/library/alloc/src/collections/btree/navigate.rs index 2773b427fb133..1ef2a572ddd91 100644 --- a/library/alloc/src/collections/btree/navigate.rs +++ b/library/alloc/src/collections/btree/navigate.rs @@ -6,7 +6,6 @@ use core::ptr; 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 @@ macro_rules! def_next_kv_uncheched_dealloc { 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, 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 @@ impl<'a, K, V> Handle, K, V, marker::Leaf>, marker::Ed 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, 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 @@ impl<'a, K, V> Handle, K, V, marker::Leaf>, marker::E 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. diff --git a/library/alloc/src/collections/btree/remove.rs b/library/alloc/src/collections/btree/remove.rs index ff842197d1918..9cd016fa62f0e 100644 --- a/library/alloc/src/collections/btree/remove.rs +++ b/library/alloc/src/collections/btree/remove.rs @@ -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, 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 @@ impl<'a, K: 'a, V: 'a> Handle, K, V, marker::Internal>, // 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) diff --git a/library/alloc/src/lib.rs b/library/alloc/src/lib.rs index d7ae353282e79..afbf6aad5d0a7 100644 --- a/library/alloc/src/lib.rs +++ b/library/alloc/src/lib.rs @@ -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)]