From dcddb7d50e4f7c3fe39ba8fa4b4ef5778a64ffc1 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Wed, 30 Jun 2021 09:35:36 +0200 Subject: [PATCH] registry: allow non-const types in const overloads of registry context variable getters (close #720) --- src/entt/entity/registry.hpp | 8 ++++---- test/entt/entity/registry.cpp | 32 ++++++++++++++++++++++---------- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/entt/entity/registry.hpp b/src/entt/entity/registry.hpp index 8108fb539..101ea819b 100644 --- a/src/entt/entity/registry.hpp +++ b/src/entt/entity/registry.hpp @@ -1633,9 +1633,9 @@ public: * registry, a null pointer otherwise. */ template - [[nodiscard]] Type * try_ctx() const { + [[nodiscard]] std::add_const_t * try_ctx() const { auto it = std::find_if(vars.cbegin(), vars.cend(), [type = type_id()](auto &&var) { return var.type() == type; }); - return it == vars.cend() ? nullptr : any_cast(&*it); + return it == vars.cend() ? nullptr : any_cast>(&*it); } /*! @copydoc try_ctx */ @@ -1656,10 +1656,10 @@ public: * @return A valid reference to the object in the context of the registry. */ template - [[nodiscard]] Type & ctx() const { + [[nodiscard]] std::add_const_t & ctx() const { auto it = std::find_if(vars.cbegin(), vars.cend(), [type = type_id()](auto &&var) { return var.type() == type; }); ENTT_ASSERT(it != vars.cend(), "Invalid instance"); - return any_cast(*it); + return any_cast &>(*it); } /*! @copydoc ctx */ diff --git a/test/entt/entity/registry.cpp b/test/entt/entity/registry.cpp index fa65a8174..e333a823d 100644 --- a/test/entt/entity/registry.cpp +++ b/test/entt/entity/registry.cpp @@ -1751,20 +1751,32 @@ TEST(Registry, GetOrEmplace) { TEST(Registry, Constness) { entt::registry registry; - ASSERT_TRUE((std::is_same_v({})), int &>)); - ASSERT_TRUE((std::is_same_v({})), void>)); + static_assert((std::is_same_v({})), int &>)); + static_assert((std::is_same_v({})), void>)); - ASSERT_TRUE((std::is_same_v({})), int &>)); - ASSERT_TRUE((std::is_same_v({})), std::tuple>)); + static_assert((std::is_same_v({})), int &>)); + static_assert((std::is_same_v({})), std::tuple>)); - ASSERT_TRUE((std::is_same_v({})), int *>)); - ASSERT_TRUE((std::is_same_v({})), std::tuple>)); + static_assert((std::is_same_v({})), int *>)); + static_assert((std::is_same_v({})), std::tuple>)); - ASSERT_TRUE((std::is_same_v({})), const int &>)); - ASSERT_TRUE((std::is_same_v({})), std::tuple>)); + static_assert((std::is_same_v()), int &>)); + static_assert((std::is_same_v()), const char &>)); - ASSERT_TRUE((std::is_same_v({})), const int *>)); - ASSERT_TRUE((std::is_same_v({})), std::tuple>)); + static_assert((std::is_same_v()), int *>)); + static_assert((std::is_same_v()), const char *>)); + + static_assert((std::is_same_v({})), const int &>)); + static_assert((std::is_same_v({})), std::tuple>)); + + static_assert((std::is_same_v({})), const int *>)); + static_assert((std::is_same_v({})), std::tuple>)); + + static_assert((std::is_same_v()), const int &>)); + static_assert((std::is_same_v()), const char &>)); + + static_assert((std::is_same_v()), const int *>)); + static_assert((std::is_same_v()), const char *>)); } TEST(Registry, MoveOnlyComponent) {