diff options
Diffstat (limited to 'ecs/src/query/term.rs')
-rw-r--r-- | ecs/src/query/term.rs | 53 |
1 files changed, 45 insertions, 8 deletions
diff --git a/ecs/src/query/term.rs b/ecs/src/query/term.rs index 597dd1a..2e1ecca 100644 --- a/ecs/src/query/term.rs +++ b/ecs/src/query/term.rs @@ -1,7 +1,12 @@ use std::any::type_name; use std::marker::PhantomData; -use crate::component::{Component, HandleFromEntityComponentRef, Ref as ComponentRef}; +use crate::component::{ + Component, + Handle as ComponentHandle, + HandleFromEntityComponentRef, + HandleMut as ComponentHandleMut, +}; use crate::query::{ TermWithField, TermWithoutField, @@ -48,11 +53,43 @@ 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( + Some( + entity_handle + .get_matching_components(ComponentT::id()) + .next()?, + ), + world, + ) + .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,10 +103,10 @@ where ) -> Self::Field<'world> { Some( - ComponentRefT::Handle::<'world>::from_entity_component_ref( + ComponentHandleMut::<'world, ComponentT>::from_entity_component_ref( Some( entity_handle - .get_matching_components(ComponentRefT::Component::id()) + .get_matching_components(ComponentT::id()) .next()?, ), world, @@ -77,7 +114,7 @@ where .unwrap_or_else(|err| { panic!( "Creating handle to component {} failed: {err}", - type_name::<ComponentRefT::Component>() + type_name::<ComponentT>() ); }), ) |