use crate::{Duration, TimePoint};
pub trait Clock: Sized {
fn now(&self) -> TimePoint<Self>;
#[inline(always)]
fn time_point(since_epoch: Duration) -> TimePoint<Self> {
TimePoint::new(since_epoch)
}
}
#[cfg(feature = "std")]
mod std_mod {
use super::*;
use lazy_static::lazy_static;
pub struct InstantClock;
impl Clock for InstantClock {
fn now(&self) -> TimePoint<Self> {
lazy_static! {
static ref EPOCH: std::time::Instant = std::time::Instant::now();
}
let since_epoch = std::time::Instant::now().saturating_duration_since(*EPOCH);
TimePoint::<Self>::new(Duration::from_micros(since_epoch.as_micros() as i64))
}
}
pub struct SystemClock;
impl Clock for SystemClock {
fn now(&self) -> TimePoint<Self> {
let n = std::time::SystemTime::now();
let since_epoch = n.duration_since(std::time::SystemTime::UNIX_EPOCH).unwrap();
TimePoint::<Self>::new(Duration::from_micros(since_epoch.as_micros() as i64))
}
}
}
#[cfg(feature = "std")]
pub use std_mod::*;