use std::ops::{Add, AddAssign, Sub, SubAssign};
use std::time;
use derive_more::{Add, AddAssign, Sub, SubAssign};
use paste::paste;
use crate::traits::CoarseTimeProvider;
#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)] #[derive(Add, Sub, AddAssign, SubAssign)]
pub struct CoarseDuration(coarsetime::Duration);
#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq, Hash)] pub struct CoarseInstant(coarsetime::Instant);
impl From<time::Duration> for CoarseDuration {
fn from(td: time::Duration) -> CoarseDuration {
CoarseDuration(td.into())
}
}
impl From<CoarseDuration> for time::Duration {
fn from(cd: CoarseDuration) -> time::Duration {
cd.0.into()
}
}
macro_rules! impl_add_sub { { $($AddSub:ident),* $(,)? } => { paste! { $(
impl $AddSub<CoarseDuration> for CoarseInstant {
type Output = CoarseInstant;
fn [< $AddSub:lower >](self, rhs: CoarseDuration) -> CoarseInstant {
CoarseInstant(self.0. [< $AddSub:lower >]( rhs.0 ))
}
}
impl [< $AddSub Assign >]<CoarseDuration> for CoarseInstant {
fn [< $AddSub:lower _assign >](&mut self, rhs: CoarseDuration) {
*self = self.[< $AddSub:lower >](rhs);
}
}
)* } } }
impl_add_sub!(Add, Sub);
#[derive(Default, Clone, Debug)]
#[non_exhaustive]
pub struct RealCoarseTimeProvider {}
impl RealCoarseTimeProvider {
#[inline]
pub fn new() -> Self {
RealCoarseTimeProvider::default()
}
}
impl CoarseTimeProvider for RealCoarseTimeProvider {
fn now_coarse(&self) -> CoarseInstant {
CoarseInstant(coarsetime::Instant::now())
}
}
#[cfg(test)]
mod test {
#![allow(clippy::bool_assert_comparison)]
#![allow(clippy::clone_on_copy)]
#![allow(clippy::dbg_macro)]
#![allow(clippy::mixed_attributes_style)]
#![allow(clippy::print_stderr)]
#![allow(clippy::print_stdout)]
#![allow(clippy::single_char_pattern)]
#![allow(clippy::unwrap_used)]
#![allow(clippy::unchecked_duration_subtraction)]
#![allow(clippy::useless_vec)]
#![allow(clippy::needless_pass_by_value)]
#![allow(clippy::erasing_op)]
use super::*;
#[test]
fn basic() {
let t1 = RealCoarseTimeProvider::new().now_coarse();
let t2 = t1 + CoarseDuration::from(time::Duration::from_secs(10));
let t0 = t1 - CoarseDuration::from(time::Duration::from_secs(10));
assert!(t0 < t1);
assert!(t0 < t2);
assert!(t1 < t2);
}
}