From 4fae4bbbe4c4b43d045fbecbe5fa5eb6925480f6 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Tue, 16 Aug 2022 14:36:35 +0300 Subject: [PATCH] Add event-based behavior & processor registration in ECS --- libs/util/include/psemek/util/ecs.hpp | 47 +++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/libs/util/include/psemek/util/ecs.hpp b/libs/util/include/psemek/util/ecs.hpp index 41270b44..ce65fbd3 100644 --- a/libs/util/include/psemek/util/ecs.hpp +++ b/libs/util/include/psemek/util/ecs.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -466,8 +467,22 @@ namespace psemek::util template void apply(Behavior && behavior, species_handle species, Args const & ... args); + template + void register_processor(Processor && processor); + + template + void register_behavior(Behavior && behavior); + + template + void register_behavior(Behavior && behavior, species_handle species); + + template + void event(Event const & event); + private: std::vector> species_; + + std::unordered_map>> event_subscribers_; }; template @@ -573,6 +588,38 @@ namespace psemek::util species_[species.value]->apply(behavior, args...); } + template + void ecs::register_processor(Processor && processor) + { + event_subscribers_[typeid(Event)].push_back([this, processor = std::move(processor)](void const * event) mutable { + processor(*static_cast(event)); + }); + } + + template + void ecs::register_behavior(Behavior && behavior) + { + event_subscribers_[typeid(Event)].push_back([this, behavior = std::move(behavior)](void const * event) mutable { + apply(behavior, *static_cast(event)); + }); + } + + template + void ecs::register_behavior(Behavior && behavior, species_handle species) + { + event_subscribers_[typeid(Event)].push_back([this, species, behavior = std::move(behavior)](void const * event) mutable { + apply(behavior, species, *static_cast(event)); + }); + } + + template + void ecs::event(Event const & event) + { + if (auto it = event_subscribers_.find(typeid(Event)); it != event_subscribers_.end()) + for (auto const & b : it->second) + b(std::addressof(event)); + } + } namespace std