summaryrefslogtreecommitdiffstats
path: root/third_party/rust/unreachable/src/lib.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 14:29:10 +0000
commit2aa4a82499d4becd2284cdb482213d541b8804dd (patch)
treeb80bf8bf13c3766139fbacc530efd0dd9d54394c /third_party/rust/unreachable/src/lib.rs
parentInitial commit. (diff)
downloadfirefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz
firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/unreachable/src/lib.rs')
-rw-r--r--third_party/rust/unreachable/src/lib.rs77
1 files changed, 77 insertions, 0 deletions
diff --git a/third_party/rust/unreachable/src/lib.rs b/third_party/rust/unreachable/src/lib.rs
new file mode 100644
index 0000000000..bb9b334312
--- /dev/null
+++ b/third_party/rust/unreachable/src/lib.rs
@@ -0,0 +1,77 @@
+#![cfg_attr(test, deny(warnings))]
+#![deny(missing_docs)]
+
+//! # unreachable
+//!
+//! An unreachable code optimization hint in stable rust, and some useful
+//! extension traits for `Option` and `Result`.
+//!
+
+#![no_std]
+
+extern crate void;
+
+use core::mem;
+
+/// Hint to the optimizer that any code path which calls this function is
+/// statically unreachable and can be removed.
+///
+/// Calling this function in reachable code invokes undefined behavior. Be
+/// very, very sure this is what you want; often, a simple `panic!` is more
+/// suitable.
+#[inline]
+pub unsafe fn unreachable() -> ! {
+ let x: &void::Void = mem::transmute(1usize);
+ void::unreachable(*x)
+}
+
+/// An extension trait for `Option<T>` providing unchecked unwrapping methods.
+pub trait UncheckedOptionExt<T> {
+ /// Get the value out of this Option without checking for None.
+ unsafe fn unchecked_unwrap(self) -> T;
+
+ /// Assert that this Option is a None to the optimizer.
+ unsafe fn unchecked_unwrap_none(self);
+}
+
+/// An extension trait for `Result<T, E>` providing unchecked unwrapping methods.
+pub trait UncheckedResultExt<T, E> {
+ /// Get the value out of this Result without checking for Err.
+ unsafe fn unchecked_unwrap_ok(self) -> T;
+
+ /// Get the error out of this Result without checking for Ok.
+ unsafe fn unchecked_unwrap_err(self) -> E;
+}
+
+impl<T> UncheckedOptionExt<T> for Option<T> {
+ unsafe fn unchecked_unwrap(self) -> T {
+ match self {
+ Some(x) => x,
+ None => unreachable()
+ }
+ }
+
+ unsafe fn unchecked_unwrap_none(self) {
+ match self {
+ Some(_) => unreachable(),
+ None => ()
+ }
+ }
+}
+
+impl<T, E> UncheckedResultExt<T, E> for Result<T, E> {
+ unsafe fn unchecked_unwrap_ok(self) -> T {
+ match self {
+ Ok(x) => x,
+ Err(_) => unreachable()
+ }
+ }
+
+ unsafe fn unchecked_unwrap_err(self) -> E {
+ match self {
+ Ok(_) => unreachable(),
+ Err(e) => e
+ }
+ }
+}
+