| // Copyright 2016 Amanieu d'Antras |
| // |
| // Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or |
| // http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or |
| // http://opensource.org/licenses/MIT>, at your option. This file may not be |
| // copied, modified, or distributed except according to those terms. |
| |
| use std::time::{Duration, Instant}; |
| |
| // Option::unchecked_unwrap |
| pub trait UncheckedOptionExt<T> { |
| unsafe fn unchecked_unwrap(self) -> T; |
| } |
| |
| impl<T> UncheckedOptionExt<T> for Option<T> { |
| #[inline] |
| unsafe fn unchecked_unwrap(self) -> T { |
| match self { |
| Some(x) => x, |
| None => unreachable(), |
| } |
| } |
| } |
| |
| // hint::unreachable_unchecked() in release mode |
| #[inline] |
| unsafe fn unreachable() -> ! { |
| if cfg!(debug_assertions) { |
| unreachable!(); |
| } else { |
| core::hint::unreachable_unchecked() |
| } |
| } |
| |
| #[inline] |
| pub fn to_deadline(timeout: Duration) -> Option<Instant> { |
| #[cfg(has_checked_instant)] |
| let deadline = Instant::now().checked_add(timeout); |
| #[cfg(not(has_checked_instant))] |
| let deadline = Some(Instant::now() + timeout); |
| |
| deadline |
| } |