#![doc = include_str!("README.md")]
pub use stringleton_registry::{Registry, StaticSymbol, Symbol};
#[macro_export]
#[allow(clippy::crate_in_macro_def)]
macro_rules! sym {
($sym:ident) => {
$crate::sym!(@impl stringify!($sym))
};
($sym:literal) => {
$crate::sym!(@impl $sym)
};
(@impl $sym:expr) => {{
#[$crate::internal::linkme::distributed_slice(crate::_stringleton_enabled::TABLE)]
#[linkme(crate = $crate::internal::linkme)]
static SITE: $crate::internal::Site = $crate::internal::Site::new(&$sym);
unsafe {
SITE.get_after_ctor()
}}
}
}
#[macro_export]
#[allow(clippy::crate_in_macro_def)]
macro_rules! static_sym {
($sym:ident) => {
$crate::static_sym!(@impl stringify!($sym))
};
($sym:literal) => {
$crate::static_sym!(@impl $sym)
};
(@impl $sym:expr) => {{
unsafe {
$crate::StaticSymbol::new_unchecked({
fn _stringleton_static_symbol_call_site() -> &'static $crate::internal::Site {
#[$crate::internal::linkme::distributed_slice(crate::_stringleton_enabled::TABLE)]
#[linkme(crate = $crate::internal::linkme)]
static SITE: $crate::internal::Site = $crate::internal::Site::new(&$sym);
&SITE
}
_stringleton_static_symbol_call_site
})
}
}}
}
#[macro_export]
macro_rules! enable {
() => {
#[doc(hidden)]
pub(crate) mod _stringleton_enabled {
#[$crate::internal::linkme::distributed_slice]
#[linkme(crate = $crate::internal::linkme)]
#[doc(hidden)]
pub(crate) static TABLE: [$crate::internal::Site] = [..];
$crate::internal::ctor::declarative::ctor! {
#[ctor]
#[doc(hidden)]
pub fn _stringleton_register_symbols() {
unsafe {
$crate::internal::Registry::register_sites(&TABLE);
}
}
}
}
#[allow(unused)]
#[doc(hidden)]
pub use _stringleton_enabled::_stringleton_register_symbols;
};
($krate:path) => {
#[doc(hidden)]
pub(crate) use $krate::_stringleton_enabled;
};
}
#[doc(hidden)]
pub mod internal {
pub use ctor;
pub use linkme;
pub use stringleton_registry::Registry;
pub use stringleton_registry::Site;
}