Skip to content

Commit

Permalink
Rollup merge of rust-lang#58395 - vi:checked_duration_since, r=dtolnay
Browse files Browse the repository at this point in the history
Instant::checked_duration_since
  • Loading branch information
kennytm committed Feb 16, 2019
2 parents a55958b + 91f67fd commit d0d10d1
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/libstd/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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))]
Expand Down
60 changes: 60 additions & 0 deletions src/libstd/time.rs
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,52 @@ 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
/// #![feature(checked_duration_since)]
/// 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<Duration> {
if self >= &earlier {
Some(self.0.sub_instant(&earlier.0))
} else {
None
}
}

/// Returns the amount of time elapsed from another instant to this one,
/// or zero duration if that instant is earlier than this one.
///
/// # Examples
///
/// ```no_run
/// #![feature(checked_duration_since)]
/// 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.saturating_duration_since(now));
/// println!("{:?}", now.saturating_duration_since(new_now)); // 0ns
/// ```
#[unstable(feature = "checked_duration_since", issue = "58402")]
pub fn saturating_duration_since(&self, earlier: Instant) -> Duration {
self.checked_duration_since(earlier).unwrap_or(Duration::new(0, 0))
}

/// Returns the amount of time elapsed since this instant was created.
///
/// # Panics
Expand Down Expand Up @@ -626,6 +672,20 @@ mod tests {
(a - Duration::new(1, 0)).duration_since(a);
}

#[test]
fn checked_instant_duration_nopanic() {
let a = Instant::now();
let ret = (a - Duration::new(1, 0)).checked_duration_since(a);
assert_eq!(ret, None);
}

#[test]
fn saturating_instant_duration_nopanic() {
let a = Instant::now();
let ret = (a - Duration::new(1, 0)).saturating_duration_since(a);
assert_eq!(ret, Duration::new(0,0));
}

#[test]
fn system_time_math() {
let a = SystemTime::now();
Expand Down

0 comments on commit d0d10d1

Please sign in to comment.