use std::time::Duration;
use crate::MonotonicClock;
use crate::MonotonicInstant;
use crate::TimeError;
use crate::TimerFuture;
pub trait Timer: Send + Sync {
#[must_use = "the Timer clock should be used to sample or validate deadlines"]
fn clock(&self) -> &dyn MonotonicClock;
fn at(&self, deadline: MonotonicInstant) -> Result<TimerFuture, TimeError>;
#[inline]
fn after(&self, duration: Duration) -> Result<TimerFuture, TimeError> {
let deadline = self.clock().deadline_after(duration)?;
self.at(deadline)
}
}
impl<T> Timer for &T
where
T: Timer + ?Sized,
{
#[inline(always)]
fn clock(&self) -> &dyn MonotonicClock {
<T as Timer>::clock(*self)
}
#[inline(always)]
fn at(&self, deadline: MonotonicInstant) -> Result<TimerFuture, TimeError> {
<T as Timer>::at(*self, deadline)
}
#[inline(always)]
fn after(&self, duration: Duration) -> Result<TimerFuture, TimeError> {
<T as Timer>::after(*self, duration)
}
}
impl<T> Timer for std::sync::Arc<T>
where
T: Timer + ?Sized,
{
#[inline(always)]
fn clock(&self) -> &dyn MonotonicClock {
self.as_ref().clock()
}
#[inline(always)]
fn at(&self, deadline: MonotonicInstant) -> Result<TimerFuture, TimeError> {
self.as_ref().at(deadline)
}
#[inline(always)]
fn after(&self, duration: Duration) -> Result<TimerFuture, TimeError> {
self.as_ref().after(duration)
}
}
impl<T> Timer for Box<T>
where
T: Timer + ?Sized,
{
#[inline(always)]
fn clock(&self) -> &dyn MonotonicClock {
self.as_ref().clock()
}
#[inline(always)]
fn at(&self, deadline: MonotonicInstant) -> Result<TimerFuture, TimeError> {
self.as_ref().at(deadline)
}
#[inline(always)]
fn after(&self, duration: Duration) -> Result<TimerFuture, TimeError> {
self.as_ref().after(duration)
}
}