#[macro_export]
macro_rules! define_edge_type {
(
struct $name:ident $( ( $($visibility:vis $field_ty:ty),* $(,)? ) )?,
$entity:ident
$(, $($extra:tt)+),*
) => {
#[derive(Debug, PartialEq, Clone)]
pub struct $name $( ($($visibility $field_ty),*) )?;
$crate::impl_edge_type!($name, $entity $(, $($extra)+)*);
};
(
struct $name:ident { $($visibility:vis $field_name:ident : $field_ty:ty),* $(,)? },
$entity:ident
$(, $($extra:tt)+),*
) => {
#[derive(Copy, Debug, PartialEq)]
pub struct $name { $($visibility $field_name : $field_ty),* }
$crate::impl_edge_type!($name, $entity $(, $($extra)+)*);
};
(
enum $name:ident {
$($variant:ident),* $(,)?
},
$entity:ident
$(, $($extra:tt)+),*
) => {
#[derive(Copy, Debug, PartialEq)]
pub enum $name {
$($variant),*
}
$crate::impl_edge_type!($name, $entity $(, $($extra)+)*);
};
}
#[macro_export]
macro_rules! impl_edge_type {
(
$edge_type:ident,
$entity:ident $(,)?
) => {
impl $crate::network::edge::EdgeType<$entity> for $edge_type {
fn id() -> 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::network::edge::initialize_edge_type_id::<$entity>(&INDEX)
}
}
$crate::paste::paste! {
$crate::ctor::declarative::ctor!{
#[ctor]
fn [<_register_edge_type_ $edge_type:snake _for_ $entity:snake>]() {
$crate::network::edge::add_to_edge_type_to_registry::<$entity, $edge_type>();
}
}
}
};
}