//! The [`Instant`] struct and its associated `impl`s.
#![expect(deprecated)]
use core::borrow::Borrow; use core::cmp::{Ord, Ordering, PartialEq, PartialOrd}; use core::ops::{Add, AddAssign, Sub, SubAssign}; use core::time::Duration as StdDuration; use std::time::Instant as StdInstant;
usecrate::Duration;
/// 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`]. #[doc(hidden)] #[deprecated(
since = "0.3.35",
note = "import `std::time::Instant` and `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 /// # #![expect(deprecated)] /// # use time::{Instant, ext::{NumericalStdDuration, NumericalDuration}}; /// # use std::thread; /// let instant = Instant::now(); /// thread::sleep(1.std_milliseconds()); /// assert!(instant.elapsed() >= 1.milliseconds()); /// ``` #[inline] pubfn elapsed(self) -> Duration { Self::now() - 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 /// # #![expect(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())); /// ``` #[inline] 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 /// # #![expect(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())); /// ``` #[inline] 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)
}
}
/// Obtain the inner [`std::time::Instant`]. /// /// ```rust /// # #![expect(deprecated)] /// # use time::Instant; /// let now = Instant::now(); /// assert_eq!(now.into_inner(), now.0); /// ``` #[inline] 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. #[inline] fn add(self, duration: Duration) -> Self::Output { if duration.is_positive() { Self(self.0 + duration.unsigned_abs())
} elseif duration.is_negative() { #[expect(clippy::unchecked_time_subtraction)] Self(self.0 - duration.unsigned_abs())
} else {
debug_assert!(duration.is_zero()); self
}
}
}
impl Add<Duration> for StdInstant { type Output = Self;
/// # Panics /// /// This function may panic if the resulting point in time cannot be represented by the /// underlying data structure. #[inline] fn add(self, duration: Duration) -> Self::Output {
(Instant(self) + duration).0
}
}
impl Add<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. #[inline] fn add(self, duration: StdDuration) -> Self::Output { Self(self.0 + duration)
}
}
impl AddAssign<Duration> for Instant { /// # Panics /// /// This function may panic if the resulting point in time cannot be represented by the /// underlying data structure. #[inline] fn add_assign(&mutself, rhs: Duration) {
*self = *self + rhs;
}
}
impl AddAssign<StdDuration> for Instant { /// # Panics /// /// This function may panic if the resulting point in time cannot be represented by the /// underlying data structure. #[inline] fn add_assign(&mutself, rhs: StdDuration) {
*self = *self + rhs;
}
}
impl AddAssign<Duration> for StdInstant { /// # Panics /// /// This function may panic if the resulting point in time cannot be represented by the /// underlying data structure. #[inline] fn add_assign(&mutself, rhs: Duration) {
*self = *self + rhs;
}
}
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. #[inline] fn sub(self, duration: Duration) -> Self::Output { if duration.is_positive() { #[expect(clippy::unchecked_time_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;
/// # Panics /// /// This function may panic if the resulting point in time cannot be represented by the /// underlying data structure. #[inline] fn sub(self, duration: Duration) -> Self::Output {
(Instant(self) - duration).0
}
}
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. #[inline] fn sub(self, duration: StdDuration) -> Self::Output { #[expect(clippy::unchecked_time_subtraction)] Self(self.0 - duration)
}
}
impl SubAssign<Duration> for Instant { /// # Panics /// /// This function may panic if the resulting point in time cannot be represented by the /// underlying data structure. #[inline] fn sub_assign(&mutself, rhs: Duration) {
*self = *self - rhs;
}
}
impl SubAssign<StdDuration> for Instant { /// # Panics /// /// This function may panic if the resulting point in time cannot be represented by the /// underlying data structure. #[inline] fn sub_assign(&mutself, rhs: StdDuration) {
*self = *self - rhs;
}
}
impl SubAssign<Duration> for StdInstant { /// # Panics /// /// This function may panic if the resulting point in time cannot be represented by the /// underlying data structure. #[inline] fn sub_assign(&mutself, rhs: Duration) {
*self = *self - rhs;
}
}
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.