#[macro_export]
macro_rules! __define_data_plugin {
($data_plugin:ident, $data_container:ty, |$ctx:ident| $body:expr) => {
struct $data_plugin;
impl $crate::DataPlugin for $data_plugin {
type DataContainer = $data_container;
fn init<C: $crate::PluginContext>($ctx: &C) -> Self::DataContainer {
$body
}
fn index_within_context() -> usize {
static INDEX: std::sync::atomic::AtomicUsize =
std::sync::atomic::AtomicUsize::new(usize::MAX);
let index = INDEX.load(std::sync::atomic::Ordering::Relaxed);
if index != usize::MAX {
return index;
}
$crate::initialize_data_plugin_index(&INDEX)
}
}
$crate::paste::paste! {
$crate::ctor::declarative::ctor!{
#[ctor(unsafe)]
fn [<_register_plugin_$data_plugin:snake>]() {
$crate::add_data_plugin_to_registry::<$data_plugin>()
}
}
}
};
}
#[macro_export]
macro_rules! define_data_plugin {
($data_plugin:ident, $data_container:ty, |$ctx:ident| $body:expr) => {
$crate::__define_data_plugin!($data_plugin, $data_container, |$ctx| $body);
};
($data_plugin:ident, $data_container:ty, $default: expr) => {
$crate::__define_data_plugin!($data_plugin, $data_container, |_context| $default);
};
}