diff options
Diffstat (limited to 'ecs/src/query/options.rs')
-rw-r--r-- | ecs/src/query/options.rs | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/ecs/src/query/options.rs b/ecs/src/query/options.rs new file mode 100644 index 0000000..d895073 --- /dev/null +++ b/ecs/src/query/options.rs @@ -0,0 +1,66 @@ +use std::collections::HashSet; +use std::marker::PhantomData; + +use crate::component::{Component, Id as ComponentId}; +use crate::EntityComponent; + +/// Query options. +pub trait Options +{ + fn entity_filter<'component>( + components: impl IntoIterator<Item = &'component EntityComponent>, + ) -> bool; +} + +impl Options for () +{ + fn entity_filter<'component>( + _: impl IntoIterator<Item = &'component EntityComponent>, + ) -> bool + { + true + } +} + +pub struct With<ComponentT> +where + ComponentT: Component, +{ + _pd: PhantomData<ComponentT>, +} + +impl<ComponentT> Options for With<ComponentT> +where + ComponentT: Component, +{ + fn entity_filter<'component>( + components: impl IntoIterator<Item = &'component EntityComponent>, + ) -> bool + { + let ids_set = components + .into_iter() + .map(|component| component.id) + .collect::<HashSet<_>>(); + + ids_set.contains(&ComponentId::of::<ComponentT>()) + } +} + +pub struct Not<OptionsT> +where + OptionsT: Options, +{ + _pd: PhantomData<OptionsT>, +} + +impl<OptionsT> Options for Not<OptionsT> +where + OptionsT: Options, +{ + fn entity_filter<'component>( + components: impl IntoIterator<Item = &'component EntityComponent>, + ) -> bool + { + !OptionsT::entity_filter(components) + } +} |