From 7b2a08cf494563c1867200cd994193d1855719f2 Mon Sep 17 00:00:00 2001 From: Vitaly _Vi Shukela Date: Tue, 12 Feb 2019 10:56:26 +0300 Subject: [PATCH] Add Instant::checked_duration_since, address #58402. --- src/libstd/lib.rs | 1 + src/libstd/time.rs | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index 8ecba3ecd68fd..38fc0bb80d0ba 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -295,6 +295,7 @@ #![feature(non_exhaustive)] #![feature(alloc_layout_extra)] #![feature(maybe_uninit)] +#![feature(checked_duration_since)] #![cfg_attr(all(target_vendor = "fortanix", target_env = "sgx"), feature(global_asm, range_contains, slice_index_methods, decl_macro, coerce_unsized, sgx_platform, ptr_wrapping_offset_from))] diff --git a/src/libstd/time.rs b/src/libstd/time.rs index 23924559fcc24..973edb5479e8d 100644 --- a/src/libstd/time.rs +++ b/src/libstd/time.rs @@ -218,6 +218,30 @@ impl Instant { self.0.sub_instant(&earlier.0) } + /// Returns the amount of time elapsed from another instant to this one, + /// or None if that instant is earlier than this one. + /// + /// # Examples + /// + /// ```no_run + /// use std::time::{Duration, Instant}; + /// use std::thread::sleep; + /// + /// let now = Instant::now(); + /// sleep(Duration::new(1, 0)); + /// let new_now = Instant::now(); + /// println!("{:?}", new_now.checked_duration_since(now)); + /// println!("{:?}", now.checked_duration_since(new_now)); // None + /// ``` + #[unstable(feature = "checked_duration_since", issue = "58402")] + pub fn checked_duration_since(&self, earlier: Instant) -> Option { + if self >= &earlier { + Some(self.0.sub_instant(&earlier.0)) + } else { + None + } + } + /// Returns the amount of time elapsed since this instant was created. /// /// # Panics @@ -626,6 +650,12 @@ mod tests { (a - Duration::new(1, 0)).duration_since(a); } + #[test] + fn checked_instant_duration_nopanic() { + let a = Instant::now(); + (a - Duration::new(1, 0)).checked_duration_since(a); + } + #[test] fn system_time_math() { let a = SystemTime::now();