use crate::{BaseTimer, Delta, TArch, TDesc};
#[derive(Default, Debug, Clone, Copy)]
pub struct Timer<const S: bool>
where
BaseTimer<S>: Default,
TDesc<S>: TArch,
{
base: BaseTimer<S>,
}
impl<const S: bool> Timer<S>
where
BaseTimer<S>: Default,
TDesc<S>: TArch,
{
#[inline(always)]
pub fn start(&mut self) {
self.base.start()
}
#[inline(always)]
pub fn elapsed(&self) -> u64 {
self.base.elapsed()
}
#[inline(always)]
pub fn elapsed_and_update(&mut self) -> u64 {
self.base.elapsed_and_update()
}
}
#[derive(Default, Debug, Clone, Copy)]
pub struct DeltaTimer<const S: bool>
where
BaseTimer<S>: Default,
TDesc<S>: TArch,
{
base: BaseTimer<S>,
delta: Delta,
}
impl<const S: bool> DeltaTimer<S>
where
TDesc<S>: TArch,
{
pub fn clear(&mut self) {
*self = Self::default();
}
#[inline(always)]
pub fn start(&mut self) {
self.base.start();
}
#[inline(always)]
pub fn delta(&mut self) -> u64 {
self.base.elapsed_delta().into()
}
#[inline(always)]
pub fn stop(&mut self) {
self.delta = self.base.elapsed_delta();
}
#[inline(always)]
pub fn value(&self) -> u64 {
self.delta.into()
}
}
#[derive(Default, Debug, Clone, Copy)]
pub struct AccTimer<const S: bool>
where
TDesc<S>: TArch,
{
base: BaseTimer<S>,
delta: Delta,
acc: Delta,
}
impl<const S: bool> AccTimer<S>
where
TDesc<S>: TArch,
{
pub fn clear(&mut self) {
*self = Self::default();
}
#[inline(always)]
pub fn start(&mut self) {
self.base.start();
}
#[inline(always)]
pub fn stop(&mut self) {
self.delta = self.base.elapsed_delta();
self.acc = self.acc.sat_add(self.delta);
}
#[inline(always)]
pub fn last_delta(&self) -> u64 {
self.delta.into()
}
#[inline(always)]
pub fn acc_value(&self) -> u64 {
self.acc.into()
}
}