Skip to content

Commit fbf0ddd

Browse files
authored
fix: checking dependencies for valid components (#42)
1 parent acc3819 commit fbf0ddd

File tree

10 files changed

+144
-72
lines changed

10 files changed

+144
-72
lines changed

.vscode/launch.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"program": "${workspaceFolder}/bazel-bin/runtime/test/test",
88
"cwd": "${workspaceFolder}",
99
"args": [
10+
"--gtest_catch_exceptions",
1011
"--gtest_break_on_failure"
1112
],
1213
"type": "cppdbg",

WORKSPACE.bazel

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,23 @@ http_archive(
1111

1212
http_archive(
1313
name = "rules_ecsact",
14-
sha256 = "e6d888c63aa536b5b7c6af10d217cdb8ad98b2262fa9d02515a99edbd0d94eea",
15-
strip_prefix = "rules_ecsact-0.2.1",
16-
url = "https://github.com/ecsact-dev/rules_ecsact/archive/refs/tags/0.2.1.tar.gz",
14+
sha256 = "8eaaf1f05eccbfcf4a0123c951436519672190a7a908fa847c24adf0778041f6",
15+
strip_prefix = "rules_ecsact-0.2.2",
16+
url = "https://github.com/ecsact-dev/rules_ecsact/archive/refs/tags/0.2.2.tar.gz",
1717
)
1818

1919
http_archive(
2020
name = "ecsact_lang_cpp",
21-
sha256 = "2866569ed8d58f3e42b705bf38f77455fe9acf8ab2d1b05f611b847d4c291a67",
22-
strip_prefix = "ecsact_lang_cpp-b1fa28b445b98d5ba62ede19cd6a5bdfa51141be",
23-
url = "https://github.com/ecsact-dev/ecsact_lang_cpp/archive/b1fa28b445b98d5ba62ede19cd6a5bdfa51141be.zip",
21+
sha256 = "2fa208f81a8422f8bce9ed7200fa726622b77af7c8e08fdae4fa723d2e8fc163",
22+
strip_prefix = "ecsact_lang_cpp-3b70f5d276a4b29c709c687295d36ab804042e1a",
23+
url = "https://github.com/ecsact-dev/ecsact_lang_cpp/archive/3b70f5d276a4b29c709c687295d36ab804042e1a.zip",
2424
)
2525

2626
http_archive(
2727
name = "ecsact_runtime",
28-
sha256 = "", # https://github.com/ecsact-dev/ecsact_runtime/pull/140
29-
strip_prefix = "ecsact_runtime-e9689a232254c56107ff022c546ee03f53e1f04a",
30-
url = "https://github.com/ecsact-dev/ecsact_runtime/archive/e9689a232254c56107ff022c546ee03f53e1f04a.zip",
28+
sha256 = "ba5b8f1649fc86b9c803ab852d0612e2d100a64e2a06a13b612e111bf8d18735",
29+
strip_prefix = "ecsact_runtime-c6cdc81000bbee028a8e7a2bc95fc35711db1b75",
30+
url = "https://github.com/ecsact-dev/ecsact_runtime/archive/c6cdc81000bbee028a8e7a2bc95fc35711db1b75.zip",
3131
)
3232

3333
load("@rules_ecsact//ecsact:repositories.bzl", "ecsact_register_toolchains", "rules_ecsact_dependencies")

ecsact/entt/detail/meta_util.hh

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#pragma once
2+
3+
#include <map>
4+
#include <boost/mp11.hpp>
5+
#include "ecsact/runtime/common.h"
6+
7+
namespace ecsact::entt::detail {
8+
9+
template<typename Package, typename Callback>
10+
void mp_for_each_available_component(Callback&& cb) {
11+
using boost::mp11::mp_for_each;
12+
using components = typename Package::components;
13+
using dependencies = typename Package::dependencies;
14+
15+
mp_for_each<components>([&]<typename C>(const C& c) { cb(c); });
16+
mp_for_each<dependencies>([&]<typename D>(const D& d) {
17+
mp_for_each_available_component<D>(cb);
18+
});
19+
}
20+
21+
template<typename Package, typename Callback>
22+
void mp_for_each_available_action(Callback&& cb) {
23+
using boost::mp11::mp_for_each;
24+
using actions = typename Package::actions;
25+
using dependencies = typename Package::dependencies;
26+
27+
mp_for_each<actions>([&]<typename A>(const A& a) { cb(a); });
28+
mp_for_each<dependencies>([&]<typename D>(const D& d) {
29+
mp_for_each_available_components<D>(cb);
30+
});
31+
}
32+
33+
} // namespace ecsact::entt::detail

ecsact/entt/detail/registry_info.hh

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <entt/entt.hpp>
99
#include "ecsact/runtime/common.h"
1010
#include "ecsact/runtime/core.h"
11+
#include "ecsact/entt/detail/meta_util.hh"
1112

1213
#include "ecsact/entt/event_markers.hh"
1314
#include "ecsact/entt/detail/internal_markers.hh"
@@ -36,14 +37,14 @@ struct registry_info {
3637
};
3738

3839
void init_registry() {
39-
using boost::mp11::mp_for_each;
4040
using ecsact::entt::component_added;
4141
using ecsact::entt::component_changed;
4242
using ecsact::entt::component_removed;
4343
using ecsact::entt::detail::beforechange_storage;
44+
using ecsact::entt::detail::mp_for_each_available_component;
4445
using ecsact::entt::detail::temp_storage;
4546

46-
mp_for_each<typename package::components>([&]<typename C>(C) {
47+
mp_for_each_available_component<package>([&]<typename C>(C) {
4748
registry.storage<C>();
4849
registry.storage<temp_storage<C>>();
4950
registry.storage<component_added<C>>();
@@ -108,12 +109,12 @@ struct registry_info {
108109
template<typename C, typename... Args>
109110
requires(!std::is_empty_v<C>)
110111
void add_component(::entt::entity entity, Args&&... args) {
111-
using boost::mp11::mp_for_each;
112112
using boost::mp11::mp_with_index;
113+
using ecsact::entt::detail::mp_for_each_available_component;
113114

114115
auto& comp = registry.emplace<C>(entity, std::forward<Args>(args)...);
115116

116-
mp_for_each<typename package::components>([&]<typename O>(O) {
117+
mp_for_each_available_component<package>([&]<typename O>(O) {
117118
if constexpr(std::is_same_v<std::remove_cvref_t<C>, O>) {
118119
using ecsact::entt::detail::beforechange_storage;
119120
beforechange_storage<O> beforechange = {
@@ -139,7 +140,7 @@ struct registry_info {
139140

140141
template<typename C>
141142
void remove_component(::entt::entity entity) {
142-
using boost::mp11::mp_for_each;
143+
using ecsact::entt::detail::mp_for_each_available_component;
143144

144145
constexpr auto fields_info = ecsact::fields_info<C>();
145146
if constexpr(!fields_info.empty()) {
@@ -154,7 +155,7 @@ struct registry_info {
154155
registry.erase<C>(entity);
155156

156157
if constexpr(!std::is_empty_v<C>) {
157-
mp_for_each<typename package::components>([&]<typename O>(O) {
158+
mp_for_each_available_component<package>([&]<typename O>(O) {
158159
if constexpr(std::is_same_v<std::remove_cvref_t<C>, O>) {
159160
using ecsact::entt::detail::beforechange_storage;
160161
registry.erase<beforechange_storage<O>>(entity);

ecsact/entt/detail/system_execution_context.hh

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "ecsact/runtime/common.h"
1212
#include "ecsact/entt/event_markers.hh"
1313
#include "ecsact/entt/system_view.hh"
14+
#include "ecsact/entt/detail/meta_util.hh"
1415

1516
#include "registry_info.hh"
1617

@@ -141,9 +142,9 @@ struct system_execution_context : system_execution_context_base {
141142
}
142143

143144
void add(ecsact_component_like_id component_id, const void* component_data) {
144-
using boost::mp11::mp_for_each;
145+
using ecsact::entt::detail::mp_for_each_available_component;
145146

146-
mp_for_each<typename package::components>([&]<typename C>(const C&) {
147+
mp_for_each_available_component<package>([&]<typename C>(const C&) {
147148
if(ecsact_id_cast<ecsact_component_like_id>(C::id) == component_id) {
148149
add<C>(*static_cast<const C*>(component_data));
149150
}
@@ -197,9 +198,9 @@ struct system_execution_context : system_execution_context_base {
197198
}
198199

199200
void remove(ecsact_component_like_id component_id) {
200-
using boost::mp11::mp_for_each;
201+
using ecsact::entt::detail::mp_for_each_available_component;
201202

202-
mp_for_each<typename package::components>([&]<typename C>(const C&) {
203+
mp_for_each_available_component<package>([&]<typename C>(const C&) {
203204
if(ecsact_id_cast<ecsact_component_like_id>(C::id) == component_id) {
204205
remove<C>();
205206
}
@@ -338,9 +339,9 @@ struct system_execution_context : system_execution_context_base {
338339
ecsact_component_id* component_ids,
339340
const void** components_data
340341
) {
341-
using boost::mp11::mp_for_each;
342342
using ecsact::entt::component_added;
343343
using ecsact::entt::detail::created_entity;
344+
using ecsact::entt::detail::mp_for_each_available_component;
344345
using ecsact::entt::detail::pending_add;
345346

346347
auto new_entity = info.create_entity().entt_entity_id;
@@ -351,7 +352,7 @@ struct system_execution_context : system_execution_context_base {
351352
for(int i = 0; component_count > i; ++i) {
352353
auto component_id = component_ids[i];
353354
auto component_data = components_data[i];
354-
mp_for_each<typename package::components>([&]<typename C>(const C&) {
355+
mp_for_each_available_component<package>([&]<typename C>(const C&) {
355356
if(C::id == component_id) {
356357
if constexpr(std::is_empty_v<C>) {
357358
info.registry.template emplace<pending_add<C>>(new_entity);

0 commit comments

Comments
 (0)