salva3d/counters/
timer.rs

1use std::fmt::{Display, Error, Formatter};
2
3/// A timer.
4#[derive(Copy, Clone, Debug, Default)]
5pub struct Timer {
6    enabled: bool,
7    time: f64,
8    start: Option<f64>,
9}
10
11impl Timer {
12    /// Creates a new timer initialized to zero and not started.
13    pub fn new() -> Self {
14        Timer {
15            enabled: false,
16            time: 0.0,
17            start: None,
18        }
19    }
20
21    /// Enables this timer.
22    pub fn enable(&mut self) {
23        self.enabled = true;
24    }
25
26    /// Disables this timer.
27    pub fn disable(&mut self) {
28        self.enabled = false;
29    }
30
31    /// Resets the timer to 0.
32    pub fn reset(&mut self) {
33        self.time = 0.0
34    }
35
36    /// Start the timer.
37    pub fn start(&mut self) {
38        if self.enabled {
39            self.time = 0.0;
40            self.start = Some(instant::now());
41        }
42    }
43
44    /// Pause the timer.
45    pub fn pause(&mut self) {
46        if self.enabled {
47            if let Some(start) = self.start {
48                self.time += instant::now() - start;
49            }
50            self.start = None;
51        }
52    }
53
54    /// Resume the timer.
55    pub fn resume(&mut self) {
56        if self.enabled {
57            self.start = Some(instant::now());
58        }
59    }
60
61    /// The measured time between the last `.start()` and `.pause()` calls.
62    pub fn time(&self) -> f64 {
63        self.time
64    }
65}
66
67impl Display for Timer {
68    fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
69        write!(f, "{}s", self.time)
70    }
71}