use crate::{
ClockDomain,
MonotonicClock,
MonotonicInstant,
StdTimer,
Timer,
};
use std::sync::Arc;
use std::time::Instant;
#[derive(Debug)]
pub struct StdMonotonicClock {
domain: ClockDomain,
origin: Instant,
}
impl StdMonotonicClock {
#[must_use]
#[inline]
pub fn new() -> Self {
Self {
domain: ClockDomain::new(),
origin: Instant::now(),
}
}
#[must_use]
#[inline]
pub(crate) const fn same_domain_handle(&self) -> Self {
Self {
domain: self.domain,
origin: self.origin,
}
}
#[must_use]
#[inline(always)]
pub(crate) const fn origin(&self) -> Instant {
self.origin
}
#[inline(always)]
pub(crate) const fn domain(&self) -> ClockDomain {
self.domain
}
}
impl Default for StdMonotonicClock {
#[inline(always)]
fn default() -> Self {
Self::new()
}
}
impl MonotonicClock for StdMonotonicClock {
#[inline]
fn now(&self) -> MonotonicInstant {
MonotonicInstant::new(self.domain, self.origin.elapsed())
}
#[inline]
fn new_timer(&self) -> Arc<dyn Timer> {
Arc::new(StdTimer::from_clock(self))
}
}