#[macro_export]
macro_rules! task_local {
() => {};
($(#[$attr:meta])* $vis:vis static const $name:ident: $t:ty; $($rest:tt)*) => (
$crate::__task_local_inner_immutable!($(#[$attr])* $vis $name, $t);
$crate::task_local!($($rest)*);
);
($(#[$attr:meta])* $vis:vis static const $name:ident: $t:ty) => (
$crate::__task_local_inner_immutable!($(#[$attr])* $vis $name, $t);
);
($(#[$attr:meta])* $vis:vis static $name:ident: $t:ty; $($rest:tt)*) => (
$crate::__task_local_inner!($(#[$attr])* $vis $name, $t);
$crate::task_local!($($rest)*);
);
($(#[$attr:meta])* $vis:vis static $name:ident: $t:ty) => (
$crate::__task_local_inner!($(#[$attr])* $vis $name, $t);
);
}
#[doc(hidden)]
#[macro_export]
macro_rules! __task_local_inner {
($(#[$attr:meta])* $vis:vis $name:ident, $t:ty) => {
$(#[$attr])*
$vis static $name: $crate::context::LocalKey<$t> = {
std::thread_local! {
static __KEY: std::cell::RefCell<Option<$t>> = const { std::cell::RefCell::new(None) };
}
$crate::context::LocalKey::new(__KEY)
};
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __task_local_inner_immutable {
($(#[$attr:meta])* $vis:vis $name:ident, $t:ty) => {
$(#[$attr])*
$vis static $name: $crate::context::LocalKeyImmutable<$t> = {
std::thread_local! {
static __KEY: std::cell::RefCell<Option<$t>> = const { std::cell::RefCell::new(None) };
}
$crate::context::LocalKeyImmutable::new(__KEY)
};
};
}
#[cfg(test)]
mod tests {
#[cfg_attr(not(target_arch = "wasm32"), test)]
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
fn local() {
task_local! {
#[allow(unused)]
static FOO: u32;
#[allow(unused)]
static const BAR: u32;
}
}
}