summaryrefslogtreecommitdiff
path: root/ecs/src/query/term.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ecs/src/query/term.rs')
-rw-r--r--ecs/src/query/term.rs55
1 files changed, 43 insertions, 12 deletions
diff --git a/ecs/src/query/term.rs b/ecs/src/query/term.rs
index 597dd1a..0683918 100644
--- a/ecs/src/query/term.rs
+++ b/ecs/src/query/term.rs
@@ -1,7 +1,11 @@
use std::any::type_name;
use std::marker::PhantomData;
-use crate::component::{Component, HandleFromEntityComponentRef, Ref as ComponentRef};
+use crate::component::{
+ Component,
+ Handle as ComponentHandle,
+ HandleMut as ComponentHandleMut,
+};
use crate::query::{
TermWithField,
TermWithoutField,
@@ -48,11 +52,40 @@ where
}
}
-impl<ComponentRefT> TermWithField for Option<ComponentRefT>
-where
- ComponentRefT: ComponentRef,
+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<ComponentRefT::Handle<'a>>;
+ type Field<'a> = Option<ComponentHandleMut<'a, ComponentT>>;
fn apply_to_terms_builder<const MAX_TERM_CNT: usize>(
_terms_builder: &mut TermsBuilder<MAX_TERM_CNT>,
@@ -66,18 +99,16 @@ where
) -> Self::Field<'world>
{
Some(
- ComponentRefT::Handle::<'world>::from_entity_component_ref(
- Some(
- entity_handle
- .get_matching_components(ComponentRefT::Component::id())
- .next()?,
- ),
+ 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::<ComponentRefT::Component>()
+ type_name::<ComponentT>()
);
}),
)