#![doc(html_root_url = "https://docs.rs/ref_thread_local/0.1.1")]
#[doc(hidden)]
pub use std::ops::Deref as __Deref;
#[doc(hidden)]
pub mod refmanager;
#[doc(hidden)]
pub use self::refmanager::*;
pub use self::refmanager::{Ref, RefMut};
pub trait RefThreadLocal<T> {
fn initialize(&self) -> Result<(), ()>;
fn destroy(&self) -> Result<(), ()>;
fn is_initialized(&self) -> bool;
fn borrow<'a>(&self) -> Ref<'a, T>;
fn borrow_mut<'a>(&self) -> RefMut<'a, T>;
fn try_borrow<'a>(&self) -> Result<Ref<'a, T>, BorrowError>;
fn try_borrow_mut<'a>(&self) -> Result<RefMut<'a, T>, BorrowMutError>;
}
#[macro_export(local_inner_macros)]
#[doc(hidden)]
macro_rules! _ref_thread_local_internal {
($(#[$attr:meta])* ($($vis:tt)*) static $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
$crate::_ref_thread_local_internal!(@MAKE TY, $(#[$attr])*, ($($vis)*), $N);
$crate::_ref_thread_local_internal!(@TAIL, $N : $T = $e);
$crate::ref_thread_local!($($t)*);
};
(@TAIL, $N:ident : $T:ty = $e:expr) => {
impl $N {
fn get_refmanager(&self) -> $crate::RefManager<$T> {
fn init_value() -> $T { $e }
$crate::_create_refmanager_data!(GUARDED_REF_MANAGER_DATA, $T);
$crate::RefManager::new(&GUARDED_REF_MANAGER_DATA, init_value)
}
}
impl $crate::RefThreadLocal<$T> for $N {
fn initialize(&self) -> ::std::result::Result<(), ()> { self.get_refmanager().initialize() }
fn destroy(&self) -> ::std::result::Result<(), ()> { self.get_refmanager().destroy() }
fn is_initialized(&self) -> bool { self.get_refmanager().is_initialized() }
fn borrow<'_lifetime>(&self) -> $crate::Ref<'_lifetime, $T> { self.get_refmanager().borrow() }
fn borrow_mut<'_lifetime>(&self) -> $crate::RefMut<'_lifetime, $T> { self.get_refmanager().borrow_mut() }
fn try_borrow<'_lifetime>(&self) -> ::std::result::Result<$crate::Ref<'_lifetime, $T>, $crate::BorrowError> { self.get_refmanager().try_borrow() }
fn try_borrow_mut<'_lifetime>(&self) -> ::std::result::Result<$crate::RefMut<'_lifetime, $T>, $crate::BorrowMutError> { self.get_refmanager().try_borrow_mut() }
}
};
(@MAKE TY, $(#[$attr:meta])*, ($($vis:tt)*), $N:ident) => {
#[allow(missing_copy_implementations)]
#[allow(non_camel_case_types)]
#[allow(dead_code)]
$(#[$attr])*
$($vis)* struct $N { _private_field: () }
#[doc(hidden)]
$($vis)* static $N: $N = $N { _private_field: () };
};
() => ()
}
#[macro_export(local_inner_macros)]
macro_rules! ref_thread_local {
($(#[$attr:meta])* static managed $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
$crate::_ref_thread_local_internal!($(#[$attr])* () static $N : $T = $e; $($t)*);
};
($(#[$attr:meta])* pub static managed $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
$crate::_ref_thread_local_internal!($(#[$attr])* (pub) static $N : $T = $e; $($t)*);
};
($(#[$attr:meta])* pub ($($vis:tt)+) static managed $N:ident : $T:ty = $e:expr; $($t:tt)*) => {
$crate::_ref_thread_local_internal!($(#[$attr])* (pub ($($vis)+)) static $N : $T = $e; $($t)*);
};
() => ()
}