#![warn(rust_2018_idioms, unreachable_pub)]
use derive_more::Deref;
pub use self::{
likely::*,
rate_limiter::{RateLimit, RateLimiter},
};
mod likely;
mod rate_limiter;
pub mod time;
#[derive(Debug, Clone, Copy, Default, Hash, PartialEq, Eq, Deref)]
#[cfg_attr(any(target_arch = "x86_64", target_arch = "aarch64"), repr(align(128)))]
#[cfg_attr(
not(any(target_arch = "x86_64", target_arch = "aarch64")),
repr(align(64))
)]
pub struct CachePadded<T>(pub T);
#[macro_export]
macro_rules! ward {
($o:expr) => {
match $o {
Some(x) => x,
None => return,
}
};
($o:expr, else $body:block) => {
match $o {
Some(x) => x,
None => $body,
}
};
($o:expr, $early:stmt) => {
match $o {
Some(x) => x,
None => ({ $early }),
}
};
}
#[macro_export]
macro_rules! cooldown {
($period:expr) => {{
use ::std::{
sync::atomic::{AtomicU64, Ordering},
time::UNIX_EPOCH,
};
static LOGGED_TIME: AtomicU64 = AtomicU64::new(0);
let period = $period.as_nanos() as u64;
let res = LOGGED_TIME.fetch_update(Ordering::Relaxed, Ordering::Relaxed, |logged_time| {
let now = UNIX_EPOCH.elapsed().unwrap_or_default().as_nanos() as u64;
if logged_time + period <= now {
Some(now)
} else {
None
}
});
res.is_ok()
}};
($period:expr, $body:expr) => {{
#[deprecated(note = "use `if cooldown!(duration) { .. }` instead")]
fn deprecation() {}
if $crate::cooldown!($period) {
deprecation();
$body
}
}};
}