Skip to content

Commit cea7209

Browse files
authored
fix: handling recursive imported packages correctly (#47)
1 parent ac95f7b commit cea7209

File tree

1 file changed

+104
-19
lines changed

1 file changed

+104
-19
lines changed

ecsact/entt/detail/meta_util.hh

Lines changed: 104 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,130 @@
11
#pragma once
22

3-
#include <map>
4-
#include <boost/mp11.hpp>
53
#include "ecsact/runtime/common.h"
4+
#include "ecsact/lib.hh"
5+
#include <boost/mp11.hpp>
6+
#include <map>
67

78
namespace ecsact::entt::detail {
89

10+
template<typename... Package>
11+
struct mp_components_t;
12+
13+
template<>
14+
struct mp_components_t<> {
15+
using type = ::ecsact::mp_list<>;
16+
};
17+
18+
template<typename Package>
19+
struct mp_components_t<Package> {
20+
using type = typename Package::components;
21+
};
22+
23+
template<typename HeadPackage, typename... Package>
24+
struct mp_components_t<HeadPackage, Package...> {
25+
using type =
26+
boost::mp11::mp_unique<boost::mp11::mp_flatten<boost::mp11::mp_push_back<
27+
typename mp_components_t<HeadPackage>::type,
28+
typename mp_components_t<Package...>::type>>>;
29+
};
30+
31+
template<typename... Package>
32+
struct mp_actions_t;
33+
34+
template<>
35+
struct mp_actions_t<> {
36+
using type = ::ecsact::mp_list<>;
37+
};
38+
39+
template<typename Package>
40+
struct mp_actions_t<Package> {
41+
using type = typename Package::actions;
42+
};
43+
44+
template<typename HeadPackage, typename... Package>
45+
struct mp_actions_t<HeadPackage, Package...> {
46+
using type =
47+
boost::mp11::mp_unique<boost::mp11::mp_flatten<boost::mp11::mp_push_back<
48+
typename mp_actions_t<HeadPackage>::type,
49+
typename mp_actions_t<Package...>::type>>>;
50+
};
51+
52+
template<typename... Package>
53+
struct mp_systems_t;
54+
55+
template<>
56+
struct mp_systems_t<> {
57+
using type = ::ecsact::mp_list<>;
58+
};
59+
60+
template<typename Package>
61+
struct mp_systems_t<Package> {
62+
using type = typename Package::systems;
63+
};
64+
65+
template<typename HeadPackage, typename... Package>
66+
struct mp_systems_t<HeadPackage, Package...> {
67+
using type =
68+
boost::mp11::mp_unique<boost::mp11::mp_flatten<boost::mp11::mp_push_back<
69+
typename mp_systems_t<HeadPackage>::type,
70+
typename mp_systems_t<Package...>::type>>>;
71+
};
72+
73+
template<typename Package>
74+
using mp_package_dependencies = typename Package::dependencies;
75+
76+
template<typename PackageList>
77+
using mp_package_dependencies_from_list = std::enable_if_t<
78+
!boost::mp11::mp_empty<PackageList>::value,
79+
boost::mp11::mp_flatten<
80+
boost::mp11::mp_transform<mp_package_dependencies, PackageList>>>;
81+
82+
/**
83+
* Given a list of packages return a list of all unique dependencies recursively
84+
*/
85+
template<typename PackageList>
86+
using mp_package_dependencies_recursive =
87+
boost::mp11::mp_unique<boost::mp11::mp_apply<
88+
boost::mp11::mp_append,
89+
boost::mp11::mp_iterate<
90+
PackageList,
91+
boost::mp11::mp_identity_t,
92+
mp_package_dependencies_from_list>>>;
93+
994
template<typename Package, typename Callback>
1095
void mp_for_each_available_component(Callback&& cb) {
96+
using boost::mp11::mp_append;
1197
using boost::mp11::mp_for_each;
12-
using components = typename Package::components;
13-
using dependencies = typename Package::dependencies;
98+
99+
using components = typename mp_append<
100+
mp_components_t<Package>,
101+
mp_package_dependencies_recursive<typename Package::dependencies>>::type;
14102

15103
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-
});
19104
}
20105

21106
template<typename Package, typename Callback>
22107
void mp_for_each_available_action(Callback&& cb) {
108+
using boost::mp11::mp_append;
23109
using boost::mp11::mp_for_each;
24-
using actions = typename Package::actions;
25-
using dependencies = typename Package::dependencies;
26110

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_action<D>(cb);
30-
});
111+
using actions = typename mp_append<
112+
mp_actions_t<Package>,
113+
mp_package_dependencies_recursive<typename Package::dependencies>>::type;
114+
115+
mp_for_each<actions>([&]<typename C>(const C& c) { cb(c); });
31116
}
32117

33118
template<typename Package, typename Callback>
34119
void mp_for_each_available_system(Callback&& cb) {
120+
using boost::mp11::mp_append;
35121
using boost::mp11::mp_for_each;
36-
using systems = typename Package::systems;
37-
using dependencies = typename Package::dependencies;
38122

39-
mp_for_each<systems>([&]<typename S>(const S& s) { cb(s); });
40-
mp_for_each<dependencies>([&]<typename D>(const D& d) {
41-
mp_for_each_available_system<D>(cb);
42-
});
123+
using systems = typename mp_append<
124+
mp_systems_t<Package>,
125+
mp_package_dependencies_recursive<typename Package::dependencies>>::type;
126+
127+
mp_for_each<systems>([&]<typename C>(const C& c) { cb(c); });
43128
}
44129

45130
template<typename Package, typename Callback>

0 commit comments

Comments
 (0)