summaryrefslogtreecommitdiff
path: root/ecs/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ecs/src/lib.rs')
-rw-r--r--ecs/src/lib.rs37
1 files changed, 7 insertions, 30 deletions
diff --git a/ecs/src/lib.rs b/ecs/src/lib.rs
index f824ebc..6106862 100644
--- a/ecs/src/lib.rs
+++ b/ecs/src/lib.rs
@@ -8,8 +8,10 @@ use std::marker::PhantomData;
use std::slice::IterMut as SliceIterMut;
use crate::component::{Component, Sequence as ComponentSequence};
+use crate::system::{System, TypeErased as TypeErasedSystem};
pub mod component;
+pub mod system;
#[derive(Debug)]
struct Entity
@@ -20,7 +22,7 @@ struct Entity
#[derive(Debug)]
pub struct World<Event>
{
- systems: Vec<Box<dyn AnySystem>>,
+ systems: Vec<TypeErasedSystem>,
events: HashMap<Event, Vec<usize>>,
component_storage: ComponentStorage,
}
@@ -46,12 +48,12 @@ impl<Event> World<Event>
.push(Entity { components: components.into_vec() });
}
- pub fn register_system<Comps>(&mut self, event: Event, system: System<Comps>)
+ pub fn register_system<TSystem, SystemImpl>(&mut self, event: Event, system: TSystem)
where
Event: Hash + PartialEq + Eq,
- Comps: ComponentSequence + 'static,
+ TSystem: System<SystemImpl>,
{
- self.systems.push(Box::new(system));
+ self.systems.push(system.into_type_erased());
self.events
.entry(event)
@@ -75,7 +77,7 @@ impl<Event> World<Event>
for system_index in system_indices {
let system = self.systems.get_mut(system_index).unwrap();
- system.call(&mut self.component_storage);
+ system.run(&mut self.component_storage);
}
}
@@ -95,31 +97,6 @@ impl<Event> Default for World<Event>
}
}
-pub type System<Comps> = fn(Query<Comps>);
-
-trait AnySystem
-{
- fn call(&self, component_storage: &mut ComponentStorage);
-}
-
-impl<Comps> AnySystem for System<Comps>
-where
- Comps: ComponentSequence,
-{
- fn call(&self, component_storage: &mut ComponentStorage)
- {
- self(Query::new(component_storage));
- }
-}
-
-impl Debug for dyn AnySystem
-{
- fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result
- {
- formatter.debug_struct("AnySystem").finish_non_exhaustive()
- }
-}
-
#[derive(Debug)]
pub struct Query<'world, Comps>
{