diff options
author | HampusM <hampus@hampusmat.com> | 2024-11-16 17:14:20 +0100 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2024-11-16 17:14:20 +0100 |
commit | c9a07ff61b607478e264fc0581076643c750fe98 (patch) | |
tree | 640e6c6309af6f86df49c492057d281f5f7ea420 | |
parent | 136d0511972fd31a82331cf769f8d309cd3438f8 (diff) |
refactor(ecs): remove system param compatability checking
-rw-r--r-- | ecs/Cargo.toml | 1 | ||||
-rw-r--r-- | ecs/src/actions.rs | 15 | ||||
-rw-r--r-- | ecs/src/component/local.rs | 18 | ||||
-rw-r--r-- | ecs/src/query.rs | 49 | ||||
-rw-r--r-- | ecs/src/sole.rs | 24 | ||||
-rw-r--r-- | ecs/src/system.rs | 14 | ||||
-rw-r--r-- | ecs/src/system/stateful.rs | 5 | ||||
-rw-r--r-- | ecs/src/system/util.rs | 16 |
8 files changed, 2 insertions, 140 deletions
diff --git a/ecs/Cargo.toml b/ecs/Cargo.toml index 0f86ef7..342f087 100644 --- a/ecs/Cargo.toml +++ b/ecs/Cargo.toml @@ -5,7 +5,6 @@ edition = "2021" [features] debug = ["dep:tracing"] -system-param-compat-checks = [] [dependencies] seq-macro = "0.3.5" diff --git a/ecs/src/actions.rs b/ecs/src/actions.rs index 72cc95d..f7b00d3 100644 --- a/ecs/src/actions.rs +++ b/ecs/src/actions.rs @@ -1,4 +1,3 @@ -use std::any::Any; use std::marker::PhantomData; use std::sync::{Arc, Weak}; @@ -95,18 +94,6 @@ unsafe impl<'world> SystemParam<'world> for Actions<'world> { Self::new(&world.data.action_queue) } - - fn is_compatible<Other: SystemParam<'world>>() -> bool - { - let other_comparable = Other::get_comparable(); - - other_comparable.downcast_ref::<Comparable>().is_none() - } - - fn get_comparable() -> Box<dyn Any> - { - Box::new(()) - } } #[derive(Debug, Clone)] @@ -157,5 +144,3 @@ pub(crate) enum Action RemoveComponents(Uid, Vec<ComponentMetadata>), Stop, } - -struct Comparable; diff --git a/ecs/src/component/local.rs b/ecs/src/component/local.rs index 9d32d47..20627bf 100644 --- a/ecs/src/component/local.rs +++ b/ecs/src/component/local.rs @@ -1,8 +1,6 @@ -use std::any::Any; use std::ops::{Deref, DerefMut}; use crate::component::Component; -use crate::uid::Uid; use crate::system::{ComponentRefMut, Param as SystemParam, System}; use crate::World; @@ -39,22 +37,6 @@ where Self { local_component } } - - fn is_compatible<Other: SystemParam<'world>>() -> bool - { - let other_comparable = Other::get_comparable(); - - let Some(other_id) = other_comparable.downcast_ref::<Uid>() else { - return true; - }; - - LocalComponent::id() != *other_id - } - - fn get_comparable() -> Box<dyn Any> - { - Box::new(LocalComponent::id()) - } } impl<'world, LocalComponent> Deref for Local<'world, LocalComponent> diff --git a/ecs/src/query.rs b/ecs/src/query.rs index 69bb35d..253398d 100644 --- a/ecs/src/query.rs +++ b/ecs/src/query.rs @@ -1,5 +1,3 @@ -use std::any::Any; -use std::collections::HashSet; use std::iter::{Filter, Flatten, Map}; use std::marker::PhantomData; @@ -10,11 +8,7 @@ use crate::component::storage::{ EntityIter, Storage as ComponentStorage, }; -use crate::component::{ - Component, - Metadata as ComponentMetadata, - Sequence as ComponentSequence, -}; +use crate::component::{Component, Sequence as ComponentSequence}; use crate::lock::{ReadGuard, WriteGuard}; use crate::query::options::Options; use crate::system::{ @@ -149,24 +143,6 @@ where { Self::new(world) } - - fn is_compatible<Other: SystemParam<'world>>() -> bool - { - let other_comparable = Other::get_comparable(); - - let Some(other_query_component_ids) = - other_comparable.downcast_ref::<QueryComponentIds>() - else { - return true; - }; - - !other_query_component_ids.contains_component_in::<Comps>() - } - - fn get_comparable() -> Box<dyn Any> - { - Box::new(QueryComponentIds { component_ids: Comps::metadata() }) - } } type ComponentIterMapFn = for<'a> fn(&'a Archetype) -> EntityIter<'a>; @@ -259,26 +235,3 @@ fn lock_component_ro( ); }) } - -#[derive(Debug)] -struct QueryComponentIds -{ - component_ids: Vec<ComponentMetadata>, -} - -impl QueryComponentIds -{ - fn contains_component_in<OtherComps>(&self) -> bool - where - OtherComps: ComponentSequence, - { - let other_ids = OtherComps::metadata() - .into_iter() - .map(|component_metadata| component_metadata.id) - .collect::<HashSet<_>>(); - - self.component_ids - .iter() - .all(|component_metadata| other_ids.contains(&component_metadata.id)) - } -} diff --git a/ecs/src/sole.rs b/ecs/src/sole.rs index 4a4f3af..084a06b 100644 --- a/ecs/src/sole.rs +++ b/ecs/src/sole.rs @@ -1,4 +1,4 @@ -use std::any::{type_name, Any, TypeId}; +use std::any::{type_name, Any}; use std::fmt::Debug; use std::marker::PhantomData; use std::ops::{Deref, DerefMut}; @@ -113,23 +113,6 @@ where Self::new(sole) } - - fn is_compatible<Other: SystemParam<'world>>() -> bool - { - let other_comparable = Other::get_comparable(); - - let Some(comparable) = other_comparable.downcast_ref::<Comparable>() else { - // The other system param is not Single - return true; - }; - - TypeId::of::<SoleT>() != comparable.sole_type_id - } - - fn get_comparable() -> Box<dyn Any> - { - Box::new(Comparable { sole_type_id: TypeId::of::<SoleT>() }) - } } impl<'world, SoleT> Deref for Single<'world, SoleT> @@ -201,8 +184,3 @@ where Single::new(&self.sole) } } - -struct Comparable -{ - sole_type_id: TypeId, -} diff --git a/ecs/src/system.rs b/ecs/src/system.rs index afb5aac..046d25b 100644 --- a/ecs/src/system.rs +++ b/ecs/src/system.rs @@ -13,14 +13,11 @@ use crate::component::{ FromOptionalMut as FromOptionalMutComponent, }; use crate::lock::{ReadGuard, WriteGuard}; -use crate::system::util::check_params_are_compatible; use crate::tuple::{ReduceElement as TupleReduceElement, With as TupleWith}; use crate::World; pub mod stateful; -mod util; - pub trait System<'world, Impl>: 'static { type Input; @@ -64,10 +61,6 @@ macro_rules! impl_system { where 'this: 'world { - #( - check_params_are_compatible!(I, TParam~I, $c); - )* - let func = *self; func(#({ @@ -159,9 +152,6 @@ impl Debug for TypeErased type TypeErasedRunFn = dyn Fn(&dyn Any, &World) + RefUnwindSafe + UnwindSafe; /// A parameter to a [`System`]. -/// -/// # Safety -/// The `is_compatible` function is used for safety so it must be implemented properly. pub unsafe trait Param<'world> { type Input; @@ -176,10 +166,6 @@ pub unsafe trait Param<'world> system: &'world impl System<'world, SystemImpl>, world: &'world World, ) -> Self; - - fn is_compatible<Other: Param<'world>>() -> bool; - - fn get_comparable() -> Box<dyn Any>; } pub struct NoInitParamFlag {} diff --git a/ecs/src/system/stateful.rs b/ecs/src/system/stateful.rs index 810a071..536e6ed 100644 --- a/ecs/src/system/stateful.rs +++ b/ecs/src/system/stateful.rs @@ -6,7 +6,6 @@ use seq_macro::seq; use crate::component::Component; use crate::lock::Lock; -use crate::system::util::check_params_are_compatible; use crate::system::{ ComponentRefMut, Into as IntoSystem, @@ -90,10 +89,6 @@ macro_rules! impl_system { where 'this: 'world { - #( - check_params_are_compatible!(I, TParam~I, $c); - )* - let func = self.func; func(#({ diff --git a/ecs/src/system/util.rs b/ecs/src/system/util.rs deleted file mode 100644 index 54fff0e..0000000 --- a/ecs/src/system/util.rs +++ /dev/null @@ -1,16 +0,0 @@ -macro_rules! check_params_are_compatible { - ($excluded_index: tt, $param: ident, $cnt: tt) => { - #[cfg(feature = "system-param-compat-checks")] - { - seq!(N in 0..$cnt { - if N != $excluded_index { - if !$param::is_compatible::<TParam~N>() { - panic!("Atleast two parameters are incompatible"); - } - } - }); - } - }; -} - -pub(crate) use check_params_are_compatible; |