Skip to content

Commit

Permalink
meta: as_ref for void types still returns a valid meta_any
Browse files Browse the repository at this point in the history
  • Loading branch information
skypjack committed Feb 3, 2025
1 parent 303801c commit 8e6bbc4
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 4 deletions.
1 change: 0 additions & 1 deletion TODO
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,3 @@ TODO:
* allow passing arguments to meta setter/getter (we can fallback on meta invoke for everything probably)
* delegate/sigh: forward connect/disconnect from & to *
* a few more tests on the improved shrink_to_fit for sparse arrays
* meta_any::as_ref for void type invalidates the object (operator bool: true -> false)
2 changes: 1 addition & 1 deletion src/entt/meta/meta.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ class meta_any {
meta_any(const meta_any &other, any ref) noexcept
: storage{std::move(ref)},
ctx{other.ctx} {
if(storage) {
if(storage || !other.storage) {
node = other.node;
vtable = other.vtable;
}
Expand Down
33 changes: 31 additions & 2 deletions test/entt/meta/meta_any.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -858,6 +858,35 @@ TEST_F(MetaAny, VoidInPlaceTypeConstruction) {
ASSERT_NE(entt::meta_any{3}, any);
}

TEST_F(MetaAny, VoidAsRefConstruction) {
entt::meta_any any{std::in_place_type<void>};

ASSERT_TRUE(any);
ASSERT_FALSE(any.base().owner());
ASSERT_EQ(any.base().policy(), entt::any_policy::empty);
ASSERT_EQ(any.type(), entt::resolve<void>());

ASSERT_FALSE(any.try_cast<std::size_t>());
ASSERT_EQ(any.base().data(), nullptr);

ASSERT_EQ(any, entt::meta_any{std::in_place_type<void>});
ASSERT_EQ(entt::meta_any{std::in_place_type<void>}, any);
ASSERT_NE(entt::meta_any{3}, any);

any = entt::meta_any{std::in_place_type<void>};

ASSERT_TRUE(any);
ASSERT_EQ(any.type(), entt::resolve<void>());
ASSERT_EQ(any.base().data(), nullptr);

auto other = any.as_ref();

ASSERT_TRUE(other);
ASSERT_EQ(any.type(), entt::resolve<void>());
ASSERT_EQ(any.base().data(), nullptr);
ASSERT_EQ(other.base().data(), any.base().data());
}

TEST_F(MetaAny, VoidCopyConstruction) {
const entt::meta_any any{std::in_place_type<void>};
entt::meta_any other{any};
Expand Down Expand Up @@ -1201,8 +1230,8 @@ TEST_F(MetaAny, AsRef) {
cref = std::as_const(any).as_ref();

ASSERT_TRUE(any);
ASSERT_FALSE(ref);
ASSERT_FALSE(cref);
ASSERT_TRUE(ref);
ASSERT_TRUE(cref);
}

ENTT_DEBUG_TEST_F(MetaAnyDeathTest, AsRef) {
Expand Down

0 comments on commit 8e6bbc4

Please sign in to comment.