#[macro_export]
macro_rules! meta_register_vector_type {
($world:expr, $struct_type:ident { $($name:ident : $value:expr),* $(,)? }) => {
let id = id!($world, Vec<$struct_type>);
$world
.component_ext::<Vec<$struct_type>>(id)
.opaque_func_id::<_, $struct_type>(id, meta_register_vector_func!($struct_type { $($name: $value),* }));
};
($world:expr, $struct_type:ident :: $constructor:ident ( $($args:expr),* $(,)? )) => {
let id = id!($world, Vec<$struct_type>);
$world
.component_ext::<Vec<$struct_type>>(id)
.opaque_func_id::<_, $struct_type>(id, meta_register_vector_func!($struct_type::$constructor($($args),*)));
};
}
#[macro_export]
macro_rules! meta_register_vector_func {
($struct_type:ident { $($name:ident : $value:expr),* $(,)? }) => {
|world: flecs_ecs::core::WorldRef| -> flecs_ecs::addons::meta::Opaque<Vec<$struct_type>, $struct_type> {
let mut ts = flecs_ecs::addons::meta::Opaque::<Vec<$struct_type>, $struct_type>::new(world);
let id = id!(world, $struct_type);
ts.as_type(world.vector_id(id));
ts.serialize(|s: &flecs_ecs::addons::meta::Serializer, data: &Vec<$struct_type>| {
let world = unsafe { WorldRef::from_ptr(s.world as *mut flecs_ecs::sys::ecs_world_t) };
let id = id!(world, $struct_type);
for el in data.iter() {
unsafe { s.value_id(id, el as *const $struct_type as *const core::ffi::c_void); }
}
0
});
ts.count(|data: &mut Vec<$struct_type>| data.len());
fn ensure_element(data: &mut Vec<$struct_type>, elem: usize) -> &mut $struct_type {
if data.len() <= elem {
data.resize_with(elem + 1, || $struct_type { $($name: $value),* });
}
&mut data[elem]
}
fn resize_vec(data: &mut Vec<$struct_type>, elem: usize) {
data.resize_with(elem + 1, || $struct_type { $($name : $value),* });
}
ts.ensure_element(ensure_element);
ts.resize(resize_vec);
ts
}
};
($struct_type:ident :: $constructor:ident ( $($args:expr),* $(,)? )) => {
|world: flecs_ecs::core::WorldRef| -> flecs_ecs::addons::meta::Opaque<Vec<$struct_type>, $struct_type> {
let mut ts = flecs_ecs::addons::meta::Opaque::<Vec<$struct_type>, $struct_type>::new(world);
let id = id!(world, $struct_type);
ts.as_type(world.vector_id(id));
ts.serialize(|s: &flecs_ecs::addons::meta::Serializer, data: &Vec<$struct_type>| {
let world = unsafe { WorldRef::from_ptr(s.world as *mut flecs_ecs::sys::ecs_world_t) };
let id = id!(world, $struct_type);
for el in data.iter() {
unsafe { s.value_id(id, el as *const $struct_type as *const core::ffi::c_void); }
}
0
});
ts.count(|data: &mut Vec<$struct_type>| data.len());
fn ensure_element(data: &mut Vec<$struct_type>, elem: usize) -> &mut $struct_type {
if data.len() <= elem {
data.resize_with(elem + 1, || $struct_type::$constructor($($args),*));
}
&mut data[elem]
}
fn resize_vec(data: &mut Vec<$struct_type>, elem: usize) {
data.resize_with(elem + 1, || $struct_type::$constructor($($args),*));
}
ts.ensure_element(ensure_element);
ts.resize(resize_vec);
ts
}
};
}
pub use meta_register_vector_func;
pub use meta_register_vector_type;