mirror of
https://github.com/BlackMATov/ecs.hpp.git
synced 2025-12-15 03:05:25 +07:00
CI compilation fixes
This commit is contained in:
174
ecs.hpp
174
ecs.hpp
@@ -56,10 +56,62 @@ namespace ecs_hpp
|
|||||||
{
|
{
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
|
//
|
||||||
|
// as_const
|
||||||
|
//
|
||||||
|
|
||||||
template < typename T >
|
template < typename T >
|
||||||
constexpr std::add_const_t<T>& as_const(T& t) noexcept {
|
constexpr std::add_const_t<T>& as_const(T& t) noexcept {
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// tuple_tail
|
||||||
|
//
|
||||||
|
|
||||||
|
namespace impl
|
||||||
|
{
|
||||||
|
template < typename T, typename... Ts, std::size_t... Is >
|
||||||
|
std::tuple<Ts...> tuple_tail_impl(std::tuple<T, Ts...>&& t, std::index_sequence<Is...> iseq) {
|
||||||
|
(void)iseq;
|
||||||
|
return std::make_tuple(std::move(std::get<Is + 1u>(t))...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename T, typename... Ts, std::size_t... Is >
|
||||||
|
std::tuple<Ts...> tuple_tail_impl(const std::tuple<T, Ts...>& t, std::index_sequence<Is...> iseq) {
|
||||||
|
(void)iseq;
|
||||||
|
return std::make_tuple(std::get<Is + 1u>(t)...);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename T, typename... Ts >
|
||||||
|
std::tuple<Ts...> tuple_tail(std::tuple<T, Ts...>&& t) {
|
||||||
|
return impl::tuple_tail_impl(std::move(t), std::make_index_sequence<sizeof...(Ts)>());
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename T, typename... Ts >
|
||||||
|
std::tuple<Ts...> tuple_tail(const std::tuple<T, Ts...>& t) {
|
||||||
|
return impl::tuple_tail_impl(t, std::make_index_sequence<sizeof...(Ts)>());
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// tuple_contains
|
||||||
|
//
|
||||||
|
|
||||||
|
template < typename V >
|
||||||
|
bool tuple_contains(const std::tuple<>& t, const V& v) {
|
||||||
|
(void)t;
|
||||||
|
(void)v;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename V, typename T, typename... Ts >
|
||||||
|
bool tuple_contains(const std::tuple<T, Ts...>& t, const V& v) {
|
||||||
|
if ( std::get<0>(t) == v ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return tuple_contains(tuple_tail(t), v);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -674,34 +726,38 @@ namespace ecs_hpp
|
|||||||
template < typename T
|
template < typename T
|
||||||
, typename... Ts
|
, typename... Ts
|
||||||
, typename F
|
, typename F
|
||||||
, typename S
|
, typename Ss
|
||||||
, typename... Ss
|
|
||||||
, typename... Cs >
|
, typename... Cs >
|
||||||
void for_joined_components_impl_(
|
void for_joined_components_impl_(
|
||||||
const entity& e,
|
const entity& e,
|
||||||
const F& f,
|
const F& f,
|
||||||
detail::component_storage<S>* s,
|
const Ss& ss,
|
||||||
detail::component_storage<Ss>*... ss,
|
|
||||||
Cs&... cs);
|
Cs&... cs);
|
||||||
|
|
||||||
template < typename T
|
template < typename T
|
||||||
, typename... Ts
|
, typename... Ts
|
||||||
, typename F
|
, typename F
|
||||||
, typename S
|
, typename Ss
|
||||||
, typename... Ss
|
|
||||||
, typename... Cs >
|
, typename... Cs >
|
||||||
void for_joined_components_impl_(
|
void for_joined_components_impl_(
|
||||||
const entity& e,
|
const entity& e,
|
||||||
const F& f,
|
const F& f,
|
||||||
const detail::component_storage<S>* s,
|
const Ss& ss,
|
||||||
const detail::component_storage<Ss>*... ss,
|
|
||||||
const Cs&... cs) const;
|
const Cs&... cs) const;
|
||||||
|
|
||||||
template < typename F, typename... Cs >
|
template < typename F, typename... Cs >
|
||||||
void for_joined_components_impl_(const entity& e, const F& f, Cs&... cs);
|
void for_joined_components_impl_(
|
||||||
|
const entity& e,
|
||||||
|
const F& f,
|
||||||
|
const std::tuple<>& ss,
|
||||||
|
Cs&... cs);
|
||||||
|
|
||||||
template < typename F, typename... Cs >
|
template < typename F, typename... Cs >
|
||||||
void for_joined_components_impl_(const entity& e, const F& f, const Cs&... cs) const;
|
void for_joined_components_impl_(
|
||||||
|
const entity& e,
|
||||||
|
const F& f,
|
||||||
|
const std::tuple<>& ss,
|
||||||
|
const Cs&... cs) const;
|
||||||
private:
|
private:
|
||||||
entity_id last_entity_id_{0u};
|
entity_id last_entity_id_{0u};
|
||||||
std::vector<entity_id> free_entity_ids_;
|
std::vector<entity_id> free_entity_ids_;
|
||||||
@@ -1044,57 +1100,59 @@ namespace ecs_hpp
|
|||||||
: nullptr;
|
: nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename T, typename... Ts, typename F, std::size_t I, std::size_t... Is >
|
template < typename T
|
||||||
void registry::for_joined_components_impl_(F&& f, std::index_sequence<I, Is...> iseq) {
|
, typename... Ts
|
||||||
|
, typename F
|
||||||
|
, std::size_t I
|
||||||
|
, std::size_t... Is >
|
||||||
|
void registry::for_joined_components_impl_(
|
||||||
|
F&& f,
|
||||||
|
std::index_sequence<I, Is...> iseq)
|
||||||
|
{
|
||||||
(void)iseq;
|
(void)iseq;
|
||||||
for_each_component<T>([
|
const auto ss = std::make_tuple(find_storage_<Ts>()...);
|
||||||
this,
|
if ( !detail::tuple_contains(ss, nullptr) ) {
|
||||||
f = std::forward<F>(f),
|
for_each_component<T>([this, &f, &ss](const entity& e, T& t) {
|
||||||
storages = std::make_tuple(find_storage_<Ts>()...)
|
for_joined_components_impl_<Ts...>(e, f, ss, t);
|
||||||
](const entity& e, T& t) mutable {
|
});
|
||||||
for_joined_components_impl_<Ts...>(
|
}
|
||||||
e,
|
|
||||||
f,
|
|
||||||
std::get<Is - 1>(storages)...,
|
|
||||||
t);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
template < typename T, typename... Ts, typename F, std::size_t I, std::size_t... Is >
|
|
||||||
void registry::for_joined_components_impl_(F&& f, std::index_sequence<I, Is...> iseq) const {
|
|
||||||
(void)iseq;
|
|
||||||
for_each_component<T>([
|
|
||||||
this,
|
|
||||||
f = std::forward<F>(f),
|
|
||||||
storages = std::make_tuple(find_storage_<Ts>()...)
|
|
||||||
](const entity& e, const T& t) mutable {
|
|
||||||
for_joined_components_impl_<Ts...>(
|
|
||||||
e,
|
|
||||||
f,
|
|
||||||
std::get<Is - 1>(storages)...,
|
|
||||||
t);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename T
|
template < typename T
|
||||||
, typename... Ts
|
, typename... Ts
|
||||||
, typename F
|
, typename F
|
||||||
, typename S
|
, std::size_t I
|
||||||
, typename... Ss
|
, std::size_t... Is >
|
||||||
|
void registry::for_joined_components_impl_(
|
||||||
|
F&& f,
|
||||||
|
std::index_sequence<I, Is...> iseq) const
|
||||||
|
{
|
||||||
|
(void)iseq;
|
||||||
|
const auto ss = std::make_tuple(find_storage_<Ts>()...);
|
||||||
|
if ( !detail::tuple_contains(ss, nullptr) ) {
|
||||||
|
for_each_component<T>([this, &f, &ss](const entity& e, const T& t) {
|
||||||
|
detail::as_const(*this).for_joined_components_impl_<Ts...>(e, f, ss, t);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename T
|
||||||
|
, typename... Ts
|
||||||
|
, typename F
|
||||||
|
, typename Ss
|
||||||
, typename... Cs >
|
, typename... Cs >
|
||||||
void registry::for_joined_components_impl_(
|
void registry::for_joined_components_impl_(
|
||||||
const entity& e,
|
const entity& e,
|
||||||
const F& f,
|
const F& f,
|
||||||
detail::component_storage<S>* s,
|
const Ss& ss,
|
||||||
detail::component_storage<Ss>*... ss,
|
|
||||||
Cs&... cs)
|
Cs&... cs)
|
||||||
{
|
{
|
||||||
T* c = s->find(e.id());
|
T* c = std::get<0>(ss)->find(e.id());
|
||||||
if ( c ) {
|
if ( c ) {
|
||||||
for_joined_components_impl_<Ts...>(
|
for_joined_components_impl_<Ts...>(
|
||||||
e,
|
e,
|
||||||
f,
|
f,
|
||||||
std::forward<Ss>(ss)...,
|
detail::tuple_tail(ss),
|
||||||
cs...,
|
cs...,
|
||||||
*c);
|
*c);
|
||||||
}
|
}
|
||||||
@@ -1103,34 +1161,44 @@ namespace ecs_hpp
|
|||||||
template < typename T
|
template < typename T
|
||||||
, typename... Ts
|
, typename... Ts
|
||||||
, typename F
|
, typename F
|
||||||
, typename S
|
, typename Ss
|
||||||
, typename... Ss
|
|
||||||
, typename... Cs >
|
, typename... Cs >
|
||||||
void registry::for_joined_components_impl_(
|
void registry::for_joined_components_impl_(
|
||||||
const entity& e,
|
const entity& e,
|
||||||
const F& f,
|
const F& f,
|
||||||
const detail::component_storage<S>* s,
|
const Ss& ss,
|
||||||
const detail::component_storage<Ss>*... ss,
|
|
||||||
const Cs&... cs) const
|
const Cs&... cs) const
|
||||||
{
|
{
|
||||||
const T* c = s->find(e.id());
|
const T* c = std::get<0>(ss)->find(e.id());
|
||||||
if ( c ) {
|
if ( c ) {
|
||||||
for_joined_components_impl_<Ts...>(
|
for_joined_components_impl_<Ts...>(
|
||||||
e,
|
e,
|
||||||
f,
|
f,
|
||||||
std::forward<Ss>(ss)...,
|
detail::tuple_tail(ss),
|
||||||
cs...,
|
cs...,
|
||||||
*c);
|
*c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename F, typename... Cs >
|
template < typename F, typename... Cs >
|
||||||
void registry::for_joined_components_impl_(const entity& e, const F& f, Cs&... cs) {
|
void registry::for_joined_components_impl_(
|
||||||
|
const entity& e,
|
||||||
|
const F& f,
|
||||||
|
const std::tuple<>& ss,
|
||||||
|
Cs&... cs)
|
||||||
|
{
|
||||||
|
(void)ss;
|
||||||
f(e, cs...);
|
f(e, cs...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename F, typename... Cs >
|
template < typename F, typename... Cs >
|
||||||
void registry::for_joined_components_impl_(const entity& e, const F& f, const Cs&... cs) const {
|
void registry::for_joined_components_impl_(
|
||||||
|
const entity& e,
|
||||||
|
const F& f,
|
||||||
|
const std::tuple<>& ss,
|
||||||
|
const Cs&... cs) const
|
||||||
|
{
|
||||||
|
(void)ss;
|
||||||
f(e, cs...);
|
f(e, cs...);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,14 +41,31 @@ namespace
|
|||||||
|
|
||||||
TEST_CASE("detail") {
|
TEST_CASE("detail") {
|
||||||
SECTION("get_type_id") {
|
SECTION("get_type_id") {
|
||||||
REQUIRE(ecs::detail::type_family<position_c>::id() == 1u);
|
using namespace ecs::detail;
|
||||||
REQUIRE(ecs::detail::type_family<position_c>::id() == 1u);
|
REQUIRE(type_family<position_c>::id() == 1u);
|
||||||
|
REQUIRE(type_family<position_c>::id() == 1u);
|
||||||
|
|
||||||
REQUIRE(ecs::detail::type_family<velocity_c>::id() == 2u);
|
REQUIRE(type_family<velocity_c>::id() == 2u);
|
||||||
REQUIRE(ecs::detail::type_family<velocity_c>::id() == 2u);
|
REQUIRE(type_family<velocity_c>::id() == 2u);
|
||||||
|
|
||||||
REQUIRE(ecs::detail::type_family<position_c>::id() == 1u);
|
REQUIRE(type_family<position_c>::id() == 1u);
|
||||||
REQUIRE(ecs::detail::type_family<velocity_c>::id() == 2u);
|
REQUIRE(type_family<velocity_c>::id() == 2u);
|
||||||
|
}
|
||||||
|
SECTION("tuple_tail") {
|
||||||
|
using namespace ecs::detail;
|
||||||
|
{
|
||||||
|
REQUIRE(tuple_tail(std::make_tuple(1, 2, 3)) == std::make_tuple(2, 3));
|
||||||
|
REQUIRE(tuple_tail(std::make_tuple(2, 3)) == std::make_tuple(3));
|
||||||
|
REQUIRE(tuple_tail(std::make_tuple(3)) == std::make_tuple());
|
||||||
|
}
|
||||||
|
{
|
||||||
|
const auto t1 = std::make_tuple(1);
|
||||||
|
const auto t2 = std::make_tuple(1, 2);
|
||||||
|
const auto t3 = std::make_tuple(1, 2, 3);
|
||||||
|
REQUIRE(tuple_tail(t1) == std::make_tuple());
|
||||||
|
REQUIRE(tuple_tail(t2) == std::make_tuple(2));
|
||||||
|
REQUIRE(tuple_tail(t3) == std::make_tuple(2, 3));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
SECTION("sparse_set") {
|
SECTION("sparse_set") {
|
||||||
using namespace ecs::detail;
|
using namespace ecs::detail;
|
||||||
@@ -523,6 +540,15 @@ TEST_CASE("registry") {
|
|||||||
REQUIRE(acc2 == 16);
|
REQUIRE(acc2 == 16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
ecs::registry w;
|
||||||
|
auto e1 = w.create_entity();
|
||||||
|
e1.assign_component<position_c>(1, 2);
|
||||||
|
w.for_joined_components<position_c, velocity_c>([](
|
||||||
|
ecs::entity, const position_c&, const velocity_c&)
|
||||||
|
{
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
SECTION("systems") {
|
SECTION("systems") {
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user