thread_local/
unreachable.rs

1// Copyright 2017 Amanieu d'Antras
2//
3// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
4// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
5// http://opensource.org/licenses/MIT>, at your option. This file may not be
6// copied, modified, or distributed except according to those terms.
7
8use std::hint::unreachable_unchecked;
9
10/// An extension trait for `Option<T>` providing unchecked unwrapping methods.
11pub trait UncheckedOptionExt<T> {
12    /// Get the value out of this Option without checking for None.
13    unsafe fn unchecked_unwrap(self) -> T;
14
15    /// Assert that this Option is a None to the optimizer.
16    unsafe fn unchecked_unwrap_none(self);
17}
18
19/// An extension trait for `Result<T, E>` providing unchecked unwrapping methods.
20pub trait UncheckedResultExt<T, E> {
21    /// Get the value out of this Result without checking for Err.
22    unsafe fn unchecked_unwrap_ok(self) -> T;
23
24    /// Get the error out of this Result without checking for Ok.
25    unsafe fn unchecked_unwrap_err(self) -> E;
26}
27
28impl<T> UncheckedOptionExt<T> for Option<T> {
29    unsafe fn unchecked_unwrap(self) -> T {
30        match self {
31            Some(x) => x,
32            None => unreachable_unchecked(),
33        }
34    }
35
36    unsafe fn unchecked_unwrap_none(self) {
37        if self.is_some() {
38            unreachable_unchecked()
39        }
40    }
41}
42
43impl<T, E> UncheckedResultExt<T, E> for Result<T, E> {
44    unsafe fn unchecked_unwrap_ok(self) -> T {
45        match self {
46            Ok(x) => x,
47            Err(_) => unreachable_unchecked(),
48        }
49    }
50
51    unsafe fn unchecked_unwrap_err(self) -> E {
52        match self {
53            Ok(_) => unreachable_unchecked(),
54            Err(e) => e,
55        }
56    }
57}