From 5a3e816544e64f263af8866ae3bbc128ca088f98 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Thu, 15 Oct 2020 17:02:50 +0200 Subject: [PATCH] view/groups: extended get (breaking changes) --- src/entt/entity/group.hpp | 26 ++++++++++++++++++++++---- src/entt/entity/view.hpp | 9 +++++++-- test/entt/entity/group.cpp | 14 ++++++++++++++ test/entt/entity/view.cpp | 12 ++++++++++-- 4 files changed, 53 insertions(+), 8 deletions(-) diff --git a/src/entt/entity/group.hpp b/src/entt/entity/group.hpp index cbc810778..e4469d875 100644 --- a/src/entt/entity/group.hpp +++ b/src/entt/entity/group.hpp @@ -419,10 +419,18 @@ public: * @return The components assigned to the entity. */ template - [[nodiscard]] decltype(auto) get([[maybe_unused]] const entity_type entt) const { + [[nodiscard]] decltype(auto) get(const entity_type entt) const { ENTT_ASSERT(contains(entt)); - if constexpr(sizeof...(Component) == 1) { + if constexpr(sizeof...(Component) == 0) { + return std::tuple_cat([entt](auto *cpool) { + if constexpr(is_eto_eligible_v::value_type>) { + return std::make_tuple(); + } else { + return std::forward_as_tuple(cpool->get(entt)); + } + }(std::get *>(pools))...); + } else if constexpr(sizeof...(Component) == 1) { return (std::get *>(pools)->get(entt), ...); } else { return std::tuple({}))...>{get(entt)...}; @@ -987,10 +995,20 @@ public: * @return The components assigned to the entity. */ template - [[nodiscard]] decltype(auto) get([[maybe_unused]] const entity_type entt) const { + [[nodiscard]] decltype(auto) get(const entity_type entt) const { ENTT_ASSERT(contains(entt)); - if constexpr(sizeof...(Component) == 1) { + if constexpr(sizeof...(Component) == 0) { + auto filter = [entt](auto *cpool) { + if constexpr(is_eto_eligible_v::value_type>) { + return std::make_tuple(); + } else { + return std::forward_as_tuple(cpool->get(entt)); + } + }; + + return std::tuple_cat(filter(std::get *>(pools))..., filter(std::get *>(pools))...); + } else if constexpr(sizeof...(Component) == 1) { return (std::get *>(pools)->get(entt), ...); } else { return std::tuple({}))...>{get(entt)...}; diff --git a/src/entt/entity/view.hpp b/src/entt/entity/view.hpp index 47ec203d6..5a85a8a0a 100644 --- a/src/entt/entity/view.hpp +++ b/src/entt/entity/view.hpp @@ -474,8 +474,13 @@ public: ENTT_ASSERT(contains(entt)); if constexpr(sizeof...(Comp) == 0) { - static_assert(sizeof...(Component) == 1, "Invalid component type"); - return (std::get *>(pools)->get(entt), ...); + return std::tuple_cat([entt](auto *cpool) { + if constexpr(is_eto_eligible_v::value_type>) { + return std::make_tuple(); + } else { + return std::forward_as_tuple(cpool->get(entt)); + } + }(std::get *>(pools))...); } else if constexpr(sizeof...(Comp) == 1) { return (std::get *>(pools)->get(entt), ...); } else { diff --git a/test/entt/entity/group.cpp b/test/entt/entity/group.cpp index a51319746..a972c9e9c 100644 --- a/test/entt/entity/group.cpp +++ b/test/entt/entity/group.cpp @@ -579,6 +579,13 @@ TEST(NonOwningGroup, SignalRace) { ASSERT_EQ(group.size(), 1u); } +TEST(NonOwningGroup, ExtendedGet) { + using type = decltype(std::declval().group(entt::get).get({})); + static_assert(std::tuple_size_v == 2u); + static_assert(std::is_same_v, int &>); + static_assert(std::is_same_v, char &>); +} + TEST(OwningGroup, Functionalities) { entt::registry registry; auto group = registry.group(entt::get); @@ -1265,3 +1272,10 @@ TEST(OwningGroup, PreventEarlyOptOut) { ASSERT_EQ(i, 2); }); } + +TEST(OwningGroup, ExtendedGet) { + using type = decltype(std::declval().group(entt::get).get({})); + static_assert(std::tuple_size_v == 2u); + static_assert(std::is_same_v, int &>); + static_assert(std::is_same_v, char &>); +} diff --git a/test/entt/entity/view.cpp b/test/entt/entity/view.cpp index ce5e16e45..4da9107ca 100644 --- a/test/entt/entity/view.cpp +++ b/test/entt/entity/view.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -623,7 +624,7 @@ TEST(MultiComponentView, ExcludedComponents) { if(entity == e0) { ASSERT_EQ(view.get(e0), 0); } else if(entity == e2) { - ASSERT_EQ(view.get(e2), 2); + ASSERT_EQ(std::get<0>(view.get(e2)), 2); } } @@ -636,7 +637,7 @@ TEST(MultiComponentView, ExcludedComponents) { ASSERT_TRUE(entity == e1 || entity == e3); if(entity == e1) { - ASSERT_EQ(view.get(e1), 1); + ASSERT_EQ(std::get<0>(view.get(e1)), 1); } else if(entity == e3) { ASSERT_EQ(view.get(e3), 3); } @@ -858,3 +859,10 @@ TEST(MultiComponentView, ChunkedWithExcludedComponents) { } }); } + +TEST(MultiComponentView, ExtendedGet) { + using type = decltype(std::declval().view().get({})); + static_assert(std::tuple_size_v == 2u); + static_assert(std::is_same_v, int &>); + static_assert(std::is_same_v, char &>); +}