arnaucube
arnaucube/testudoPublic Self-hosted repository
testudo/src/timer.rs
src/timer.rsRaw
 1#[cfg(feature = "profile")]
 2use colored::Colorize;
 3#[cfg(feature = "profile")]
 4use core::sync::atomic::AtomicUsize;
 5#[cfg(feature = "profile")]
 6use core::sync::atomic::Ordering;
 7#[cfg(feature = "profile")]
 8use std::time::Instant;
 9
10#[cfg(feature = "profile")]
11pub static CALL_DEPTH: AtomicUsize = AtomicUsize::new(0);
12
13#[cfg(feature = "profile")]
14pub struct Timer {
15  label: String,
16  timer: Instant,
17}
18
19#[cfg(feature = "profile")]
20impl Timer {
21  #[inline(always)]
22  pub fn new(label: &str) -> Self {
23    let timer = Instant::now();
24    CALL_DEPTH.fetch_add(1, Ordering::Relaxed);
25    let star = "* ";
26    println!(
27      "{:indent$}{}{}",
28      "",
29      star,
30      label.yellow().bold(),
31      indent = 2 * CALL_DEPTH.fetch_add(0, Ordering::Relaxed)
32    );
33    Self {
34      label: label.to_string(),
35      timer,
36    }
37  }
38
39  #[inline(always)]
40  pub fn stop(&self) {
41    let duration = self.timer.elapsed();
42    let star = "* ";
43    println!(
44      "{:indent$}{}{} {:?}",
45      "",
46      star,
47      self.label.blue().bold(),
48      duration,
49      indent = 2 * CALL_DEPTH.fetch_add(0, Ordering::Relaxed)
50    );
51    CALL_DEPTH.fetch_sub(1, Ordering::Relaxed);
52  }
53
54  #[inline(always)]
55  pub fn print(msg: &str) {
56    CALL_DEPTH.fetch_add(1, Ordering::Relaxed);
57    let star = "* ";
58    println!(
59      "{:indent$}{}{}",
60      "",
61      star,
62      msg.to_string().green().bold(),
63      indent = 2 * CALL_DEPTH.fetch_add(0, Ordering::Relaxed)
64    );
65    CALL_DEPTH.fetch_sub(1, Ordering::Relaxed);
66  }
67}
68
69#[cfg(not(feature = "profile"))]
70pub struct Timer {
71  _label: String,
72}
73
74#[cfg(not(feature = "profile"))]
75impl Timer {
76  #[inline(always)]
77  pub fn new(label: &str) -> Self {
78    Self {
79      _label: label.to_string(),
80    }
81  }
82
83  #[inline(always)]
84  pub fn stop(&self) {}
85
86  #[inline(always)]
87  pub fn print(_msg: &str) {}
88}