#[macro_export]
macro_rules! map {
($key:ty, $val:ty) => {
{
use ::std::collections::HashMap;
let map: HashMap<$key, $val> = HashMap::new();
map
}
};
($($key: expr => $val:expr),*) => {
{
use ::std::collections::HashMap;
let mut map = HashMap::new();
$( map.insert($key, $val); )*;
map
}
};
}
#[macro_export]
macro_rules! cfor {
(($init:stmt;$cond:expr;$inc:stmt) $body:tt) => {
$init
while $cond {
$body
$inc
}
}
}
pub mod array;
pub mod bytes;
pub mod mem;
pub mod num;
pub mod path;
pub mod sparse_set;
pub mod timer;
#[cfg(feature = "logger")]
pub mod logger;
pub struct Defer<F: FnOnce()> {
callback: core::mem::ManuallyDrop<F>,
}
impl<F: FnOnce()> Defer<F> {
#[must_use = "Defers won't run unless assigned to a variable"]
pub const fn new(f: F) -> Self {
Self {
callback: core::mem::ManuallyDrop::new(f),
}
}
}
impl<F: FnOnce()> Drop for Defer<F> {
fn drop(&mut self) {
unsafe {
core::mem::ManuallyDrop::take(&mut self.callback)();
}
}
}
#[macro_export]
macro_rules! defer {
($func:expr) => {
$crate::Defer::new($func)
};
}
#[cfg(test)]
mod tests {
#[test]
fn defer_test() {
let _d1 = defer!(|| println!("This is defered"));
let _d2 = defer!(|| println!("Goodbye"));
fn funcptr() {
println!("Callback from a function pointer");
}
let _d3 = defer!(funcptr);
println!("Hey!");
}
}