Auto merge of #117619 - elomatreb:add-duration-abs-diff, r=thomcc
Add `Duration::abs_diff` This adds a `Duration::abs_diff` method analogous to the existing one on the primitive integers. ACP: https://github.com/rust-lang/libs-team/issues/291 Tracking Issue: https://github.com/rust-lang/rust/issues/117618
This commit is contained in:
commit
e24e5af787
@ -461,6 +461,27 @@ pub const fn as_nanos(&self) -> u128 {
|
|||||||
self.secs as u128 * NANOS_PER_SEC as u128 + self.nanos.0 as u128
|
self.secs as u128 * NANOS_PER_SEC as u128 + self.nanos.0 as u128
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Computes the absolute difference between `self` and `other`.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// Basic usage:
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #![feature(duration_abs_diff)]
|
||||||
|
/// use std::time::Duration;
|
||||||
|
///
|
||||||
|
/// assert_eq!(Duration::new(100, 0).abs_diff(Duration::new(80, 0)), Duration::new(20, 0));
|
||||||
|
/// assert_eq!(Duration::new(100, 400_000_000).abs_diff(Duration::new(110, 0)), Duration::new(9, 600_000_000));
|
||||||
|
/// ```
|
||||||
|
#[unstable(feature = "duration_abs_diff", issue = "117618")]
|
||||||
|
#[must_use = "this returns the result of the operation, \
|
||||||
|
without modifying the original"]
|
||||||
|
#[inline]
|
||||||
|
pub const fn abs_diff(self, other: Duration) -> Duration {
|
||||||
|
if let Some(res) = self.checked_sub(other) { res } else { other.checked_sub(self).unwrap() }
|
||||||
|
}
|
||||||
|
|
||||||
/// Checked `Duration` addition. Computes `self + other`, returning [`None`]
|
/// Checked `Duration` addition. Computes `self + other`, returning [`None`]
|
||||||
/// if overflow occurred.
|
/// if overflow occurred.
|
||||||
///
|
///
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#![feature(core_private_diy_float)]
|
#![feature(core_private_diy_float)]
|
||||||
#![feature(dec2flt)]
|
#![feature(dec2flt)]
|
||||||
#![feature(div_duration)]
|
#![feature(div_duration)]
|
||||||
|
#![feature(duration_abs_diff)]
|
||||||
#![feature(duration_consts_float)]
|
#![feature(duration_consts_float)]
|
||||||
#![feature(duration_constants)]
|
#![feature(duration_constants)]
|
||||||
#![feature(exact_size_is_empty)]
|
#![feature(exact_size_is_empty)]
|
||||||
|
@ -73,6 +73,19 @@ fn nanos() {
|
|||||||
assert_eq!(Duration::from_nanos(1_000_000_001).subsec_nanos(), 1);
|
assert_eq!(Duration::from_nanos(1_000_000_001).subsec_nanos(), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn abs_diff() {
|
||||||
|
assert_eq!(Duration::new(2, 0).abs_diff(Duration::new(1, 0)), Duration::new(1, 0));
|
||||||
|
assert_eq!(Duration::new(1, 0).abs_diff(Duration::new(2, 0)), Duration::new(1, 0));
|
||||||
|
assert_eq!(Duration::new(1, 0).abs_diff(Duration::new(1, 0)), Duration::new(0, 0));
|
||||||
|
assert_eq!(Duration::new(1, 1).abs_diff(Duration::new(0, 2)), Duration::new(0, 999_999_999));
|
||||||
|
assert_eq!(Duration::new(1, 1).abs_diff(Duration::new(2, 1)), Duration::new(1, 0));
|
||||||
|
assert_eq!(Duration::MAX.abs_diff(Duration::MAX), Duration::ZERO);
|
||||||
|
assert_eq!(Duration::ZERO.abs_diff(Duration::ZERO), Duration::ZERO);
|
||||||
|
assert_eq!(Duration::MAX.abs_diff(Duration::ZERO), Duration::MAX);
|
||||||
|
assert_eq!(Duration::ZERO.abs_diff(Duration::MAX), Duration::MAX);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn add() {
|
fn add() {
|
||||||
assert_eq!(Duration::new(0, 0) + Duration::new(0, 1), Duration::new(0, 1));
|
assert_eq!(Duration::new(0, 0) + Duration::new(0, 1), Duration::new(0, 1));
|
||||||
|
Loading…
Reference in New Issue
Block a user