summaryrefslogtreecommitdiff
path: root/engine-ecs/src/query.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine-ecs/src/query.rs')
-rw-r--r--engine-ecs/src/query.rs82
1 files changed, 27 insertions, 55 deletions
diff --git a/engine-ecs/src/query.rs b/engine-ecs/src/query.rs
index 16e7b99..1b7bf43 100644
--- a/engine-ecs/src/query.rs
+++ b/engine-ecs/src/query.rs
@@ -11,7 +11,7 @@ use crate::component::{
use crate::entity::Handle as EntityHandle;
use crate::query::flexible::{Iter as FlexibleQueryIter, Query as FlexibleQuery};
use crate::system::{Metadata as SystemMetadata, Param as SystemParam};
-use crate::uid::{Uid, With as WithUid};
+use crate::uid::Uid;
use crate::util::array_vec::ArrayVec;
use crate::util::Array;
use crate::World;
@@ -168,8 +168,8 @@ where
#[derive(Debug)]
pub struct Terms<const MAX_TERM_CNT: usize>
{
- required_components: ArrayVec<Uid, MAX_TERM_CNT>,
- excluded_components: ArrayVec<Uid, MAX_TERM_CNT>,
+ present: ArrayVec<Uid, MAX_TERM_CNT>,
+ absent: ArrayVec<Uid, MAX_TERM_CNT>,
}
impl<const MAX_TERM_CNT: usize> Terms<MAX_TERM_CNT>
@@ -184,20 +184,16 @@ impl<const MAX_TERM_CNT: usize> Terms<MAX_TERM_CNT>
#[must_use]
pub struct TermsBuilder<const MAX_TERM_CNT: usize>
{
- required_components: ArrayVec<Uid, MAX_TERM_CNT>,
- excluded_components: ArrayVec<Uid, MAX_TERM_CNT>,
+ present: ArrayVec<Uid, MAX_TERM_CNT>,
+ absent: ArrayVec<Uid, MAX_TERM_CNT>,
}
#[allow(clippy::return_self_not_must_use)]
pub trait TermsBuilderInterface
{
- fn with<WithUidT: WithUid>(self) -> Self;
+ fn present(self, ids: impl Array<Uid>) -> Self;
- fn without<WithUidT: WithUid>(self) -> Self;
-
- fn with_required(self, ids: impl Array<Uid>) -> Self;
-
- fn without_ids(self, ids: impl Array<Uid>) -> Self;
+ fn absent(self, ids: impl Array<Uid>) -> Self;
}
macro_rules! impl_terms_builder {
@@ -218,54 +214,30 @@ macro_rules! impl_terms_builder {
impl_terms_builder! {
#[allow(unused_mut)]
- fn with<WithUidT: WithUid>(mut self) -> Self
- {
- let insert_index = self.required_components
- .partition_point(|id| *id <= WithUidT::uid());
-
- self.required_components
- .insert(insert_index, WithUidT::uid());
-
- self
- }
-
- #[allow(unused_mut)]
- fn without<WithUidT: WithUid>(mut self) -> Self
- {
- let insert_index = self.excluded_components
- .partition_point(|id| *id <= WithUidT::uid());
-
- self.excluded_components
- .insert(insert_index, WithUidT::uid());
-
- self
- }
-
- #[allow(unused_mut)]
- fn with_required(mut self, mut ids: impl Array<Uid>) -> Self
+ fn present(mut self, mut ids: impl Array<Uid>) -> Self
{
if !ids.as_ref().is_sorted() {
ids.as_mut().sort();
}
- if self.required_components.is_empty() {
- self.required_components.extend(ids);
+ if self.present.is_empty() {
+ self.present.extend(ids);
return self;
}
let mut id_iter = ids.into_iter();
while let Some(id) = id_iter.next() {
- let insert_index = self.required_components
+ let insert_index = self.present
.partition_point(|other_id| *other_id <= id);
- if insert_index == self.required_components.len() {
- self.required_components.extend([id].into_iter().chain(id_iter));
+ if insert_index == self.present.len() {
+ self.present.extend([id].into_iter().chain(id_iter));
return self;
}
- self.required_components
+ self.present
.insert(insert_index, id);
}
@@ -274,30 +246,30 @@ impl_terms_builder! {
}
#[allow(unused_mut)]
- fn without_ids(mut self, mut ids: impl Array<Uid>) -> Self
+ fn absent(mut self, mut ids: impl Array<Uid>) -> Self
{
if !ids.as_ref().is_sorted() {
ids.as_mut().sort();
}
- if self.excluded_components.is_empty() {
- self.excluded_components.extend(ids);
+ if self.absent.is_empty() {
+ self.absent.extend(ids);
return self;
}
let mut id_iter = ids.into_iter();
while let Some(id) = id_iter.next() {
- let insert_index = self.excluded_components
+ let insert_index = self.absent
.partition_point(|other_id| *other_id <= id);
- if insert_index == self.excluded_components.len() {
- self.excluded_components.extend([id].into_iter().chain(id_iter));
+ if insert_index == self.absent.len() {
+ self.absent.extend([id].into_iter().chain(id_iter));
return self;
}
- self.excluded_components
+ self.absent
.insert(insert_index, id);
}
@@ -311,12 +283,12 @@ impl<const MAX_TERM_CNT: usize> TermsBuilder<MAX_TERM_CNT>
#[must_use]
pub fn build(self) -> Terms<MAX_TERM_CNT>
{
- debug_assert!(self.required_components.is_sorted());
- debug_assert!(self.excluded_components.is_sorted());
+ debug_assert!(self.present.is_sorted());
+ debug_assert!(self.absent.is_sorted());
Terms {
- required_components: self.required_components,
- excluded_components: self.excluded_components,
+ present: self.present,
+ absent: self.absent,
}
}
}
@@ -350,7 +322,7 @@ impl<ComponentT: Component> TermWithField for &ComponentT
terms_builder: &mut TermsBuilder<MAX_TERM_CNT>,
)
{
- terms_builder.with::<ComponentT>();
+ terms_builder.present([ComponentT::id()]);
}
fn get_field<'world>(
@@ -391,7 +363,7 @@ impl<ComponentT: Component> TermWithField for &mut ComponentT
terms_builder: &mut TermsBuilder<MAX_TERM_CNT>,
)
{
- terms_builder.with::<ComponentT>();
+ terms_builder.present([ComponentT::id()]);
}
fn get_field<'world>(