#[macro_export]
macro_rules! define_entity {
($entity_name:ident) => {
#[allow(unused)]
#[derive(Default, Debug, PartialEq, Eq, Clone, Copy)]
pub struct $entity_name;
impl $entity_name {
#[allow(unused)]
pub fn new() -> Self {
<Self as std::default::Default>::default()
}
}
$crate::impl_entity!($entity_name);
};
}
#[macro_export]
macro_rules! impl_entity {
($entity_name:ident) => {
$crate::paste::paste! {
#[allow(unused)]
pub type [<$entity_name Id>] = $crate::entity::EntityId<$entity_name>;
}
impl $crate::entity::Entity for $entity_name {
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::entity::entity_store::initialize_entity_index(&INDEX)
}
fn as_any(&self) -> &dyn std::any::Any {
self
}
fn as_any_mut(&mut self) -> &mut dyn std::any::Any {
self
}
}
$crate::paste::paste! {
$crate::ctor::declarative::ctor!{
#[ctor]
fn [<_register_entity_$entity_name:snake>]() {
$crate::entity::entity_store::add_to_entity_registry::<$entity_name>();
}
}
}
};
}