any: as_ref() on empty returns empty

This commit is contained in:
skypjack
2026-02-12 09:18:26 +01:00
parent 0bb54130c9
commit 071febbc0c
3 changed files with 48 additions and 1 deletions

View File

@@ -484,7 +484,18 @@ public:
*/
[[nodiscard]] basic_any as_ref() noexcept {
basic_any other = std::as_const(*this).as_ref();
other.mode = (mode == any_policy::cref ? any_policy::cref : any_policy::ref);
switch(mode) {
using enum any_policy;
case cref:
case empty:
other.mode = mode;
break;
default:
other.mode = any_policy::ref;
break;
}
return other;
}

View File

@@ -57,6 +57,26 @@ TEST(Any, Empty) {
ASSERT_EQ(any.data(), nullptr);
}
TEST(Any, EmptyAsRef) {
entt::any any{};
ASSERT_FALSE(any);
ASSERT_FALSE(any.owner());
ASSERT_EQ(any.policy(), entt::any_policy::empty);
ASSERT_EQ(any.info(), entt::type_id<void>());
ASSERT_EQ(entt::any_cast<double>(&any), nullptr);
ASSERT_EQ(any.data(), nullptr);
auto other = any.as_ref();
ASSERT_FALSE(other);
ASSERT_FALSE(other.owner());
ASSERT_EQ(other.policy(), entt::any_policy::empty);
ASSERT_EQ(other.info(), entt::type_id<void>());
ASSERT_EQ(entt::any_cast<double>(&other), nullptr);
ASSERT_EQ(other.data(), nullptr);
}
TEST(Any, HasValue) {
entt::any any{};

View File

@@ -131,6 +131,22 @@ TEST_F(MetaAny, Empty) {
ASSERT_FALSE(std::as_const(any).as_associative_container());
}
TEST_F(MetaAny, EmptyAsRef) {
entt::meta_any any{};
ASSERT_FALSE(any);
ASSERT_FALSE(any.type());
ASSERT_EQ(any.base().data(), nullptr);
ASSERT_EQ(any, entt::meta_any{});
auto other = any.as_ref();
ASSERT_FALSE(other);
ASSERT_FALSE(other.type());
ASSERT_EQ(other.base().data(), nullptr);
ASSERT_EQ(other, entt::meta_any{});
}
TEST_F(MetaAny, Context) {
entt::meta_any any{};
const entt::meta_ctx ctx{};