//! The [`Instant`] struct and its associated `impl`s.
#![allow(deprecated)]
use core::borrow::Borrow; use core::cmp::{Ord, Ordering, PartialEq, PartialOrd}; use core::ops::{Add, Sub}; use core::time::Duration as StdDuration; use std::time::Instant as StdInstant;
/// A measurement of a monotonically non-decreasing clock. Opaque and useful only with [`Duration`]. /// /// Instants are always guaranteed to be no less than any previously measured instant when created, /// and are often useful for tasks such as measuring benchmarks or timing how long an operation /// takes. /// /// Note, however, that instants are not guaranteed to be **steady**. In other words, each tick of /// the underlying clock may not be the same length (e.g. some seconds may be longer than others). /// An instant may jump forwards or experience time dilation (slow down or speed up), but it will /// never go backwards. /// /// Instants are opaque types that can only be compared to one another. There is no method to get /// "the number of seconds" from an instant. Instead, it only allows measuring the duration between /// two instants (or comparing two instants). /// /// This implementation allows for operations with signed [`Duration`]s, but is otherwise identical /// to [`std::time::Instant`]. #[deprecated(since = "0.3.35", note = "import `time::ext::InstantExt` instead")] #[repr(transparent)] #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pubstruct Instant(pub StdInstant);
/// Returns the amount of time elapsed since this instant was created. The duration will always /// be nonnegative if the instant is not synthetically created. /// /// ```rust /// # #![allow(deprecated)] /// # use time::{Instant, ext::{NumericalStdDuration, NumericalDuration}}; /// # use std::thread; /// let instant = Instant::now(); /// thread::sleep(1.std_milliseconds()); /// assert!(instant.elapsed() >= 1.milliseconds()); /// ``` pubfn elapsed(self) -> Duration { Self::now() - self
} // endregion delegation
// region: checked arithmetic /// Returns `Some(t)` where `t` is the time `self + duration` if `t` can be represented as /// `Instant` (which means it's inside the bounds of the underlying data structure), `None` /// otherwise. /// /// ```rust /// # #![allow(deprecated)] /// # use time::{Instant, ext::NumericalDuration}; /// let now = Instant::now(); /// assert_eq!(now.checked_add(5.seconds()), Some(now + 5.seconds())); /// assert_eq!(now.checked_add((-5).seconds()), Some(now + (-5).seconds())); /// ``` pubfn checked_add(self, duration: Duration) -> Option<Self> { if duration.is_zero() {
Some(self)
} elseif duration.is_positive() { self.0.checked_add(duration.unsigned_abs()).map(Self)
} else {
debug_assert!(duration.is_negative()); self.0.checked_sub(duration.unsigned_abs()).map(Self)
}
}
/// Returns `Some(t)` where `t` is the time `self - duration` if `t` can be represented as /// `Instant` (which means it's inside the bounds of the underlying data structure), `None` /// otherwise. /// /// ```rust /// # #![allow(deprecated)] /// # use time::{Instant, ext::NumericalDuration}; /// let now = Instant::now(); /// assert_eq!(now.checked_sub(5.seconds()), Some(now - 5.seconds())); /// assert_eq!(now.checked_sub((-5).seconds()), Some(now - (-5).seconds())); /// ``` pubfn checked_sub(self, duration: Duration) -> Option<Self> { if duration.is_zero() {
Some(self)
} elseif duration.is_positive() { self.0.checked_sub(duration.unsigned_abs()).map(Self)
} else {
debug_assert!(duration.is_negative()); self.0.checked_add(duration.unsigned_abs()).map(Self)
}
} // endregion checked arithmetic
/// Obtain the inner [`std::time::Instant`]. /// /// ```rust /// # #![allow(deprecated)] /// # use time::Instant; /// let now = Instant::now(); /// assert_eq!(now.into_inner(), now.0); /// ``` pubconstfn into_inner(self) -> StdInstant { self.0
}
}
impl Add<Duration> for Instant { type Output = Self;
/// # Panics /// /// This function may panic if the resulting point in time cannot be represented by the /// underlying data structure. fn add(self, duration: Duration) -> Self::Output { if duration.is_positive() { Self(self.0 + duration.unsigned_abs())
} elseif duration.is_negative() { #[allow(clippy::unchecked_duration_subtraction)] Self(self.0 - duration.unsigned_abs())
} else {
debug_assert!(duration.is_zero()); self
}
}
}
impl Add<Duration> for StdInstant { type Output = Self;
impl Sub<Duration> for Instant { type Output = Self;
/// # Panics /// /// This function may panic if the resulting point in time cannot be represented by the /// underlying data structure. fn sub(self, duration: Duration) -> Self::Output { if duration.is_positive() { #[allow(clippy::unchecked_duration_subtraction)] Self(self.0 - duration.unsigned_abs())
} elseif duration.is_negative() { Self(self.0 + duration.unsigned_abs())
} else {
debug_assert!(duration.is_zero()); self
}
}
}
impl Sub<Duration> for StdInstant { type Output = Self;
impl Sub<StdDuration> for Instant { type Output = Self;
/// # Panics /// /// This function may panic if the resulting point in time cannot be represented by the /// underlying data structure. fn sub(self, duration: StdDuration) -> Self::Output { #[allow(clippy::unchecked_duration_subtraction)] Self(self.0 - duration)
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.