From 76a80492489b9081944c6da793c509c4ad82f813 Mon Sep 17 00:00:00 2001 From: Stein Somers <git@steinsomers.be> Date: Thu, 23 Jul 2020 20:15:47 +0200 Subject: [PATCH] Optimize btree's unwrap_unchecked --- library/alloc/src/collections/btree/mod.rs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/library/alloc/src/collections/btree/mod.rs b/library/alloc/src/collections/btree/mod.rs index 543ff41a4d48d..36511a23581a0 100644 --- a/library/alloc/src/collections/btree/mod.rs +++ b/library/alloc/src/collections/btree/mod.rs @@ -13,15 +13,16 @@ 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(); - } - } - }) + if cfg!(debug_assertions) { + val.expect("'unchecked' unwrap on None in BTreeMap") + } else { + val.unwrap() + // val.unwrap_or_else(|| unsafe { core::hint::unreachable_unchecked() }) + // ...is considerably slower + } }