pub trait Clock {
fn now_ms(&self) -> u64;
}
#[cfg(feature = "std")]
#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
pub struct SystemClock {
epoch: std::time::Instant,
}
#[cfg(feature = "std")]
impl SystemClock {
pub fn new() -> Self {
Self {
epoch: std::time::Instant::now(),
}
}
}
#[cfg(feature = "std")]
impl Default for SystemClock {
fn default() -> Self {
Self::new()
}
}
#[cfg(feature = "std")]
impl Clock for SystemClock {
fn now_ms(&self) -> u64 {
self.epoch.elapsed().as_millis() as u64
}
}
#[cfg(feature = "alloc")]
#[derive(Debug, Default, Clone)]
pub struct MockClock {
inner: alloc::sync::Arc<core::sync::atomic::AtomicU64>,
}
#[cfg(feature = "alloc")]
impl MockClock {
pub fn new() -> Self {
Self::default()
}
pub fn advance(&self, ms: u64) {
self.inner
.fetch_add(ms, core::sync::atomic::Ordering::Relaxed);
}
pub fn set(&self, ms: u64) {
self.inner.store(ms, core::sync::atomic::Ordering::Relaxed);
}
}
#[cfg(feature = "alloc")]
impl Clock for MockClock {
fn now_ms(&self) -> u64 {
self.inner.load(core::sync::atomic::Ordering::Relaxed)
}
}
impl<C: Clock + ?Sized> Clock for &C {
fn now_ms(&self) -> u64 {
(*self).now_ms()
}
}