#[macro_export]
macro_rules! once {
($expression:expr) => {{
use ::core::sync::atomic::{AtomicBool, Ordering};
static SHOULD_FIRE: AtomicBool = AtomicBool::new(true);
if SHOULD_FIRE.swap(false, Ordering::Relaxed) {
$expression;
}
}};
}
#[macro_export]
macro_rules! trace_once {
($($arg:tt)+) => ({
$crate::once!($crate::tracing::trace!($($arg)+))
});
}
#[macro_export]
macro_rules! debug_once {
($($arg:tt)+) => ({
$crate::once!($crate::tracing::debug!($($arg)+))
});
}
#[macro_export]
macro_rules! info_once {
($($arg:tt)+) => ({
$crate::once!($crate::tracing::info!($($arg)+))
});
}
#[macro_export]
macro_rules! warn_once {
($($arg:tt)+) => ({
$crate::once!($crate::tracing::warn!($($arg)+))
});
}
#[macro_export]
macro_rules! error_once {
($($arg:tt)+) => ({
$crate::once!($crate::tracing::error!($($arg)+))
});
}