pub use std::fmt;
pub use std::ops::Deref;
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Token {
_private: (),
}
impl Token {
#[inline(always)]
pub unsafe fn new() -> Self {
Self { _private: () }
}
}
pub unsafe trait TokenWrapper {
unsafe fn new() -> Self;
}
#[doc(hidden)]
#[macro_export]
macro_rules! token {
{
$( #[doc = $($token_doc:tt)*] )*
$token_vis:vis token $token_name:ident
by $static_mod:ident($static_name:ident : $static_type:ty);
} => {
$( #[doc = $($token_doc)*] )*
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
$token_vis struct $token_name { _token: $crate::token::Token }
impl $crate::token::fmt::Debug for $token_name {
fn fmt(&self, f: &mut $crate::token::fmt::Formatter<'_>) -> $crate::token::fmt::Result {
f.debug_struct(stringify!($token_name)).finish_non_exhaustive()
}
}
#[allow(unsafe_code)]
unsafe impl $crate::token::TokenWrapper for $token_name {
#[inline(always)]
unsafe fn new() -> Self {
#[allow(unused_unsafe)]
Self {
_token: unsafe { $crate::token::Token::new() },
}
}
}
impl $token_name {
#[inline(always)]
pub fn static_ref(_this: Self) -> &'static $static_type {
#[allow(unsafe_code)]
unsafe { $crate::$static_mod::Static::get_value(&$static_name) }
}
}
impl $crate::token::Deref for $token_name {
type Target = $static_type;
#[inline(always)]
fn deref(&self) -> &Self::Target { Self::static_ref(*self) }
}
};
}