Skip to content

Commit

Permalink
constrain WorldQuery::init_state to only use &mut Components and &mut…
Browse files Browse the repository at this point in the history
… Storages
  • Loading branch information
Victoronz committed May 13, 2024
1 parent 0637ee4 commit f4a2b5a
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 53 deletions.
4 changes: 2 additions & 2 deletions crates/bevy_ecs/macros/src/world_query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -164,9 +164,9 @@ pub(crate) fn world_query_impl(
#( <#field_types>::update_component_access(&state.#named_field_idents, _access); )*
}

fn init_state(world: &mut #path::world::World) -> #state_struct_name #user_ty_generics {
fn init_state(components: &mut #path::component::Components, storages: &mut #path::storage::Storages) -> #state_struct_name #user_ty_generics {
#state_struct_name {
#(#named_field_idents: <#field_types>::init_state(world),)*
#(#named_field_idents: <#field_types>::init_state(components, storages),)*
}
}

Expand Down
16 changes: 10 additions & 6 deletions crates/bevy_ecs/src/query/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,10 @@ pub struct QueryBuilder<'w, D: QueryData = (), F: QueryFilter = ()> {
impl<'w, D: QueryData, F: QueryFilter> QueryBuilder<'w, D, F> {
/// Creates a new builder with the accesses required for `Q` and `F`
pub fn new(world: &'w mut World) -> Self {
let fetch_state = D::init_state(world);
let filter_state = F::init_state(world);
let components = &mut world.components;
let storages = &mut world.storages;
let fetch_state = D::init_state(components, storages);
let filter_state = F::init_state(components, storages);

let mut access = FilteredAccess::default();
D::update_component_access(&fetch_state, &mut access);
Expand Down Expand Up @@ -95,7 +97,7 @@ impl<'w, D: QueryData, F: QueryFilter> QueryBuilder<'w, D, F> {

/// Adds accesses required for `T` to self.
pub fn data<T: QueryData>(&mut self) -> &mut Self {
let state = T::init_state(self.world);
let state = T::init_state(&mut self.world.components, &mut self.world.storages);
let mut access = FilteredAccess::default();
T::update_component_access(&state, &mut access);
self.extend_access(access);
Expand All @@ -104,7 +106,7 @@ impl<'w, D: QueryData, F: QueryFilter> QueryBuilder<'w, D, F> {

/// Adds filter from `T` to self.
pub fn filter<T: QueryFilter>(&mut self) -> &mut Self {
let state = T::init_state(self.world);
let state = T::init_state(&mut self.world.components, &mut self.world.storages);
let mut access = FilteredAccess::default();
T::update_component_access(&state, &mut access);
self.extend_access(access);
Expand Down Expand Up @@ -222,8 +224,10 @@ impl<'w, D: QueryData, F: QueryFilter> QueryBuilder<'w, D, F> {
pub fn transmute_filtered<NewD: QueryData, NewF: QueryFilter>(
&mut self,
) -> &mut QueryBuilder<'w, NewD, NewF> {
let mut fetch_state = NewD::init_state(self.world);
let filter_state = NewF::init_state(self.world);
let components = &mut self.world.components;
let storages = &mut self.world.storages;
let mut fetch_state = NewD::init_state(components, storages);
let filter_state = NewF::init_state(components, storages);

NewD::set_access(&mut fetch_state, &self.access);

Expand Down
48 changes: 24 additions & 24 deletions crates/bevy_ecs/src/query/fetch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ use crate::{
component::{Component, ComponentId, Components, StorageType, Tick},
entity::{Entities, Entity, EntityLocation},
query::{Access, DebugCheckedUnwrap, FilteredAccess, WorldQuery},
storage::{ComponentSparseSet, Table, TableRow},
storage::{ComponentSparseSet, Storages, Table, TableRow},
world::{
unsafe_world_cell::UnsafeWorldCell, EntityMut, EntityRef, FilteredEntityMut,
FilteredEntityRef, Mut, Ref, World,
FilteredEntityRef, Mut, Ref,
},
};
use bevy_ptr::{ThinSlicePtr, UnsafeCellDeref};
Expand Down Expand Up @@ -331,7 +331,7 @@ unsafe impl WorldQuery for Entity {

fn update_component_access(_state: &Self::State, _access: &mut FilteredAccess<ComponentId>) {}

fn init_state(_world: &mut World) {}
fn init_state(_components: &mut Components, _storages: &mut Storages) {}

fn get_state(_components: &Components) -> Option<()> {
Some(())
Expand Down Expand Up @@ -403,7 +403,7 @@ unsafe impl WorldQuery for EntityLocation {

fn update_component_access(_state: &Self::State, _access: &mut FilteredAccess<ComponentId>) {}

fn init_state(_world: &mut World) {}
fn init_state(_components: &mut Components, _storages: &mut Storages) {}

fn get_state(_components: &Components) -> Option<()> {
Some(())
Expand Down Expand Up @@ -482,7 +482,7 @@ unsafe impl<'a> WorldQuery for EntityRef<'a> {
access.read_all();
}

fn init_state(_world: &mut World) {}
fn init_state(_components: &mut Components, _storages: &mut Storages) {}

fn get_state(_components: &Components) -> Option<()> {
Some(())
Expand Down Expand Up @@ -558,7 +558,7 @@ unsafe impl<'a> WorldQuery for EntityMut<'a> {
access.write_all();
}

fn init_state(_world: &mut World) {}
fn init_state(_components: &mut Components, _storages: &mut Storages) {}

fn get_state(_components: &Components) -> Option<()> {
Some(())
Expand Down Expand Up @@ -656,7 +656,7 @@ unsafe impl<'a> WorldQuery for FilteredEntityRef<'a> {
filtered_access.access.extend(&state.access);
}

fn init_state(_world: &mut World) -> Self::State {
fn init_state(_components: &mut Components, _storages: &mut Storages) -> Self::State {
FilteredAccess::default()
}

Expand Down Expand Up @@ -768,7 +768,7 @@ unsafe impl<'a> WorldQuery for FilteredEntityMut<'a> {
filtered_access.access.extend(&state.access);
}

fn init_state(_world: &mut World) -> Self::State {
fn init_state(_components: &mut Components, _storages: &mut Storages) -> Self::State {
FilteredAccess::default()
}

Expand Down Expand Up @@ -842,7 +842,7 @@ unsafe impl WorldQuery for &Archetype {

fn update_component_access(_state: &Self::State, _access: &mut FilteredAccess<ComponentId>) {}

fn init_state(_world: &mut World) {}
fn init_state(_components: &mut Components, _storages: &mut Storages) {}

fn get_state(_components: &Components) -> Option<()> {
Some(())
Expand Down Expand Up @@ -991,8 +991,8 @@ unsafe impl<T: Component> WorldQuery for &T {
access.add_read(component_id);
}

fn init_state(world: &mut World) -> ComponentId {
world.init_component::<T>()
fn init_state(components: &mut Components, storages: &mut Storages) -> ComponentId {
components.init_component::<T>(storages)
}

fn get_state(components: &Components) -> Option<Self::State> {
Expand Down Expand Up @@ -1174,8 +1174,8 @@ unsafe impl<'__w, T: Component> WorldQuery for Ref<'__w, T> {
access.add_read(component_id);
}

fn init_state(world: &mut World) -> ComponentId {
world.init_component::<T>()
fn init_state(components: &mut Components, storages: &mut Storages) -> ComponentId {
components.init_component::<T>(storages)
}

fn get_state(components: &Components) -> Option<Self::State> {
Expand Down Expand Up @@ -1357,8 +1357,8 @@ unsafe impl<'__w, T: Component> WorldQuery for &'__w mut T {
access.add_write(component_id);
}

fn init_state(world: &mut World) -> ComponentId {
world.init_component::<T>()
fn init_state(components: &mut Components, storages: &mut Storages) -> ComponentId {
components.init_component::<T>(storages)
}

fn get_state(components: &Components) -> Option<Self::State> {
Expand Down Expand Up @@ -1476,8 +1476,8 @@ unsafe impl<T: WorldQuery> WorldQuery for Option<T> {
access.extend_access(&intermediate);
}

fn init_state(world: &mut World) -> T::State {
T::init_state(world)
fn init_state(components: &mut Components, storages: &mut Storages) -> T::State {
T::init_state(components, storages)
}

fn get_state(components: &Components) -> Option<Self::State> {
Expand Down Expand Up @@ -1631,8 +1631,8 @@ unsafe impl<T: Component> WorldQuery for Has<T> {
access.access_mut().add_archetypal(component_id);
}

fn init_state(world: &mut World) -> ComponentId {
world.init_component::<T>()
fn init_state(components: &mut Components, storages: &mut Storages) -> ComponentId {
components.init_component::<T>(storages)
}

fn get_state(components: &Components) -> Option<Self::State> {
Expand Down Expand Up @@ -1777,8 +1777,8 @@ macro_rules! impl_anytuple_fetch {
*_access = _new_access;
}
#[allow(unused_variables)]
fn init_state(world: &mut World) -> Self::State {
($($name::init_state(world),)*)
fn init_state(components: &mut Components, storages: &mut Storages) -> Self::State {
($($name::init_state(components, storages),)*)
}
#[allow(unused_variables)]
fn get_state(components: &Components) -> Option<Self::State> {
Expand Down Expand Up @@ -1854,8 +1854,8 @@ unsafe impl<D: QueryData> WorldQuery for NopWorldQuery<D> {

fn update_component_access(_state: &D::State, _access: &mut FilteredAccess<ComponentId>) {}

fn init_state(world: &mut World) -> Self::State {
D::init_state(world)
fn init_state(components: &mut Components, storages: &mut Storages) -> Self::State {
D::init_state(components, storages)
}

fn get_state(components: &Components) -> Option<Self::State> {
Expand Down Expand Up @@ -1921,7 +1921,7 @@ unsafe impl<T: ?Sized> WorldQuery for PhantomData<T> {

fn update_component_access(_state: &Self::State, _access: &mut FilteredAccess<ComponentId>) {}

fn init_state(_world: &mut World) -> Self::State {}
fn init_state(_components: &mut Components, _storages: &mut Storages) -> Self::State {}

fn get_state(_components: &Components) -> Option<Self::State> {
Some(())
Expand Down
24 changes: 12 additions & 12 deletions crates/bevy_ecs/src/query/filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ use crate::{
component::{Component, ComponentId, Components, StorageType, Tick},
entity::Entity,
query::{DebugCheckedUnwrap, FilteredAccess, WorldQuery},
storage::{Column, ComponentSparseSet, Table, TableRow},
world::{unsafe_world_cell::UnsafeWorldCell, World},
storage::{Column, ComponentSparseSet, Storages, Table, TableRow},
world::unsafe_world_cell::UnsafeWorldCell,
};
use bevy_ptr::{ThinSlicePtr, UnsafeCellDeref};
use bevy_utils::all_tuples;
Expand Down Expand Up @@ -179,8 +179,8 @@ unsafe impl<T: Component> WorldQuery for With<T> {
access.and_with(id);
}

fn init_state(world: &mut World) -> ComponentId {
world.init_component::<T>()
fn init_state(components: &mut Components, storages: &mut Storages) -> ComponentId {
components.init_component::<T>(storages)
}

fn get_state(components: &Components) -> Option<Self::State> {
Expand Down Expand Up @@ -287,8 +287,8 @@ unsafe impl<T: Component> WorldQuery for Without<T> {
access.and_without(id);
}

fn init_state(world: &mut World) -> ComponentId {
world.init_component::<T>()
fn init_state(components: &mut Components, storages: &mut Storages) -> ComponentId {
components.init_component::<T>(storages)
}

fn get_state(components: &Components) -> Option<Self::State> {
Expand Down Expand Up @@ -457,8 +457,8 @@ macro_rules! impl_or_query_filter {
*access = _new_access;
}

fn init_state(world: &mut World) -> Self::State {
($($filter::init_state(world),)*)
fn init_state(components: &mut Components, storages: &mut Storages) -> Self::State {
($($filter::init_state(components, storages),)*)
}

fn get_state(components: &Components) -> Option<Self::State> {
Expand Down Expand Up @@ -687,8 +687,8 @@ unsafe impl<T: Component> WorldQuery for Added<T> {
access.add_read(id);
}

fn init_state(world: &mut World) -> ComponentId {
world.init_component::<T>()
fn init_state(components: &mut Components, storages: &mut Storages) -> ComponentId {
components.init_component::<T>(storages)
}

fn get_state(components: &Components) -> Option<ComponentId> {
Expand Down Expand Up @@ -896,8 +896,8 @@ unsafe impl<T: Component> WorldQuery for Changed<T> {
access.add_read(id);
}

fn init_state(world: &mut World) -> ComponentId {
world.init_component::<T>()
fn init_state(components: &mut Components, storages: &mut Storages) -> ComponentId {
components.init_component::<T>(storages)
}

fn get_state(components: &Components) -> Option<ComponentId> {
Expand Down
13 changes: 9 additions & 4 deletions crates/bevy_ecs/src/query/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -178,8 +178,10 @@ impl<D: QueryData, F: QueryFilter> QueryState<D, F> {
/// `new_archetype` and its variants must be called on all of the World's archetypes before the
/// state can return valid query results.
fn new_uninitialized(world: &mut World) -> Self {
let fetch_state = D::init_state(world);
let filter_state = F::init_state(world);
let components = &mut world.components;
let storages = &mut world.storages;
let fetch_state = D::init_state(components, storages);
let filter_state = F::init_state(components, storages);

let mut component_access = FilteredAccess::default();
D::update_component_access(&fetch_state, &mut component_access);
Expand Down Expand Up @@ -214,8 +216,11 @@ impl<D: QueryData, F: QueryFilter> QueryState<D, F> {

/// Creates a new [`QueryState`] from a given [`QueryBuilder`] and inherits its [`FilteredAccess`].
pub fn from_builder(builder: &mut QueryBuilder<D, F>) -> Self {
let mut fetch_state = D::init_state(builder.world_mut());
let filter_state = F::init_state(builder.world_mut());
let world = builder.world_mut();
let components = &mut world.components;
let storages = &mut world.storages;
let mut fetch_state = D::init_state(components, storages);
let filter_state = F::init_state(components, storages);
D::set_access(&mut fetch_state, builder.access());

let mut state = Self {
Expand Down
10 changes: 5 additions & 5 deletions crates/bevy_ecs/src/query/world_query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ use crate::{
component::{ComponentId, Components, Tick},
entity::Entity,
query::FilteredAccess,
storage::{Table, TableRow},
world::{unsafe_world_cell::UnsafeWorldCell, World},
storage::{Storages, Table, TableRow},
world::unsafe_world_cell::UnsafeWorldCell,
};
use bevy_utils::all_tuples;

Expand Down Expand Up @@ -127,7 +127,7 @@ pub unsafe trait WorldQuery {
fn update_component_access(state: &Self::State, access: &mut FilteredAccess<ComponentId>);

/// Creates and initializes a [`State`](WorldQuery::State) for this [`WorldQuery`] type.
fn init_state(world: &mut World) -> Self::State;
fn init_state(components: &mut Components, storages: &mut Storages) -> Self::State;

/// Attempts to initialize a [`State`](WorldQuery::State) for this [`WorldQuery`] type using read-only
/// access to [`Components`].
Expand Down Expand Up @@ -213,8 +213,8 @@ macro_rules! impl_tuple_world_query {
$($name::update_component_access($name, _access);)*
}
#[allow(unused_variables)]
fn init_state(world: &mut World) -> Self::State {
($($name::init_state(world),)*)
fn init_state(components: &mut Components, storages: &mut Storages) -> Self::State {
($($name::init_state(components, storages),)*)
}
#[allow(unused_variables)]
fn get_state(components: &Components) -> Option<Self::State> {
Expand Down

0 comments on commit f4a2b5a

Please sign in to comment.