From 206d31f27aed35083b32a2841db225e685cb9ff2 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Wed, 23 Jun 2021 15:37:46 +0200 Subject: [PATCH] registry: const ::view/::group also support non-const types (close #715) --- src/entt/entity/registry.hpp | 11 ++++------- test/entt/entity/group.cpp | 8 ++++++++ test/entt/entity/view.cpp | 8 ++++++++ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/entt/entity/registry.hpp b/src/entt/entity/registry.hpp index 760f74392..8838b67ec 100644 --- a/src/entt/entity/registry.hpp +++ b/src/entt/entity/registry.hpp @@ -1120,9 +1120,8 @@ public: * @return A newly created view. */ template - [[nodiscard]] basic_view, Component...> view(exclude_t = {}) const { + [[nodiscard]] basic_view, std::add_const_t...> view(exclude_t = {}) const { static_assert(sizeof...(Component) > 0, "Exclusion-only views are not supported"); - static_assert((std::is_const_v && ...), "Invalid non-const type"); return { *assure>()..., *assure()... }; } @@ -1297,9 +1296,7 @@ public: * @return A newly created group. */ template - [[nodiscard]] basic_group, get_t, Owned...> group_if_exists(get_t, exclude_t = {}) const { - static_assert(std::conjunction_v..., std::is_const...>, "Invalid non-const type"); - + [[nodiscard]] basic_group, get_t...>, std::add_const_t...> group_if_exists(get_t, exclude_t = {}) const { if(auto it = std::find_if(groups.cbegin(), groups.cend(), [](const auto &gdata) { return gdata.size == (sizeof...(Owned) + sizeof...(Get) + sizeof...(Exclude)) && (gdata.owned(type_hash>::value()) && ...) @@ -1338,8 +1335,8 @@ public: * @return A newly created group. */ template - [[nodiscard]] basic_group, get_t<>, Owned...> group_if_exists(exclude_t = {}) const { - return group_if_exists(get_t<>{}, exclude); + [[nodiscard]] basic_group, get_t<>, std::add_const_t...> group_if_exists(exclude_t = {}) const { + return group_if_exists...>(get_t<>{}, exclude); } /** diff --git a/test/entt/entity/group.cpp b/test/entt/entity/group.cpp index a24a600e0..18ba3256b 100644 --- a/test/entt/entity/group.cpp +++ b/test/entt/entity/group.cpp @@ -364,6 +364,10 @@ TEST(NonOwningGroup, ConstNonConstAndAllInBetween) { static_assert(std::is_same_v>); static_assert(std::is_same_v); + static_assert(std::is_same_v)), decltype(std::as_const(registry).group_if_exists(entt::get))>); + static_assert(std::is_same_v)), decltype(std::as_const(registry).group_if_exists(entt::get))>); + static_assert(std::is_same_v)), decltype(std::as_const(registry).group_if_exists(entt::get))>); + group.each([](auto &&i, auto &&c) { static_assert(std::is_same_v); static_assert(std::is_same_v); @@ -1065,6 +1069,10 @@ TEST(OwningGroup, ConstNonConstAndAllInBetween) { static_assert(std::is_same_v()), const char * const *>); static_assert(std::is_same_v()), int **>); + static_assert(std::is_same_v(entt::get)), decltype(std::as_const(registry).group_if_exists(entt::get))>); + static_assert(std::is_same_v(entt::get)), decltype(std::as_const(registry).group_if_exists(entt::get))>); + static_assert(std::is_same_v(entt::get)), decltype(std::as_const(registry).group_if_exists(entt::get))>); + group.each([](auto &&i, auto &&c, auto &&d, auto &&f) { static_assert(std::is_same_v); static_assert(std::is_same_v); diff --git a/test/entt/entity/view.cpp b/test/entt/entity/view.cpp index 50bd77339..0fcccaec6 100644 --- a/test/entt/entity/view.cpp +++ b/test/entt/entity/view.cpp @@ -241,6 +241,8 @@ TEST(SingleComponentView, ConstNonConstAndAllInBetween) { static_assert(std::is_same_v>); static_assert(std::is_same_v); + static_assert(std::is_same_v()), decltype(cview)>); + view.each([](auto &&i) { static_assert(std::is_same_v); }); @@ -276,6 +278,8 @@ TEST(SingleComponentView, ConstNonConstAndAllInBetweenWithEmptyType) { static_assert(std::is_same_v>); static_assert(std::is_same_v>); + static_assert(std::is_same_v()), decltype(cview)>); + for(auto [entt]: view.each()) { static_assert(std::is_same_v); } @@ -780,6 +784,10 @@ TEST(MultiComponentView, ConstNonConstAndAllInBetween) { static_assert(std::is_same_v({})), std::tuple>); static_assert(std::is_same_v>); + static_assert(std::is_same_v()), decltype(std::as_const(registry).view())>); + static_assert(std::is_same_v()), decltype(std::as_const(registry).view())>); + static_assert(std::is_same_v()), decltype(std::as_const(registry).view())>); + view.each([](auto &&i, auto &&c) { static_assert(std::is_same_v); static_assert(std::is_same_v);