relay_cogs/
measurement.rs1use crate::time::{Duration, Instant};
2
3pub struct Measurements {
8 start: Instant,
9 categorized: Vec<Measurement>,
10}
11
12impl Measurements {
13 pub fn start() -> Self {
15 Measurements {
16 start: Instant::now(),
17 categorized: Vec::new(),
18 }
19 }
20
21 pub fn add(&mut self, duration: Duration, category: &'static str) {
23 self.categorized.push(Measurement {
24 duration,
25 category: Some(category),
26 });
27 }
28
29 pub fn finish(&self) -> impl Iterator<Item = Measurement> + '_ {
32 let mut duration = self.start.elapsed();
33 for c in &self.categorized {
34 duration = duration.saturating_sub(c.duration);
35 }
36
37 std::iter::once(Measurement {
38 duration,
39 category: None,
40 })
41 .chain(self.categorized.iter().copied())
42 .filter(|m| !m.duration.is_zero())
43 }
44}
45
46#[derive(Copy, Clone)]
48pub struct Measurement {
49 pub duration: Duration,
51 pub category: Option<&'static str>,
53}