pub struct DeltaTimeMs(pub u16);
pub struct MonoClock {
pub clock: fn() -> u64,
pub last_ns: u64,
}
impl MonoClock {
pub fn new(clock: fn() -> u64) -> Self {
let now = clock();
Self {
clock,
last_ns: now,
}
}
pub fn now_ns(&self) -> u64 {
(self.clock)()
}
pub fn now_ms(&self) -> u32 {
(self.now_ns() / 1_000_000) as u32
}
}
#[cfg(any(test, feature = "std"))]
pub mod mock {
extern crate std;
use std::sync::Mutex;
static MOCK_NS: Mutex<u64> = Mutex::new(0);
pub fn clock_fn() -> u64 {
*MOCK_NS.lock().expect("mock clock poisoned")
}
pub fn set_ns(ns: u64) {
*MOCK_NS.lock().expect("mock clock poisoned") = ns;
}
pub fn set_ms(ms: u64) {
set_ns(ms.saturating_mul(1_000_000));
}
pub fn advance_ms(ms: u64) {
let mut guard = MOCK_NS.lock().expect("mock clock poisoned");
*guard = guard.saturating_add(ms.saturating_mul(1_000_000));
}
pub fn lock() -> std::sync::MutexGuard<'static, ()> {
static SERIAL: Mutex<()> = Mutex::new(());
SERIAL.lock().unwrap_or_else(|p| p.into_inner())
}
}