diff --git a/src/entt/core/any.hpp b/src/entt/core/any.hpp index 1a097b3d4..8a99ddfe5 100644 --- a/src/entt/core/any.hpp +++ b/src/entt/core/any.hpp @@ -270,7 +270,7 @@ private: */ template Type any_cast(const any &data) ENTT_NOEXCEPT { - auto * const instance = any_cast>>(&data); + auto * const instance = any_cast>(&data); ENTT_ASSERT(instance); return static_cast(*instance); } @@ -279,23 +279,16 @@ Type any_cast(const any &data) ENTT_NOEXCEPT { /*! @copydoc any_cast */ template Type any_cast(any &data) ENTT_NOEXCEPT { - if constexpr(!std::is_reference_v || std::is_const_v>) { - // last attempt to make wrappers for const references return their values - auto * const instance = any_cast>>(&std::as_const(data)); - ENTT_ASSERT(instance); - return static_cast(*instance); - } else { - auto * const instance = any_cast>>(&data); - ENTT_ASSERT(instance); - return static_cast(*instance); - } + auto * const instance = any_cast, std::remove_reference_t, const Type>>(&data); + ENTT_ASSERT(instance); + return static_cast(*instance); } /*! @copydoc any_cast */ template Type any_cast(any &&data) ENTT_NOEXCEPT { - auto * const instance = any_cast>>(&data); + auto * const instance = any_cast, std::remove_reference_t, const Type>>(&data); ENTT_ASSERT(instance); return static_cast(std::move(*instance)); } @@ -311,7 +304,12 @@ const Type * any_cast(const any *data) ENTT_NOEXCEPT { /*! @copydoc any_cast */ template Type * any_cast(any *data) ENTT_NOEXCEPT { - return (data->type() == type_id() ? static_cast(data->data()) : nullptr); + if constexpr(std::is_const_v) { + // last attempt to make wrappers for const references return their values + return any_cast>(&std::as_const(*data)); + } else { + return (data->type() == type_id() ? static_cast(data->data()) : nullptr); + } } diff --git a/test/entt/core/any.cpp b/test/entt/core/any.cpp index 13691e3c6..5f1ef9318 100644 --- a/test/entt/core/any.cpp +++ b/test/entt/core/any.cpp @@ -68,9 +68,18 @@ TEST(Any, SBOAsRefConstruction) { ASSERT_TRUE(any); ASSERT_EQ(any.type(), entt::type_id()); + ASSERT_EQ(entt::any_cast(&any), nullptr); + ASSERT_EQ(entt::any_cast(&any), &value); + ASSERT_EQ(entt::any_cast(&any), &value); + ASSERT_EQ(entt::any_cast(&std::as_const(any)), &value); + ASSERT_EQ(entt::any_cast(&std::as_const(any)), &value); + + ASSERT_EQ(entt::any_cast(any), 42); ASSERT_EQ(entt::any_cast(any), 42); + ASSERT_EQ(any.data(), &value); + ASSERT_EQ(std::as_const(any).data(), &value); auto other = as_ref(any); @@ -86,10 +95,16 @@ TEST(Any, SBOAsConstRefConstruction) { ASSERT_TRUE(any); ASSERT_EQ(any.type(), entt::type_id()); + ASSERT_EQ(entt::any_cast(&any), nullptr); + ASSERT_EQ(entt::any_cast(&any), &value); ASSERT_EQ(entt::any_cast(&any), nullptr); + ASSERT_EQ(entt::any_cast(&std::as_const(any)), &value); + ASSERT_EQ(entt::any_cast(&std::as_const(any)), &value); + ASSERT_EQ(entt::any_cast(any), 42); ASSERT_EQ(entt::any_cast(any), 42); + ASSERT_EQ(any.data(), nullptr); ASSERT_EQ(std::as_const(any).data(), &value); @@ -186,9 +201,18 @@ TEST(Any, NoSBOAsRefConstruction) { ASSERT_TRUE(any); ASSERT_EQ(any.type(), entt::type_id()); + ASSERT_EQ(entt::any_cast(&any), nullptr); + ASSERT_EQ(entt::any_cast(&any), &instance); + ASSERT_EQ(entt::any_cast(&any), &instance); + ASSERT_EQ(entt::any_cast(&std::as_const(any)), &instance); + ASSERT_EQ(entt::any_cast(&std::as_const(any)), &instance); + + ASSERT_EQ(entt::any_cast(any), instance); ASSERT_EQ(entt::any_cast(any), instance); + ASSERT_EQ(any.data(), &instance); + ASSERT_EQ(std::as_const(any).data(), &instance); auto other = as_ref(any); @@ -204,10 +228,16 @@ TEST(Any, NoSBOAsConstRefConstruction) { ASSERT_TRUE(any); ASSERT_EQ(any.type(), entt::type_id()); + ASSERT_EQ(entt::any_cast(&any), nullptr); + ASSERT_EQ(entt::any_cast(&any), &instance); ASSERT_EQ(entt::any_cast(&any), nullptr); + ASSERT_EQ(entt::any_cast(&std::as_const(any)), &instance); + ASSERT_EQ(entt::any_cast(&std::as_const(any)), &instance); + ASSERT_EQ(entt::any_cast(any), instance); ASSERT_EQ(entt::any_cast(any), instance); + ASSERT_EQ(any.data(), nullptr); ASSERT_EQ(std::as_const(any).data(), &instance);