Skip to content

Commit 55c19b8

Browse files
committed
feat(ecs): add create_system_rt
1 parent 8b8c7ac commit 55c19b8

File tree

3 files changed

+121
-125
lines changed

3 files changed

+121
-125
lines changed

modules/ecs/antara/gaming/ecs/antara.ecs.system.manager.tests.cpp

Lines changed: 89 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -18,35 +18,29 @@
1818
#include "antara/gaming/ecs/system.hpp"
1919
#include "antara/gaming/ecs/system.manager.hpp"
2020

21-
class logic_concrete_system final : public antara::gaming::ecs::logic_update_system<logic_concrete_system>
22-
{
21+
class logic_concrete_system final : public antara::gaming::ecs::logic_update_system<logic_concrete_system> {
2322
public:
24-
logic_concrete_system(entt::registry &registry) : system(registry)
25-
{
23+
logic_concrete_system(entt::registry &registry) : system(registry) {
2624

2725
}
2826

2927
logic_concrete_system() = default;
3028

31-
void update() noexcept final
32-
{
29+
void update() noexcept final {
3330

3431
}
3532

3633
~logic_concrete_system() noexcept final = default;
3734
};
3835

39-
class pre_concrete_system final : public antara::gaming::ecs::pre_update_system<pre_concrete_system>
40-
{
36+
class pre_concrete_system final : public antara::gaming::ecs::pre_update_system<pre_concrete_system> {
4137
public:
42-
pre_concrete_system(entt::registry &registry) noexcept : system(registry)
43-
{
38+
pre_concrete_system(entt::registry &registry) noexcept : system(registry) {
4439

4540
}
4641

4742

48-
void update() noexcept final
49-
{
43+
void update() noexcept final {
5044

5145
}
5246

@@ -56,99 +50,91 @@ class pre_concrete_system final : public antara::gaming::ecs::pre_update_system<
5650
REFL_AUTO(type(logic_concrete_system))
5751
REFL_AUTO(type(pre_concrete_system))
5852

59-
namespace antara::gaming::ecs::tests
60-
{
61-
TEST_SUITE ("system manager test suite")
62-
{
53+
namespace antara::gaming::ecs::tests {
54+
TEST_CASE ("add system") {
6355
entt::registry registry;
64-
entt::dispatcher& dispatcher{registry.set<entt::dispatcher>()};
56+
entt::dispatcher &dispatcher{registry.set<entt::dispatcher>()};
6557
system_manager manager{registry};
6658
const system_manager &c_mgr = manager;
67-
68-
TEST_CASE ("add system")
69-
{
70-
manager.start();
71-
CHECK_EQ(manager.nb_systems(), 0u);
72-
manager.create_system<logic_concrete_system>();
73-
CHECK(manager.has_system<logic_concrete_system>());
74-
CHECK_EQ(manager.nb_systems(), 1u);
75-
CHECK_EQ(manager.nb_systems(logic_concrete_system::get_system_type()), 1u);
76-
manager.create_system<logic_concrete_system>();
77-
CHECK_EQ(manager.nb_systems(), 1u);
78-
CHECK_EQ(manager.nb_systems(logic_concrete_system::get_system_type()), 1u);
79-
80-
//! evt
81-
ecs::event::add_base_system evt(std::make_unique<pre_concrete_system>(registry));
82-
manager.receive_add_base_system(evt);
83-
manager.update();
84-
CHECK_EQ(manager.nb_systems(), 2u);
85-
CHECK(manager.mark_system<pre_concrete_system>());
86-
manager.update();
87-
CHECK_EQ(manager.nb_systems(), 1u);
88-
}
89-
90-
TEST_CASE("remove system")
91-
{
92-
CHECK_EQ(manager.nb_systems(), 1u);
93-
CHECK(manager.mark_system<logic_concrete_system>());
94-
manager.update();
95-
CHECK_FALSE(manager.has_system<logic_concrete_system>());
96-
CHECK_EQ(manager.nb_systems(), 0u);
97-
CHECK_FALSE(manager.mark_system<logic_concrete_system>());
98-
}
99-
100-
TEST_CASE("add multiple systems")
101-
{
102-
manager.load_systems<logic_concrete_system, pre_concrete_system>();
103-
CHECK_EQ(manager.nb_systems(), 2u);
104-
CHECK(manager.has_systems<logic_concrete_system, pre_concrete_system>());
105-
}
106-
107-
TEST_CASE("update/enable/disable systems from specific type")
108-
{
109-
CHECK_EQ(manager.update_systems(pre_update), 1ull);
110-
CHECK(manager.disable_system<pre_concrete_system>());
111-
CHECK_EQ(manager.update_systems(pre_update), 0ull);
112-
CHECK(manager.enable_system<pre_concrete_system>());
113-
114-
CHECK(manager.disable_systems<logic_concrete_system, pre_concrete_system>());
115-
CHECK_EQ(manager.update(), 0ull);
116-
CHECK(manager.enable_systems<logic_concrete_system, pre_concrete_system>());
117-
CHECK_GE(manager.update(), 1ull);
118-
}
119-
120-
TEST_CASE("get single system")
121-
{
122-
auto &logic_system = manager.get_system<logic_concrete_system>();
123-
124-
const auto& c_logic_system = c_mgr.get_system<logic_concrete_system>();
125-
CHECK_EQ(logic_system.get_name(), "logic_concrete_system");
126-
CHECK_EQ(c_logic_system.get_name(), "logic_concrete_system");
127-
}
128-
129-
TEST_CASE("get multiple systems")
130-
{
131-
auto&& [lgc_sys, pre_sys] = manager.get_systems<logic_concrete_system, pre_concrete_system>();
132-
CHECK_EQ(lgc_sys.get_name(), "logic_concrete_system");
133-
CHECK_EQ(pre_sys.get_name(), "pre_concrete_system");
134-
135-
auto&& [c_lgc_sys, c_pre_sys] = c_mgr.get_systems<logic_concrete_system, pre_concrete_system>();
136-
CHECK_EQ(c_lgc_sys.get_name(), "logic_concrete_system");
137-
CHECK_EQ(c_pre_sys.get_name(), "pre_concrete_system");
138-
}
139-
140-
TEST_CASE("marked multiple systems")
141-
{
142-
CHECK(manager.has_systems<logic_concrete_system, pre_concrete_system>());
143-
CHECK(manager.mark_systems<logic_concrete_system, pre_concrete_system>());
144-
manager.update();
145-
CHECK_FALSE(manager.has_systems<logic_concrete_system, pre_concrete_system>());
146-
CHECK_FALSE(manager.enable_systems<logic_concrete_system, pre_concrete_system>());
147-
CHECK_FALSE(manager.disable_systems<logic_concrete_system, pre_concrete_system>());
148-
CHECK_EQ(0ull, manager.update());
149-
CHECK_EQ(0ull, manager.nb_systems());
150-
//manager.get_systems<logic_concrete_system, pre_concrete_system>(); //UBSAN
151-
//c_mgr.get_systems<logic_concrete_system, pre_concrete_system>(); // UBSAN
152-
}
59+
manager.start();
60+
61+
//! add
62+
CHECK_EQ(manager.nb_systems(), 0u);
63+
manager.create_system<logic_concrete_system>();
64+
CHECK(manager.has_system<logic_concrete_system>());
65+
CHECK_EQ(manager.nb_systems(), 1u);
66+
CHECK_EQ(manager.nb_systems(logic_concrete_system::get_system_type()), 1u);
67+
manager.create_system<logic_concrete_system>();
68+
CHECK_EQ(manager.nb_systems(), 1u);
69+
CHECK_EQ(manager.nb_systems(logic_concrete_system::get_system_type()), 1u);
70+
71+
//! evt
72+
ecs::event::add_base_system evt(std::make_unique<pre_concrete_system>(registry));
73+
manager.receive_add_base_system(evt);
74+
manager.update();
75+
CHECK_EQ(manager.nb_systems(), 2u);
76+
CHECK(manager.mark_system<pre_concrete_system>());
77+
manager.update();
78+
CHECK_EQ(manager.nb_systems(), 1u);
79+
80+
manager.create_system_rt<pre_concrete_system>();
81+
CHECK_EQ(manager.nb_systems(), 1u);
82+
manager.update();
83+
CHECK_EQ(manager.nb_systems(), 2u);
84+
CHECK(manager.mark_system<pre_concrete_system>());
85+
manager.update();
86+
CHECK_EQ(manager.nb_systems(), 1u);
87+
88+
89+
//! remove
90+
CHECK_EQ(manager.nb_systems(), 1u);
91+
CHECK(manager.mark_system<logic_concrete_system>());
92+
manager.update();
93+
CHECK_FALSE(manager.has_system<logic_concrete_system>());
94+
CHECK_EQ(manager.nb_systems(), 0u);
95+
CHECK_FALSE(manager.mark_system<logic_concrete_system>());
96+
97+
98+
//! add multiple
99+
manager.load_systems<logic_concrete_system, pre_concrete_system>();
100+
CHECK_EQ(manager.nb_systems(), 2u);
101+
CHECK(manager.has_systems<logic_concrete_system, pre_concrete_system>());
102+
103+
//! update/enable/disable systems from specific type
104+
CHECK_EQ(manager.update_systems(pre_update), 1ull);
105+
CHECK(manager.disable_system<pre_concrete_system>());
106+
CHECK_EQ(manager.update_systems(pre_update), 0ull);
107+
CHECK(manager.enable_system<pre_concrete_system>());
108+
109+
CHECK(manager.disable_systems<logic_concrete_system, pre_concrete_system>());
110+
CHECK_EQ(manager.update(), 0ull);
111+
CHECK(manager.enable_systems<logic_concrete_system, pre_concrete_system>());
112+
CHECK_GE(manager.update(), 1ull);
113+
114+
//! get single
115+
auto &logic_system = manager.get_system<logic_concrete_system>();
116+
117+
const auto &c_logic_system = c_mgr.get_system<logic_concrete_system>();
118+
CHECK_EQ(logic_system.get_name(), "logic_concrete_system");
119+
CHECK_EQ(c_logic_system.get_name(), "logic_concrete_system");
120+
121+
//! get multiple
122+
auto&&[lgc_sys, pre_sys] = manager.get_systems<logic_concrete_system, pre_concrete_system>();
123+
CHECK_EQ(lgc_sys.get_name(), "logic_concrete_system");
124+
CHECK_EQ(pre_sys.get_name(), "pre_concrete_system");
125+
126+
auto&&[c_lgc_sys, c_pre_sys] = c_mgr.get_systems<logic_concrete_system, pre_concrete_system>();
127+
CHECK_EQ(c_lgc_sys.get_name(), "logic_concrete_system");
128+
CHECK_EQ(c_pre_sys.get_name(), "pre_concrete_system");
129+
130+
//! marked multiple
131+
CHECK(manager.has_systems<logic_concrete_system, pre_concrete_system>());
132+
CHECK(manager.mark_systems<logic_concrete_system, pre_concrete_system>());
133+
manager.update();
134+
CHECK_FALSE(manager.has_systems<logic_concrete_system, pre_concrete_system>());
135+
CHECK_FALSE(manager.enable_systems<logic_concrete_system, pre_concrete_system>());
136+
CHECK_FALSE(manager.disable_systems<logic_concrete_system, pre_concrete_system>());
137+
CHECK_EQ(0ull, manager.update());
138+
CHECK_EQ(0ull, manager.nb_systems());
153139
}
154140
}

modules/ecs/antara/gaming/ecs/system.manager.cpp

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -20,49 +20,44 @@
2020
#include <range/v3/view/filter.hpp>
2121
#include "antara/gaming/ecs/system.manager.hpp"
2222

23-
namespace antara::gaming::ecs
24-
{
25-
system_manager::system_manager(entt::registry &registry, bool susbscribe_to_internal_events) noexcept : entity_registry_(
26-
registry), dispatcher_(this->entity_registry_.ctx<entt::dispatcher>())
27-
{
23+
namespace antara::gaming::ecs {
24+
system_manager::system_manager(entt::registry &registry, bool susbscribe_to_internal_events) noexcept
25+
: entity_registry_(
26+
registry), dispatcher_(this->entity_registry_.ctx<entt::dispatcher>()) {
2827
LOG_SCOPE_FUNCTION(INFO);
2928
if (susbscribe_to_internal_events) {
3029
this->dispatcher_.sink<event::add_base_system>().connect<&system_manager::receive_add_base_system>(*this);
3130
assert(not dispatcher_.sink<event::add_base_system>().empty());
3231
}
3332
}
3433

35-
std::size_t system_manager::nb_systems(system_type sys_type) const noexcept
36-
{
34+
std::size_t system_manager::nb_systems(system_type sys_type) const noexcept {
3735
return systems_[sys_type].size();
3836
}
3937

40-
std::size_t system_manager::nb_systems() const noexcept
41-
{
38+
std::size_t system_manager::nb_systems() const noexcept {
4239
return ranges::accumulate(systems_, size_t{0u}, [](size_t accumulator, auto &&vec) {
4340
return accumulator + vec.size();
4441
});
4542
}
4643

4744
base_system &
48-
system_manager::add_system_(system_manager::system_ptr &&system, antara::gaming::ecs::system_type sys_type) noexcept
49-
{
45+
system_manager::add_system_(system_manager::system_ptr &&system,
46+
antara::gaming::ecs::system_type sys_type) noexcept {
5047
LOG_SCOPE_FUNCTION(INFO);
5148
DVLOG_F(loguru::Verbosity_INFO, "adding system {} in the system manager.", system->get_name());
5249
return *systems_[sys_type].emplace_back(std::move(system));
5350
}
5451

55-
void system_manager::sweep_systems_() noexcept
56-
{
52+
void system_manager::sweep_systems_() noexcept {
5753
ranges::for_each(systems_, [](auto &&vec_system) -> void {
5854
ranges::actions::remove_if(vec_system, &base_system::is_marked);
5955
});
6056

6157
this->need_to_sweep_systems_ = false;
6258
}
6359

64-
std::size_t system_manager::update() noexcept
65-
{
60+
std::size_t system_manager::update() noexcept {
6661
if (not nb_systems() || not game_is_running)
6762
return 0u;
6863

@@ -84,7 +79,7 @@ namespace antara::gaming::ecs
8479
}
8580

8681
for (auto &&current_sys_vec : systems_)
87-
for (auto&& current_sys: current_sys_vec)
82+
for (auto &&current_sys: current_sys_vec)
8883
current_sys->post_update();
8984

9085
//LCOV_EXCL_START
@@ -100,8 +95,7 @@ namespace antara::gaming::ecs
10095
return nb_systems_updated;
10196
}
10297

103-
std::size_t system_manager::update_systems(system_type system_type_to_update) noexcept
104-
{
98+
std::size_t system_manager::update_systems(system_type system_type_to_update) noexcept {
10599
std::size_t nb_systems_updated = 0ull;
106100
for (auto &&current_sys : systems_[system_type_to_update] | ranges::views::filter(&base_system::is_enabled)) {
107101
current_sys->update();
@@ -110,8 +104,7 @@ namespace antara::gaming::ecs
110104
return nb_systems_updated;
111105
}
112106

113-
void system_manager::receive_add_base_system(const ecs::event::add_base_system &evt) noexcept
114-
{
107+
void system_manager::receive_add_base_system(const ecs::event::add_base_system &evt) noexcept {
115108
LOG_SCOPE_FUNCTION(INFO);
116109
assert(evt.system_ptr != nullptr);
117110
ecs::system_type sys_type = evt.system_ptr->get_system_type_rtti();
@@ -122,8 +115,7 @@ namespace antara::gaming::ecs
122115
}
123116
}
124117

125-
void system_manager::start() noexcept
126-
{
118+
void system_manager::start() noexcept {
127119
LOG_SCOPE_FUNCTION(INFO);
128120
game_is_running = true;
129121
}

modules/ecs/antara/gaming/ecs/system.manager.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,10 @@ namespace antara::gaming::ecs
615615
template<typename TSystem, typename ... TSystemArgs>
616616
TSystem &create_system(TSystemArgs &&...args) noexcept;
617617

618+
//! TODO: Document it
619+
template<typename TSystem, typename ... TSystemArgs>
620+
void create_system_rt(TSystemArgs &&... args) noexcept;
621+
618622
/**
619623
* @brief This function load a bunch os systems
620624
* @tparam TSystems represents a list of systems to be loaded
@@ -722,6 +726,20 @@ namespace antara::gaming::ecs
722726
return static_cast<TSystem &>(add_system_(std::move(sys), TSystem::get_system_type()));
723727
}
724728

729+
template<typename TSystem, typename... TSystemArgs>
730+
void system_manager::create_system_rt(TSystemArgs &&... args) noexcept {
731+
LOG_SCOPE_FUNCTION(INFO);
732+
if (has_system<TSystem>()) {
733+
return ;
734+
}
735+
auto creator = [this](auto &&... args_) {
736+
return std::make_unique<TSystem>(this->entity_registry_,
737+
std::forward<decltype(args_)>(args_)...);
738+
};
739+
740+
this->dispatcher_.trigger<event::add_base_system>(creator(std::forward<TSystemArgs>(args)...));
741+
}
742+
725743
template<typename... TSystems, typename... TArgs>
726744
auto system_manager::load_systems(TArgs &&... args) noexcept
727745
{

0 commit comments

Comments
 (0)