#![no_std]
#![doc = include_str!("../README.md")]
#[macro_export]
macro_rules! slazy {
(pub $name:ident: $type:ty = $val:expr; $($rest:tt)*) => {
pub struct $name;
$crate::__internal_inner_slazy!($name, $type, $val);
slazy!($($rest)*);
};
($name:ident: $type:ty = $val:expr; $($rest:tt)*) => {
struct $name;
$crate::__internal_inner_slazy!($name, $type, $val);
slazy!($($rest)*);
};
(pub $name:ident: $type:ty = $val:expr) => {
pub struct $name;
$crate::__internal_inner_slazy!($name, $type, $val);
};
($name:ident: $type:ty = $val:expr) => {
struct $name;
$crate::__internal_inner_slazy!($name, $type, $val);
};
() => {};
}
#[macro_export]
#[doc(hidden)]
macro_rules! __internal_inner_slazy {
($name:ident, $type:ty, $val:expr) => {
impl ::core::ops::Deref for $name {
type Target = $type;
#[inline(always)]
fn deref(&self) -> &'static Self::Target {
static mut VAL: Option<$type> = None;
unsafe { VAL.get_or_insert_with(|| $val) }
}
}
};
}
#[macro_export]
macro_rules! init {
($($lazy:ident)*) => {
$(
_ = *$lazy;
)*
};
}