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}