use std::time::{Duration, Instant};
use crate::{black_box, MeasureResult};
#[derive(Debug, Default)]
pub struct Measurer {
pub(crate) seq: u128,
pub(crate) result: Option<MeasureResult>,
pub(crate) pass: bool,
}
impl Measurer {
#[inline]
pub fn get_seq(&self) -> u128 {
self.seq
}
#[inline]
pub fn get_result(&self) -> Option<&MeasureResult> {
self.result.as_ref()
}
#[inline]
pub fn is_measured(&self) -> bool {
self.result.is_none()
}
#[inline]
pub fn is_passed(&self) -> bool {
self.pass
}
#[inline]
fn update(&mut self, elapsed: Duration) {
match &mut self.result {
Some(result) => {
result.times += 1;
result.total_elapsed += elapsed;
},
None => {
self.result = Some(MeasureResult::new(elapsed));
},
}
}
#[inline]
pub fn measure<M, K>(&mut self, f: M)
where
M: FnOnce() -> K, {
let start = Instant::now();
black_box(f());
self.update(start.elapsed());
}
#[inline]
pub fn pass(&mut self) {
self.pass = true;
}
}