use crate::time::Duration;
use std::ops::{Add, AddAssign, Sub, SubAssign};
use std::{fmt, time};
#[derive(Clone, Copy, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub struct Instant {
pub(crate) std: time::Instant,
}
impl Instant {
#[inline]
pub const fn from_std(std: time::Instant) -> Self {
Self { std }
}
#[inline]
pub fn duration_since(&self, earlier: Self) -> Duration {
self.std.duration_since(earlier.std)
}
#[inline]
pub fn checked_duration_since(&self, earlier: Self) -> Option<Duration> {
self.std.checked_duration_since(earlier.std)
}
#[inline]
pub fn saturating_duration_since(&self, earlier: Self) -> Duration {
self.std.saturating_duration_since(earlier.std)
}
#[inline]
pub fn checked_add(&self, duration: Duration) -> Option<Self> {
self.std.checked_add(duration).map(Self::from_std)
}
#[inline]
pub fn checked_sub(&self, duration: Duration) -> Option<Self> {
self.std.checked_sub(duration).map(Self::from_std)
}
}
impl Add<Duration> for Instant {
type Output = Self;
#[inline]
fn add(self, other: Duration) -> Self {
self.checked_add(other)
.expect("overflow when adding duration to instant")
}
}
impl AddAssign<Duration> for Instant {
#[inline]
fn add_assign(&mut self, other: Duration) {
*self = *self + other;
}
}
impl Sub<Duration> for Instant {
type Output = Self;
#[inline]
fn sub(self, other: Duration) -> Self {
self.checked_sub(other)
.expect("overflow when subtracting duration from instant")
}
}
impl SubAssign<Duration> for Instant {
#[inline]
fn sub_assign(&mut self, other: Duration) {
*self = *self - other;
}
}
impl Sub<Instant> for Instant {
type Output = Duration;
#[inline]
fn sub(self, other: Self) -> Duration {
self.duration_since(other)
}
}
impl fmt::Debug for Instant {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.std.fmt(f)
}
}