From e528b63e11f81f7002cc723e9d829063ee0e7df1 Mon Sep 17 00:00:00 2001 From: Boxy Date: Mon, 30 May 2022 16:41:32 +0000 Subject: [PATCH] merge `matches_archetype` and `matches_table` (#4807) # Objective the code in these fns are always identical so stop having two functions ## Solution make them the same function --- ## Changelog change `matches_archetype` and `matches_table` to `fn matches_component_set(&self, &SparseArray) -> bool` then do extremely boring updating of all `FetchState` impls ## Migration Guide - move logic of `matches_archetype` and `matches_table` into `matches_component_set` in any manual `FetchState` impls --- crates/bevy_ecs/macros/src/fetch.rs | 7 +-- crates/bevy_ecs/src/query/fetch.rs | 80 ++++++++++------------------- crates/bevy_ecs/src/query/filter.rs | 38 ++++---------- crates/bevy_ecs/src/query/state.rs | 8 ++- 4 files changed, 45 insertions(+), 88 deletions(-) diff --git a/crates/bevy_ecs/macros/src/fetch.rs b/crates/bevy_ecs/macros/src/fetch.rs index f7d0433306e5b..50adea5691e2e 100644 --- a/crates/bevy_ecs/macros/src/fetch.rs +++ b/crates/bevy_ecs/macros/src/fetch.rs @@ -279,12 +279,9 @@ pub fn derive_world_query_impl(ast: DeriveInput) -> TokenStream { #(self.#field_idents.update_archetype_component_access(_archetype, _access);)* } - fn matches_archetype(&self, _archetype: &#path::archetype::Archetype) -> bool { - true #(&& self.#field_idents.matches_archetype(_archetype))* - } + fn matches_component_set(&self, _set_contains_id: &impl Fn(#path::component::ComponentId) -> bool) -> bool { + true #(&& self.#field_idents.matches_component_set(_set_contains_id))* - fn matches_table(&self, _table: &#path::storage::Table) -> bool { - true #(&& self.#field_idents.matches_table(_table))* } } }; diff --git a/crates/bevy_ecs/src/query/fetch.rs b/crates/bevy_ecs/src/query/fetch.rs index ff2a629277502..fafd634f8a464 100644 --- a/crates/bevy_ecs/src/query/fetch.rs +++ b/crates/bevy_ecs/src/query/fetch.rs @@ -421,7 +421,7 @@ pub trait Fetch<'world>: Sized { /// /// Implementor must ensure that [`FetchState::update_component_access`] and /// [`FetchState::update_archetype_component_access`] exactly reflects the results of -/// [`FetchState::matches_archetype`], [`FetchState::matches_table`], [`Fetch::archetype_fetch`], and +/// [`FetchState::matches_component_set`], [`Fetch::archetype_fetch`], and /// [`Fetch::table_fetch`]. pub unsafe trait FetchState: Send + Sync + Sized { fn init(world: &mut World) -> Self; @@ -431,8 +431,7 @@ pub unsafe trait FetchState: Send + Sync + Sized { archetype: &Archetype, access: &mut Access, ); - fn matches_archetype(&self, archetype: &Archetype) -> bool; - fn matches_table(&self, table: &Table) -> bool; + fn matches_component_set(&self, set_contains_id: &impl Fn(ComponentId) -> bool) -> bool; } /// A fetch that is read only. @@ -480,12 +479,7 @@ unsafe impl FetchState for EntityState { } #[inline] - fn matches_archetype(&self, _archetype: &Archetype) -> bool { - true - } - - #[inline] - fn matches_table(&self, _table: &Table) -> bool { + fn matches_component_set(&self, _set_contains_id: &impl Fn(ComponentId) -> bool) -> bool { true } } @@ -588,12 +582,8 @@ unsafe impl FetchState for ReadState { } } - fn matches_archetype(&self, archetype: &Archetype) -> bool { - archetype.contains(self.component_id) - } - - fn matches_table(&self, table: &Table) -> bool { - table.has_column(self.component_id) + fn matches_component_set(&self, set_contains_id: &impl Fn(ComponentId) -> bool) -> bool { + set_contains_id(self.component_id) } } @@ -825,12 +815,8 @@ unsafe impl FetchState for WriteState { } } - fn matches_archetype(&self, archetype: &Archetype) -> bool { - archetype.contains(self.component_id) - } - - fn matches_table(&self, table: &Table) -> bool { - table.has_column(self.component_id) + fn matches_component_set(&self, set_contains_id: &impl Fn(ComponentId) -> bool) -> bool { + set_contains_id(self.component_id) } } @@ -1105,17 +1091,16 @@ unsafe impl FetchState for OptionState { archetype: &Archetype, access: &mut Access, ) { - if self.state.matches_archetype(archetype) { + if self + .state + .matches_component_set(&|id| archetype.contains(id)) + { self.state .update_archetype_component_access(archetype, access); } } - fn matches_archetype(&self, _archetype: &Archetype) -> bool { - true - } - - fn matches_table(&self, _table: &Table) -> bool { + fn matches_component_set(&self, _set_contains_id: &impl Fn(ComponentId) -> bool) -> bool { true } } @@ -1153,7 +1138,9 @@ impl<'w, T: Fetch<'w>> Fetch<'w> for OptionFetch { archetype: &'w Archetype, tables: &'w Tables, ) { - self.matches = state.state.matches_archetype(archetype); + self.matches = state + .state + .matches_component_set(&|id| archetype.contains(id)); if self.matches { self.fetch.set_archetype(&state.state, archetype, tables); } @@ -1161,7 +1148,9 @@ impl<'w, T: Fetch<'w>> Fetch<'w> for OptionFetch { #[inline] unsafe fn set_table(&mut self, state: &Self::State, table: &'w Table) { - self.matches = state.state.matches_table(table); + self.matches = state + .state + .matches_component_set(&|id| table.has_column(id)); if self.matches { self.fetch.set_table(&state.state, table); } @@ -1297,12 +1286,8 @@ unsafe impl FetchState for ChangeTrackersState { } } - fn matches_archetype(&self, archetype: &Archetype) -> bool { - archetype.contains(self.component_id) - } - - fn matches_table(&self, table: &Table) -> bool { - table.has_column(self.component_id) + fn matches_component_set(&self, set_contains_id: &impl Fn(ComponentId) -> bool) -> bool { + set_contains_id(self.component_id) } } @@ -1551,14 +1536,9 @@ macro_rules! impl_tuple_fetch { $($name.update_archetype_component_access(_archetype, _access);)* } - fn matches_archetype(&self, _archetype: &Archetype) -> bool { - let ($($name,)*) = self; - true $(&& $name.matches_archetype(_archetype))* - } - - fn matches_table(&self, _table: &Table) -> bool { + fn matches_component_set(&self, _set_contains_id: &impl Fn(ComponentId) -> bool) -> bool { let ($($name,)*) = self; - true $(&& $name.matches_table(_table))* + true $(&& $name.matches_component_set(_set_contains_id))* } } @@ -1618,7 +1598,7 @@ macro_rules! impl_anytuple_fetch { let ($($name,)*) = &mut self.0; let ($($state,)*) = &_state.0; $( - $name.1 = $state.matches_archetype(_archetype); + $name.1 = $state.matches_component_set(&|id| _archetype.contains(id)); if $name.1 { $name.0.set_archetype($state, _archetype, _tables); } @@ -1630,7 +1610,7 @@ macro_rules! impl_anytuple_fetch { let ($($name,)*) = &mut self.0; let ($($state,)*) = &_state.0; $( - $name.1 = $state.matches_table(_table); + $name.1 = $state.matches_component_set(&|id| _table.has_column(id)); if $name.1 { $name.0.set_table($state, _table); } @@ -1699,20 +1679,14 @@ macro_rules! impl_anytuple_fetch { fn update_archetype_component_access(&self, _archetype: &Archetype, _access: &mut Access) { let ($($name,)*) = &self.0; $( - if $name.matches_archetype(_archetype) { + if $name.matches_component_set(&|id| _archetype.contains(id)) { $name.update_archetype_component_access(_archetype, _access); } )* } - - fn matches_archetype(&self, _archetype: &Archetype) -> bool { - let ($($name,)*) = &self.0; - false $(|| $name.matches_archetype(_archetype))* - } - - fn matches_table(&self, _table: &Table) -> bool { + fn matches_component_set(&self, _set_contains_id: &impl Fn(ComponentId) -> bool) -> bool { let ($($name,)*) = &self.0; - false $(|| $name.matches_table(_table))* + false $(|| $name.matches_component_set(_set_contains_id))* } } diff --git a/crates/bevy_ecs/src/query/filter.rs b/crates/bevy_ecs/src/query/filter.rs index 36dc70844eff8..c973765be6bb8 100644 --- a/crates/bevy_ecs/src/query/filter.rs +++ b/crates/bevy_ecs/src/query/filter.rs @@ -90,12 +90,8 @@ unsafe impl FetchState for WithState { ) { } - fn matches_archetype(&self, archetype: &Archetype) -> bool { - archetype.contains(self.component_id) - } - - fn matches_table(&self, table: &Table) -> bool { - table.has_column(self.component_id) + fn matches_component_set(&self, set_contains_id: &impl Fn(ComponentId) -> bool) -> bool { + set_contains_id(self.component_id) } } @@ -232,13 +228,8 @@ unsafe impl FetchState for WithoutState { _access: &mut Access, ) { } - - fn matches_archetype(&self, archetype: &Archetype) -> bool { - !archetype.contains(self.component_id) - } - - fn matches_table(&self, table: &Table) -> bool { - !table.has_column(self.component_id) + fn matches_component_set(&self, set_contains_id: &impl Fn(ComponentId) -> bool) -> bool { + !set_contains_id(self.component_id) } } @@ -390,7 +381,7 @@ macro_rules! impl_query_filter_tuple { let ($($filter,)*) = &mut self.0; let ($($state,)*) = &state.0; $( - $filter.matches = $state.matches_table(table); + $filter.matches = $state.matches_component_set(&|id| table.has_column(id)); if $filter.matches { $filter.fetch.set_table($state, table); } @@ -402,7 +393,7 @@ macro_rules! impl_query_filter_tuple { let ($($filter,)*) = &mut self.0; let ($($state,)*) = &state.0; $( - $filter.matches = $state.matches_archetype(archetype); + $filter.matches = $state.matches_component_set(&|id| archetype.contains(id)); if $filter.matches { $filter.fetch.set_archetype($state, archetype, tables); } @@ -477,14 +468,9 @@ macro_rules! impl_query_filter_tuple { $($filter.update_archetype_component_access(archetype, access);)* } - fn matches_archetype(&self, archetype: &Archetype) -> bool { + fn matches_component_set(&self, _set_contains_id: &impl Fn(ComponentId) -> bool) -> bool { let ($($filter,)*) = &self.0; - false $(|| $filter.matches_archetype(archetype))* - } - - fn matches_table(&self, table: &Table) -> bool { - let ($($filter,)*) = &self.0; - false $(|| $filter.matches_table(table))* + false $(|| $filter.matches_component_set(_set_contains_id))* } } @@ -564,12 +550,8 @@ macro_rules! impl_tick_filter { } } - fn matches_archetype(&self, archetype: &Archetype) -> bool { - archetype.contains(self.component_id) - } - - fn matches_table(&self, table: &Table) -> bool { - table.has_column(self.component_id) + fn matches_component_set(&self, set_contains_id: &impl Fn(ComponentId) -> bool) -> bool { + set_contains_id(self.component_id) } } diff --git a/crates/bevy_ecs/src/query/state.rs b/crates/bevy_ecs/src/query/state.rs index ae23c1c512e8e..fd8ec31e48710 100644 --- a/crates/bevy_ecs/src/query/state.rs +++ b/crates/bevy_ecs/src/query/state.rs @@ -115,8 +115,12 @@ impl QueryState { /// Creates a new [`Archetype`]. pub fn new_archetype(&mut self, archetype: &Archetype) { - if self.fetch_state.matches_archetype(archetype) - && self.filter_state.matches_archetype(archetype) + if self + .fetch_state + .matches_component_set(&|id| archetype.contains(id)) + && self + .filter_state + .matches_component_set(&|id| archetype.contains(id)) { self.fetch_state .update_archetype_component_access(archetype, &mut self.archetype_component_access);