#[cfg(feature = "profile")] use colored::Colorize; #[cfg(feature = "profile")] use core::sync::atomic::AtomicUsize; #[cfg(feature = "profile")] use core::sync::atomic::Ordering; #[cfg(feature = "profile")] use std::time::Instant; #[cfg(feature = "profile")] pub static CALL_DEPTH: AtomicUsize = AtomicUsize::new(0); #[cfg(feature = "profile")] pub struct Timer { label: String, timer: Instant, } #[cfg(feature = "profile")] impl Timer { #[inline(always)] pub fn new(label: &str) -> Self { let timer = Instant::now(); CALL_DEPTH.fetch_add(1, Ordering::Relaxed); let star = "* "; println!( "{:indent$}{}{}", "", star, label.yellow().bold(), indent = 2 * CALL_DEPTH.fetch_add(0, Ordering::Relaxed) ); Self { label: label.to_string(), timer, } } #[inline(always)] pub fn stop(&self) { let duration = self.timer.elapsed(); let star = "* "; println!( "{:indent$}{}{} {:?}", "", star, self.label.blue().bold(), duration, indent = 2 * CALL_DEPTH.fetch_add(0, Ordering::Relaxed) ); CALL_DEPTH.fetch_sub(1, Ordering::Relaxed); } #[inline(always)] pub fn print(msg: &str) { CALL_DEPTH.fetch_add(1, Ordering::Relaxed); let star = "* "; println!( "{:indent$}{}{}", "", star, msg.to_string().green().bold(), indent = 2 * CALL_DEPTH.fetch_add(0, Ordering::Relaxed) ); CALL_DEPTH.fetch_sub(1, Ordering::Relaxed); } } #[cfg(not(feature = "profile"))] pub struct Timer { _label: String, } #[cfg(not(feature = "profile"))] impl Timer { #[inline(always)] pub fn new(label: &str) -> Self { Self { _label: label.to_string(), } } #[inline(always)] pub fn stop(&self) {} #[inline(always)] pub fn print(_msg: &str) {} }