use std::time::{Duration, Instant};
pub struct PhaseTimer<'a> {
start: Instant,
slot: &'a mut Duration,
}
impl<'a> PhaseTimer<'a> {
pub fn new(slot: &'a mut Duration) -> Self {
Self {
start: Instant::now(),
slot,
}
}
}
impl Drop for PhaseTimer<'_> {
fn drop(&mut self) {
*self.slot += self.start.elapsed();
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::thread;
#[test]
fn test_phase_timer_records_elapsed() {
let mut duration = Duration::ZERO;
{
let _timer = PhaseTimer::new(&mut duration);
thread::sleep(Duration::from_millis(10));
}
assert!(duration.as_millis() >= 10);
}
#[test]
fn test_phase_timer_accumulates() {
let mut duration = Duration::ZERO;
for _ in 0..3 {
{
let _timer = PhaseTimer::new(&mut duration);
thread::sleep(Duration::from_millis(5));
}
}
assert!(duration.as_millis() >= 15);
}
}