diff --git a/zero_ecs_macros/src/system_for_each_impl.rs b/zero_ecs_macros/src/system_for_each_impl.rs index 70de77c..ab6fb8b 100644 --- a/zero_ecs_macros/src/system_for_each_impl.rs +++ b/zero_ecs_macros/src/system_for_each_impl.rs @@ -8,10 +8,12 @@ use crate::query_impl::get_collection_component_fields; pub fn system_for_each(attr: TokenStream, item: TokenStream) -> TokenStream { let foreign_struct = syn::parse_macro_input!(attr as ItemStruct); let collection_component_fields = get_collection_component_fields(foreign_struct); - let component_types: HashSet<_> = collection_component_fields + let mut component_types: HashSet<_> = collection_component_fields .iter() .map(|ccf| &ccf.field_type) .collect(); + let entity_name = "Entity".to_string(); + component_types.insert(&entity_name); let input_fn = syn::parse_macro_input!(item as ItemFn); let fn_vis = &input_fn.vis; diff --git a/zero_ecs_testbed/src/integration_tests/test_simple.rs b/zero_ecs_testbed/src/integration_tests/test_simple.rs index 06562be..2ce9d74 100644 --- a/zero_ecs_testbed/src/integration_tests/test_simple.rs +++ b/zero_ecs_testbed/src/integration_tests/test_simple.rs @@ -1,3 +1,5 @@ +use std::collections::HashSet; + use zero_ecs::*; pub struct Value(usize); @@ -76,3 +78,41 @@ fn can_make_mutable_query() { world.assert_value_for(0, b); world.assert_value_for(0, d); } + +struct ToDestroy(HashSet); + +#[system_for_each(World)] +pub fn destroy_even_values(entity: &Entity, value: &Value, to_destroy: &mut ToDestroy) { + if value.0 % 2 == 0 { + to_destroy.0.insert(*entity); + } +} + +struct Sum(usize); + +#[system_for_each(World)] +pub fn sum_values(value: &Value, sum: &mut Sum) { + sum.0 += value.0; +} + +#[test] +fn can_destroy_specific() { + let mut world = World::default(); + let _ = world.create(ValueEntity { value: Value(0) }); + let _ = world.create(ValueEntity { value: Value(1) }); + let _ = world.create(ValueEntity { value: Value(2) }); + let _ = world.create(ValueEntity { value: Value(3) }); + let _ = world.create(ValueEntity { value: Value(4) }); + let mut to_destroy = ToDestroy(HashSet::new()); + world.destroy_even_values(&mut to_destroy); + + to_destroy.0.iter().for_each(|entity| { + world.destroy(*entity); + }); + + // 1+3 is 4 + let mut sum = Sum(0); + world.sum_values(&mut sum); + + assert_eq!(4, sum.0); +}