#[macro_export]
macro_rules! singleton {
($(#[$meta:meta])* $name:ident: $ty:ty = $expr:expr) => {
$crate::_export::critical_section::with(|_| {
$(#[$meta])*
static mut $name: (::core::mem::MaybeUninit<$ty>, bool) =
(::core::mem::MaybeUninit::uninit(), false);
#[allow(unsafe_code)]
let used = unsafe { $name.1 };
if used {
None
} else {
let expr = $expr;
#[allow(unsafe_code)]
unsafe {
$name.1 = true;
Some($name.0.write(expr))
}
}
})
};
($(#[$meta:meta])* : $ty:ty = $expr:expr) => {
$crate::singleton!($(#[$meta])* VAR: $ty = $expr)
};
}