summaryrefslogtreecommitdiff
path: root/ecs/src/query
diff options
context:
space:
mode:
Diffstat (limited to 'ecs/src/query')
-rw-r--r--ecs/src/query/flexible.rs92
-rw-r--r--ecs/src/query/term.rs116
2 files changed, 0 insertions, 208 deletions
diff --git a/ecs/src/query/flexible.rs b/ecs/src/query/flexible.rs
deleted file mode 100644
index 936ab82..0000000
--- a/ecs/src/query/flexible.rs
+++ /dev/null
@@ -1,92 +0,0 @@
-//! Low-level querying.
-use std::iter::{repeat_n, FlatMap, RepeatN, Zip};
-
-use crate::component::storage::archetype::{Archetype, EntityIter};
-use crate::component::storage::{ArchetypeRefIter, ArchetypeSearchTerms};
-use crate::entity::Handle as EntityHandle;
-use crate::query::Terms;
-use crate::World;
-
-/// Low-level entity query structure.
-#[derive(Debug)]
-pub struct Query<'world, const MAX_TERM_CNT: usize>
-{
- world: &'world World,
- terms: Terms<MAX_TERM_CNT>,
-}
-
-impl<'world, const MAX_TERM_CNT: usize> Query<'world, MAX_TERM_CNT>
-{
- /// Iterates over the entities matching this query.
- #[must_use]
- pub fn iter(&self) -> Iter<'_>
- {
- Iter {
- iter: self
- .world
- .data
- .component_storage
- .search_archetypes(ArchetypeSearchTerms {
- required_components: &self.terms.required_components,
- excluded_components: &self.terms.excluded_components,
- })
- .flat_map(
- (|archetype| {
- repeat_n(archetype, archetype.entity_cnt())
- .zip(archetype.entities())
- }) as ComponentIterMapFn,
- ),
- world: self.world,
- }
- }
-
- #[must_use]
- pub fn world(&self) -> &'world World
- {
- self.world
- }
-
- pub(crate) fn new(world: &'world World, terms: Terms<MAX_TERM_CNT>) -> Self
- {
- Self { world, terms }
- }
-}
-
-impl<'query, const MAX_TERM_CNT: usize> IntoIterator for &'query Query<'_, MAX_TERM_CNT>
-{
- type IntoIter = Iter<'query>;
- type Item = EntityHandle<'query>;
-
- fn into_iter(self) -> Self::IntoIter
- {
- self.iter()
- }
-}
-
-pub struct Iter<'query>
-{
- iter: QueryEntityIter<'query>,
- world: &'query World,
-}
-
-impl<'query> Iterator for Iter<'query>
-{
- type Item = EntityHandle<'query>;
-
- fn next(&mut self) -> Option<Self::Item>
- {
- let (archetype, entity) = self.iter.next()?;
-
- Some(EntityHandle::new(archetype, entity, self.world))
- }
-}
-
-type ComponentIterMapFnOutput<'a> = Zip<RepeatN<&'a Archetype>, EntityIter<'a>>;
-
-type ComponentIterMapFn = for<'a> fn(&'a Archetype) -> ComponentIterMapFnOutput<'a>;
-
-type QueryEntityIter<'query> = FlatMap<
- ArchetypeRefIter<'query, 'query>,
- ComponentIterMapFnOutput<'query>,
- ComponentIterMapFn,
->;
diff --git a/ecs/src/query/term.rs b/ecs/src/query/term.rs
deleted file mode 100644
index 0683918..0000000
--- a/ecs/src/query/term.rs
+++ /dev/null
@@ -1,116 +0,0 @@
-use std::any::type_name;
-use std::marker::PhantomData;
-
-use crate::component::{
- Component,
- Handle as ComponentHandle,
- HandleMut as ComponentHandleMut,
-};
-use crate::query::{
- TermWithField,
- TermWithoutField,
- TermsBuilder,
- TermsBuilderInterface,
-};
-use crate::uid::With as WithUid;
-
-pub struct With<WithUidT>
-where
- WithUidT: WithUid,
-{
- _pd: PhantomData<WithUidT>,
-}
-
-impl<WithUidT> TermWithoutField for With<WithUidT>
-where
- WithUidT: WithUid,
-{
- fn apply_to_terms_builder<const MAX_TERM_CNT: usize>(
- terms_builder: &mut TermsBuilder<MAX_TERM_CNT>,
- )
- {
- terms_builder.with::<WithUidT>();
- }
-}
-
-pub struct Without<WithUidT>
-where
- WithUidT: WithUid,
-{
- _pd: PhantomData<WithUidT>,
-}
-
-impl<WithUidT> TermWithoutField for Without<WithUidT>
-where
- WithUidT: WithUid,
-{
- fn apply_to_terms_builder<const MAX_TERM_CNT: usize>(
- terms_builder: &mut TermsBuilder<MAX_TERM_CNT>,
- )
- {
- terms_builder.without::<WithUidT>();
- }
-}
-
-impl<ComponentT: Component> TermWithField for Option<&ComponentT>
-{
- type Field<'a> = Option<ComponentHandle<'a, ComponentT>>;
-
- fn apply_to_terms_builder<const MAX_TERM_CNT: usize>(
- _terms_builder: &mut TermsBuilder<MAX_TERM_CNT>,
- )
- {
- }
-
- fn get_field<'world>(
- entity_handle: &crate::entity::Handle<'world>,
- _world: &'world crate::World,
- ) -> Self::Field<'world>
- {
- Some(
- ComponentHandle::<'world, ComponentT>::from_entity_component_ref(
- &entity_handle
- .get_matching_components(ComponentT::id())
- .next()?,
- )
- .unwrap_or_else(|err| {
- panic!(
- "Creating handle to component {} failed: {err}",
- type_name::<ComponentT>()
- );
- }),
- )
- }
-}
-
-impl<ComponentT: Component> TermWithField for Option<&mut ComponentT>
-{
- type Field<'a> = Option<ComponentHandleMut<'a, ComponentT>>;
-
- fn apply_to_terms_builder<const MAX_TERM_CNT: usize>(
- _terms_builder: &mut TermsBuilder<MAX_TERM_CNT>,
- )
- {
- }
-
- fn get_field<'world>(
- entity_handle: &crate::entity::Handle<'world>,
- world: &'world crate::World,
- ) -> Self::Field<'world>
- {
- Some(
- ComponentHandleMut::<'world, ComponentT>::from_entity_component_ref(
- &entity_handle
- .get_matching_components(ComponentT::id())
- .next()?,
- world,
- )
- .unwrap_or_else(|err| {
- panic!(
- "Creating handle to component {} failed: {err}",
- type_name::<ComponentT>()
- );
- }),
- )
- }
-}