| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824 |
- #include <gtest/gtest.h>
- #include <entt/core/hashed_string.hpp>
- #include <entt/meta/factory.hpp>
- #include <entt/meta/meta.hpp>
- #include <entt/meta/resolve.hpp>
- struct clazz_t {
- clazz_t(): value{0} {}
- void member(int i) { value = i; }
- static void func() { c = 'd'; }
- static inline char c = 'c';
- int value;
- };
- struct empty_t {
- virtual ~empty_t() = default;
- static void destroy(empty_t &) {
- ++counter;
- }
- inline static int counter = 0;
- };
- struct fat_t: empty_t {
- fat_t(): foo{}, bar{}, gnam{} {}
- fat_t(int *value)
- : foo{value}, bar{value}, gnam{}
- {}
- bool operator==(const fat_t &other) const {
- return foo == other.foo && bar == other.bar;
- }
- int *foo;
- int *bar;
- double gnam[4];
- };
- struct not_comparable_t {
- bool operator==(const not_comparable_t &) const = delete;
- };
- struct unmanageable_t {
- unmanageable_t() = default;
- unmanageable_t(const unmanageable_t &) = delete;
- unmanageable_t(unmanageable_t &&) = delete;
- unmanageable_t & operator=(const unmanageable_t &) = delete;
- unmanageable_t & operator=(unmanageable_t &&) = delete;
- };
- struct MetaAny: ::testing::Test {
- void SetUp() override {
- using namespace entt::literals;
- entt::meta<double>()
- .type("double"_hs)
- .conv<int>();
- entt::meta<empty_t>()
- .type("empty"_hs)
- .dtor<&empty_t::destroy>();
- entt::meta<fat_t>()
- .type("fat"_hs)
- .base<empty_t>()
- .dtor<&fat_t::destroy>();
- entt::meta<clazz_t>()
- .type("clazz"_hs)
- .data<&clazz_t::value>("value"_hs)
- .func<&clazz_t::member>("member"_hs)
- .func<&clazz_t::func>("func"_hs);
- empty_t::counter = 0;
- }
- void TearDown() override {
- for(auto type: entt::resolve()) {
- type.reset();
- }
- }
- };
- TEST_F(MetaAny, SBO) {
- entt::meta_any any{'c'};
- ASSERT_TRUE(any);
- ASSERT_FALSE(any.try_cast<std::size_t>());
- ASSERT_EQ(any.cast<char>(), 'c');
- ASSERT_NE(any.data(), nullptr);
- ASSERT_EQ(any, entt::meta_any{'c'});
- ASSERT_NE(entt::meta_any{'h'}, any);
- }
- TEST_F(MetaAny, NoSBO) {
- int value = 42;
- fat_t instance{&value};
- entt::meta_any any{instance};
- ASSERT_TRUE(any);
- ASSERT_FALSE(any.try_cast<std::size_t>());
- ASSERT_EQ(any.cast<fat_t>(), instance);
- ASSERT_NE(any.data(), nullptr);
- ASSERT_EQ(any, entt::meta_any{instance});
- ASSERT_NE(fat_t{}, any);
- }
- TEST_F(MetaAny, Empty) {
- entt::meta_any any{};
- ASSERT_FALSE(any);
- ASSERT_FALSE(any.type());
- ASSERT_FALSE(any.try_cast<std::size_t>());
- ASSERT_EQ(any.data(), nullptr);
- ASSERT_EQ(any, entt::meta_any{});
- ASSERT_NE(entt::meta_any{'c'}, any);
- }
- TEST_F(MetaAny, SBOInPlaceTypeConstruction) {
- entt::meta_any any{std::in_place_type<int>, 42};
- ASSERT_TRUE(any);
- ASSERT_FALSE(any.try_cast<std::size_t>());
- ASSERT_EQ(any.cast<int>(), 42);
- ASSERT_NE(any.data(), nullptr);
- ASSERT_EQ(any, (entt::meta_any{std::in_place_type<int>, 42}));
- ASSERT_EQ(any, entt::meta_any{42});
- ASSERT_NE(entt::meta_any{3}, any);
- }
- TEST_F(MetaAny, SBOAsRefConstruction) {
- int value = 3;
- int other = 42;
- entt::meta_any any{std::ref(value)};
- ASSERT_TRUE(any);
- ASSERT_FALSE(any.try_cast<std::size_t>());
- ASSERT_EQ(any.cast<int &>(), 3);
- ASSERT_EQ(any.cast<const int &>(), 3);
- ASSERT_EQ(any.cast<int>(), 3);
- ASSERT_NE(any.data(), nullptr);
- ASSERT_NE(std::as_const(any).data(), nullptr);
- ASSERT_EQ(any, (entt::meta_any{std::ref(value)}));
- ASSERT_NE(any, (entt::meta_any{std::ref(other)}));
- ASSERT_NE(any, entt::meta_any{42});
- ASSERT_EQ(entt::meta_any{3}, any);
- }
- TEST_F(MetaAny, SBOAsConstRefConstruction) {
- int value = 3;
- int other = 42;
- entt::meta_any any{std::cref(value)};
- ASSERT_TRUE(any);
- ASSERT_FALSE(any.try_cast<std::size_t>());
- ASSERT_DEATH(any.cast<int &>() = 3, "");
- ASSERT_EQ(any.cast<const int &>(), 3);
- ASSERT_EQ(any.cast<int>(), 3);
- ASSERT_EQ(any.data(), nullptr);
- ASSERT_NE(std::as_const(any).data(), nullptr);
- ASSERT_EQ(any, (entt::meta_any{std::cref(value)}));
- ASSERT_NE(any, (entt::meta_any{std::cref(other)}));
- ASSERT_NE(any, entt::meta_any{42});
- ASSERT_EQ(entt::meta_any{3}, any);
- }
- TEST_F(MetaAny, SBOCopyConstruction) {
- entt::meta_any any{42};
- entt::meta_any other{any};
- ASSERT_TRUE(any);
- ASSERT_TRUE(other);
- ASSERT_FALSE(other.try_cast<std::size_t>());
- ASSERT_EQ(other.cast<int>(), 42);
- ASSERT_EQ(other, entt::meta_any{42});
- ASSERT_NE(other, entt::meta_any{0});
- }
- TEST_F(MetaAny, SBOCopyAssignment) {
- entt::meta_any any{42};
- entt::meta_any other{3};
- other = any;
- ASSERT_TRUE(any);
- ASSERT_TRUE(other);
- ASSERT_FALSE(other.try_cast<std::size_t>());
- ASSERT_EQ(other.cast<int>(), 42);
- ASSERT_EQ(other, entt::meta_any{42});
- ASSERT_NE(other, entt::meta_any{0});
- }
- TEST_F(MetaAny, SBOMoveConstruction) {
- entt::meta_any any{42};
- entt::meta_any other{std::move(any)};
- ASSERT_FALSE(any);
- ASSERT_TRUE(other);
- ASSERT_FALSE(other.try_cast<std::size_t>());
- ASSERT_EQ(other.cast<int>(), 42);
- ASSERT_EQ(other, entt::meta_any{42});
- ASSERT_NE(other, entt::meta_any{0});
- }
- TEST_F(MetaAny, SBOMoveAssignment) {
- entt::meta_any any{42};
- entt::meta_any other{3};
- other = std::move(any);
- ASSERT_FALSE(any);
- ASSERT_TRUE(other);
- ASSERT_FALSE(other.try_cast<std::size_t>());
- ASSERT_EQ(other.cast<int>(), 42);
- ASSERT_EQ(other, entt::meta_any{42});
- ASSERT_NE(other, entt::meta_any{0});
- }
- TEST_F(MetaAny, SBODirectAssignment) {
- entt::meta_any any{};
- any = 42;
- ASSERT_FALSE(any.try_cast<std::size_t>());
- ASSERT_EQ(any.cast<int>(), 42);
- ASSERT_EQ(any, entt::meta_any{42});
- ASSERT_NE(entt::meta_any{0}, any);
- }
- TEST_F(MetaAny, NoSBOInPlaceTypeConstruction) {
- int value = 42;
- fat_t instance{&value};
- entt::meta_any any{std::in_place_type<fat_t>, instance};
- ASSERT_TRUE(any);
- ASSERT_FALSE(any.try_cast<std::size_t>());
- ASSERT_EQ(any.cast<fat_t>(), instance);
- ASSERT_NE(any.data(), nullptr);
- ASSERT_EQ(any, (entt::meta_any{std::in_place_type<fat_t>, instance}));
- ASSERT_EQ(any, entt::meta_any{instance});
- ASSERT_NE(entt::meta_any{fat_t{}}, any);
- }
- TEST_F(MetaAny, NoSBOAsRefConstruction) {
- int value = 3;
- fat_t instance{&value};
- entt::meta_any any{std::ref(instance)};
- ASSERT_TRUE(any);
- ASSERT_FALSE(any.try_cast<std::size_t>());
- ASSERT_EQ(any.cast<fat_t &>(), instance);
- ASSERT_EQ(any.cast<const fat_t &>(), instance);
- ASSERT_EQ(any.cast<fat_t>(), instance);
- ASSERT_NE(any.data(), nullptr);
- ASSERT_NE(std::as_const(any).data(), nullptr);
- ASSERT_EQ(any, (entt::meta_any{std::ref(instance)}));
- ASSERT_EQ(any, entt::meta_any{instance});
- ASSERT_NE(entt::meta_any{fat_t{}}, any);
- }
- TEST_F(MetaAny, NoSBOAsConstRefConstruction) {
- int value = 3;
- fat_t instance{&value};
- entt::meta_any any{std::cref(instance)};
- ASSERT_TRUE(any);
- ASSERT_FALSE(any.try_cast<std::size_t>());
- ASSERT_DEATH(any.cast<fat_t &>() = {}, "");
- ASSERT_EQ(any.cast<const fat_t &>(), instance);
- ASSERT_EQ(any.cast<fat_t>(), instance);
- ASSERT_EQ(any.data(), nullptr);
- ASSERT_NE(std::as_const(any).data(), nullptr);
- ASSERT_EQ(any, (entt::meta_any{std::cref(instance)}));
- ASSERT_EQ(any, entt::meta_any{instance});
- ASSERT_NE(entt::meta_any{fat_t{}}, any);
- }
- TEST_F(MetaAny, NoSBOCopyConstruction) {
- int value = 42;
- fat_t instance{&value};
- entt::meta_any any{instance};
- entt::meta_any other{any};
- ASSERT_TRUE(any);
- ASSERT_TRUE(other);
- ASSERT_FALSE(other.try_cast<std::size_t>());
- ASSERT_EQ(other.cast<fat_t>(), instance);
- ASSERT_EQ(other, entt::meta_any{instance});
- ASSERT_NE(other, fat_t{});
- }
- TEST_F(MetaAny, NoSBOCopyAssignment) {
- int value = 42;
- fat_t instance{&value};
- entt::meta_any any{instance};
- entt::meta_any other{3};
- other = any;
- ASSERT_TRUE(any);
- ASSERT_TRUE(other);
- ASSERT_FALSE(other.try_cast<std::size_t>());
- ASSERT_EQ(other.cast<fat_t>(), instance);
- ASSERT_EQ(other, entt::meta_any{instance});
- ASSERT_NE(other, fat_t{});
- }
- TEST_F(MetaAny, NoSBOMoveConstruction) {
- int value = 42;
- fat_t instance{&value};
- entt::meta_any any{instance};
- entt::meta_any other{std::move(any)};
- ASSERT_FALSE(any);
- ASSERT_TRUE(other);
- ASSERT_FALSE(other.try_cast<std::size_t>());
- ASSERT_EQ(other.cast<fat_t>(), instance);
- ASSERT_EQ(other, entt::meta_any{instance});
- ASSERT_NE(other, fat_t{});
- }
- TEST_F(MetaAny, NoSBOMoveAssignment) {
- int value = 42;
- fat_t instance{&value};
- entt::meta_any any{instance};
- entt::meta_any other{3};
- other = std::move(any);
- ASSERT_FALSE(any);
- ASSERT_TRUE(other);
- ASSERT_FALSE(other.try_cast<std::size_t>());
- ASSERT_EQ(other.cast<fat_t>(), instance);
- ASSERT_EQ(other, entt::meta_any{instance});
- ASSERT_NE(other, fat_t{});
- }
- TEST_F(MetaAny, NoSBODirectAssignment) {
- int value = 42;
- entt::meta_any any{};
- any = fat_t{&value};
- ASSERT_FALSE(any.try_cast<std::size_t>());
- ASSERT_EQ(any.cast<fat_t>(), fat_t{&value});
- ASSERT_EQ(any, entt::meta_any{fat_t{&value}});
- ASSERT_NE(fat_t{}, any);
- }
- TEST_F(MetaAny, VoidInPlaceTypeConstruction) {
- entt::meta_any any{std::in_place_type<void>};
- ASSERT_TRUE(any);
- ASSERT_FALSE(any.try_cast<char>());
- ASSERT_EQ(any.data(), nullptr);
- ASSERT_EQ(any.type(), entt::resolve<void>());
- ASSERT_EQ(any, entt::meta_any{std::in_place_type<void>});
- ASSERT_NE(entt::meta_any{3}, any);
- }
- TEST_F(MetaAny, VoidCopyConstruction) {
- entt::meta_any any{std::in_place_type<void>};
- entt::meta_any other{any};
- ASSERT_TRUE(any);
- ASSERT_TRUE(other);
- ASSERT_EQ(any.type(), entt::resolve<void>());
- ASSERT_EQ(other, entt::meta_any{std::in_place_type<void>});
- }
- TEST_F(MetaAny, VoidCopyAssignment) {
- entt::meta_any any{std::in_place_type<void>};
- entt::meta_any other{std::in_place_type<void>};
- other = any;
- ASSERT_TRUE(any);
- ASSERT_TRUE(other);
- ASSERT_EQ(any.type(), entt::resolve<void>());
- ASSERT_EQ(other, entt::meta_any{std::in_place_type<void>});
- }
- TEST_F(MetaAny, VoidMoveConstruction) {
- entt::meta_any any{std::in_place_type<void>};
- entt::meta_any other{std::move(any)};
- ASSERT_FALSE(any);
- ASSERT_TRUE(other);
- ASSERT_EQ(other.type(), entt::resolve<void>());
- ASSERT_EQ(other, entt::meta_any{std::in_place_type<void>});
- }
- TEST_F(MetaAny, VoidMoveAssignment) {
- entt::meta_any any{std::in_place_type<void>};
- entt::meta_any other{std::in_place_type<void>};
- other = std::move(any);
- ASSERT_FALSE(any);
- ASSERT_TRUE(other);
- ASSERT_EQ(other.type(), entt::resolve<void>());
- ASSERT_EQ(other, entt::meta_any{std::in_place_type<void>});
- }
- TEST_F(MetaAny, SBOMoveInvalidate) {
- entt::meta_any any{42};
- entt::meta_any other{std::move(any)};
- entt::meta_any valid = std::move(other);
- ASSERT_FALSE(any);
- ASSERT_FALSE(other);
- ASSERT_TRUE(valid);
- }
- TEST_F(MetaAny, NoSBOMoveInvalidate) {
- int value = 42;
- fat_t instance{&value};
- entt::meta_any any{instance};
- entt::meta_any other{std::move(any)};
- entt::meta_any valid = std::move(other);
- ASSERT_FALSE(any);
- ASSERT_FALSE(other);
- ASSERT_TRUE(valid);
- }
- TEST_F(MetaAny, VoidMoveInvalidate) {
- entt::meta_any any{std::in_place_type<void>};
- entt::meta_any other{std::move(any)};
- entt::meta_any valid = std::move(other);
- ASSERT_FALSE(any);
- ASSERT_FALSE(other);
- ASSERT_TRUE(valid);
- }
- TEST_F(MetaAny, SBODestruction) {
- ASSERT_EQ(empty_t::counter, 0);
- { entt::meta_any any{empty_t{}}; }
- ASSERT_EQ(empty_t::counter, 1);
- }
- TEST_F(MetaAny, NoSBODestruction) {
- ASSERT_EQ(fat_t::counter, 0);
- { entt::meta_any any{fat_t{}}; }
- ASSERT_EQ(fat_t::counter, 1);
- }
- TEST_F(MetaAny, VoidDestruction) {
- // just let asan tell us if everything is ok here
- [[maybe_unused]] entt::meta_any any{std::in_place_type<void>};
- }
- TEST_F(MetaAny, Emplace) {
- entt::meta_any any{};
- any.emplace<int>(42);
- ASSERT_TRUE(any);
- ASSERT_FALSE(any.try_cast<std::size_t>());
- ASSERT_EQ(any.cast<int>(), 42);
- ASSERT_NE(any.data(), nullptr);
- ASSERT_EQ(any, (entt::meta_any{std::in_place_type<int>, 42}));
- ASSERT_EQ(any, entt::meta_any{42});
- ASSERT_NE(entt::meta_any{3}, any);
- }
- TEST_F(MetaAny, EmplaceVoid) {
- entt::meta_any any{};
- any.emplace<void>();
- ASSERT_TRUE(any);
- ASSERT_EQ(any.data(), nullptr);
- ASSERT_EQ(any.type(), entt::resolve<void>());
- ASSERT_EQ(any, (entt::meta_any{std::in_place_type<void>}));
- }
- TEST_F(MetaAny, Reset) {
- entt::meta_any any{42};
- ASSERT_TRUE(any);
- ASSERT_EQ(any.type(), entt::resolve<int>());
- any.reset();
- ASSERT_FALSE(any);
- ASSERT_EQ(any.type(), entt::meta_type{});
- }
- TEST_F(MetaAny, SBOSwap) {
- entt::meta_any lhs{'c'};
- entt::meta_any rhs{42};
- std::swap(lhs, rhs);
- ASSERT_FALSE(lhs.try_cast<char>());
- ASSERT_EQ(lhs.cast<int>(), 42);
- ASSERT_FALSE(rhs.try_cast<int>());
- ASSERT_EQ(rhs.cast<char>(), 'c');
- }
- TEST_F(MetaAny, NoSBOSwap) {
- int i{}, j{};
- entt::meta_any lhs{fat_t{&i}};
- entt::meta_any rhs{fat_t{&j}};
- std::swap(lhs, rhs);
- ASSERT_EQ(lhs.cast<fat_t>().foo, &j);
- ASSERT_EQ(rhs.cast<fat_t>().bar, &i);
- }
- TEST_F(MetaAny, VoidSwap) {
- entt::meta_any lhs{std::in_place_type<void>};
- entt::meta_any rhs{std::in_place_type<void>};
- const auto *pre = lhs.data();
- std::swap(lhs, rhs);
- ASSERT_EQ(pre, lhs.data());
- }
- TEST_F(MetaAny, SBOWithNoSBOSwap) {
- int value = 42;
- entt::meta_any lhs{fat_t{&value}};
- entt::meta_any rhs{'c'};
- std::swap(lhs, rhs);
- ASSERT_FALSE(lhs.try_cast<fat_t>());
- ASSERT_EQ(lhs.cast<char>(), 'c');
- ASSERT_FALSE(rhs.try_cast<char>());
- ASSERT_EQ(rhs.cast<fat_t>().foo, &value);
- ASSERT_EQ(rhs.cast<fat_t>().bar, &value);
- }
- TEST_F(MetaAny, SBOWithEmptySwap) {
- entt::meta_any lhs{'c'};
- entt::meta_any rhs{};
- std::swap(lhs, rhs);
- ASSERT_FALSE(lhs);
- ASSERT_EQ(rhs.cast<char>(), 'c');
- std::swap(lhs, rhs);
- ASSERT_FALSE(rhs);
- ASSERT_EQ(lhs.cast<char>(), 'c');
- }
- TEST_F(MetaAny, SBOWithVoidSwap) {
- entt::meta_any lhs{'c'};
- entt::meta_any rhs{std::in_place_type<void>};
- std::swap(lhs, rhs);
- ASSERT_EQ(lhs.type(), entt::resolve<void>());
- ASSERT_EQ(rhs.cast<char>(), 'c');
- }
- TEST_F(MetaAny, NoSBOWithEmptySwap) {
- int i{};
- entt::meta_any lhs{fat_t{&i}};
- entt::meta_any rhs{};
- std::swap(lhs, rhs);
- ASSERT_EQ(rhs.cast<fat_t>().bar, &i);
- std::swap(lhs, rhs);
- ASSERT_EQ(lhs.cast<fat_t>().bar, &i);
- }
- TEST_F(MetaAny, NoSBOWithVoidSwap) {
- int i{};
- entt::meta_any lhs{fat_t{&i}};
- entt::meta_any rhs{std::in_place_type<void>};
- std::swap(lhs, rhs);
- ASSERT_EQ(rhs.cast<fat_t>().bar, &i);
- std::swap(lhs, rhs);
- ASSERT_EQ(lhs.cast<fat_t>().bar, &i);
- }
- TEST_F(MetaAny, AsRef) {
- entt::meta_any any{42};
- auto ref = any.as_ref();
- auto cref = std::as_const(any).as_ref();
- ASSERT_EQ(any.try_cast<int>(), any.data());
- ASSERT_EQ(ref.try_cast<int>(), any.data());
- ASSERT_EQ(cref.try_cast<int>(), nullptr);
- ASSERT_EQ(any.try_cast<const int>(), any.data());
- ASSERT_EQ(ref.try_cast<const int>(), any.data());
- ASSERT_EQ(cref.try_cast<const int>(), any.data());
- ASSERT_EQ(any.cast<int>(), 42);
- ASSERT_EQ(ref.cast<int>(), 42);
- ASSERT_EQ(cref.cast<int>(), 42);
- ASSERT_EQ(any.cast<const int>(), 42);
- ASSERT_EQ(ref.cast<const int>(), 42);
- ASSERT_EQ(cref.cast<const int>(), 42);
- ASSERT_EQ(any.cast<int &>(), 42);
- ASSERT_EQ(any.cast<const int &>(), 42);
- ASSERT_EQ(ref.cast<int &>(), 42);
- ASSERT_EQ(ref.cast<const int &>(), 42);
- ASSERT_DEATH(cref.cast<int &>() = 3, "");
- ASSERT_EQ(cref.cast<const int &>(), 42);
- any.cast<int &>() = 3;
- ASSERT_EQ(any.cast<int>(), 3);
- ASSERT_EQ(ref.cast<int>(), 3);
- ASSERT_EQ(cref.cast<int>(), 3);
- std::swap(ref, cref);
- ASSERT_EQ(ref.try_cast<int>(), nullptr);
- ASSERT_EQ(cref.try_cast<int>(), any.data());
- ref = ref.as_ref();
- cref = std::as_const(cref).as_ref();
- ASSERT_EQ(ref.try_cast<int>(), nullptr);
- ASSERT_EQ(cref.try_cast<int>(), nullptr);
- ASSERT_EQ(ref.try_cast<const int>(), any.data());
- ASSERT_EQ(cref.try_cast<const int>(), any.data());
- ASSERT_DEATH(ref.cast<int &>() = 3, "");
- ASSERT_DEATH(cref.cast<int &>() = 3, "");
- ASSERT_EQ(ref.cast<const int &>(), 3);
- ASSERT_EQ(cref.cast<const int &>(), 3);
- ref = 42;
- cref = 42;
- ASSERT_NE(ref.try_cast<int>(), nullptr);
- ASSERT_NE(cref.try_cast<int>(), nullptr);
- ASSERT_EQ(ref.cast<int &>(), 42);
- ASSERT_EQ(cref.cast<int &>(), 42);
- ASSERT_EQ(ref.cast<const int &>(), 42);
- ASSERT_EQ(cref.cast<const int &>(), 42);
- ASSERT_NE(ref.try_cast<int>(), any.data());
- ASSERT_NE(cref.try_cast<int>(), any.data());
- any.emplace<void>();
- ref = any.as_ref();
- cref = std::as_const(any).as_ref();
- ASSERT_TRUE(ref);
- ASSERT_EQ(ref.type(), cref.type());
- ASSERT_EQ(ref.type(), entt::resolve<void>());
- }
- TEST_F(MetaAny, Comparable) {
- entt::meta_any any{'c'};
- ASSERT_EQ(any, any);
- ASSERT_EQ(any, entt::meta_any{'c'});
- ASSERT_NE(entt::meta_any{'a'}, any);
- ASSERT_NE(any, entt::meta_any{});
- ASSERT_TRUE(any == any);
- ASSERT_TRUE(any == entt::meta_any{'c'});
- ASSERT_FALSE(entt::meta_any{'a'} == any);
- ASSERT_TRUE(any != entt::meta_any{'a'});
- ASSERT_TRUE(entt::meta_any{} != any);
- }
- TEST_F(MetaAny, NotComparable) {
- entt::meta_any any{not_comparable_t{}};
- ASSERT_EQ(any, any);
- ASSERT_NE(any, entt::meta_any{not_comparable_t{}});
- ASSERT_NE(entt::meta_any{}, any);
- ASSERT_TRUE(any == any);
- ASSERT_FALSE(any == entt::meta_any{not_comparable_t{}});
- ASSERT_TRUE(entt::meta_any{} != any);
- }
- TEST_F(MetaAny, CompareVoid) {
- entt::meta_any any{std::in_place_type<void>};
- ASSERT_EQ(any, any);
- ASSERT_EQ(any, entt::meta_any{std::in_place_type<void>});
- ASSERT_NE(entt::meta_any{'a'}, any);
- ASSERT_NE(any, entt::meta_any{});
- ASSERT_TRUE(any == any);
- ASSERT_TRUE(any == entt::meta_any{std::in_place_type<void>});
- ASSERT_FALSE(entt::meta_any{'a'} == any);
- ASSERT_TRUE(any != entt::meta_any{'a'});
- ASSERT_TRUE(entt::meta_any{} != any);
- }
- TEST_F(MetaAny, TryCast) {
- entt::meta_any any{fat_t{}};
- ASSERT_TRUE(any);
- ASSERT_EQ(any.type(), entt::resolve<fat_t>());
- ASSERT_EQ(any.try_cast<void>(), nullptr);
- ASSERT_NE(any.try_cast<empty_t>(), nullptr);
- ASSERT_EQ(any.try_cast<fat_t>(), any.data());
- ASSERT_EQ(std::as_const(any).try_cast<empty_t>(), any.try_cast<empty_t>());
- ASSERT_EQ(std::as_const(any).try_cast<fat_t>(), any.data());
- }
- TEST_F(MetaAny, Cast) {
- entt::meta_any any{fat_t{}};
- ASSERT_TRUE(any);
- ASSERT_EQ(any.type(), entt::resolve<fat_t>());
- ASSERT_EQ(std::as_const(any).cast<const fat_t &>(), fat_t{});
- ASSERT_EQ(any.cast<const fat_t>(), fat_t{});
- ASSERT_EQ(any.cast<fat_t &>(), fat_t{});
- ASSERT_EQ(any.cast<fat_t>(), fat_t{});
- ASSERT_EQ(any.cast<fat_t>().gnam[0u], 0.);
- any.cast<fat_t &>().gnam[0u] = 3.;
- ASSERT_EQ(any.cast<fat_t>().gnam[0u], 3.);
- }
- TEST_F(MetaAny, Convert) {
- entt::meta_any any{42.};
- ASSERT_TRUE(any);
- ASSERT_EQ(any.type(), entt::resolve<double>());
- ASSERT_TRUE(any.allow_cast<double>());
- ASSERT_FALSE(any.allow_cast<char>());
- ASSERT_EQ(any.type(), entt::resolve<double>());
- ASSERT_EQ(any.cast<double>(), 42.);
- ASSERT_TRUE(any.allow_cast<int>());
- ASSERT_EQ(any.type(), entt::resolve<int>());
- ASSERT_EQ(any.cast<int>(), 42);
- }
- TEST_F(MetaAny, ConstConvert) {
- const entt::meta_any any{42.};
- ASSERT_TRUE(any);
- ASSERT_EQ(any.type(), entt::resolve<double>());
- ASSERT_TRUE(any.allow_cast<double>());
- ASSERT_FALSE(any.allow_cast<char>());
- ASSERT_EQ(any.type(), entt::resolve<double>());
- ASSERT_EQ(any.cast<double>(), 42.);
- auto other = any.allow_cast<int>();
- ASSERT_EQ(any.type(), entt::resolve<double>());
- ASSERT_EQ(any.cast<double>(), 42.);
- ASSERT_EQ(other.type(), entt::resolve<int>());
- ASSERT_EQ(other.cast<int>(), 42);
- }
- TEST_F(MetaAny, UnmanageableType) {
- unmanageable_t instance;
- entt::meta_any any{std::ref(instance)};
- entt::meta_any other = any.as_ref();
- std::swap(any, other);
- ASSERT_TRUE(any);
- ASSERT_TRUE(other);
- ASSERT_EQ(any.type(), entt::resolve<unmanageable_t>());
- ASSERT_NE(any.data(), nullptr);
- ASSERT_EQ(any.try_cast<int>(), nullptr);
- ASSERT_NE(any.try_cast<unmanageable_t>(), nullptr);
- ASSERT_TRUE(any.allow_cast<unmanageable_t>());
- ASSERT_FALSE(any.allow_cast<int>());
- ASSERT_TRUE(std::as_const(any).allow_cast<unmanageable_t>());
- ASSERT_FALSE(std::as_const(any).allow_cast<int>());
- }
- TEST_F(MetaAny, Invoke) {
- using namespace entt::literals;
- clazz_t instance;
- entt::meta_any any{std::ref(instance)};
- ASSERT_TRUE(any.invoke("func"_hs));
- ASSERT_TRUE(any.invoke("member"_hs, 42));
- ASSERT_FALSE(std::as_const(any).invoke("member"_hs, 42));
- ASSERT_FALSE(std::as_const(any).as_ref().invoke("member"_hs, 42));
- ASSERT_FALSE(any.invoke("non_existent"_hs, 42));
- ASSERT_EQ(clazz_t::c, 'd');
- ASSERT_EQ(instance.value, 42);
- }
- TEST_F(MetaAny, SetGet) {
- using namespace entt::literals;
- clazz_t instance;
- entt::meta_any any{std::ref(instance)};
- ASSERT_TRUE(any.set("value"_hs, 42));
- const auto value = std::as_const(any).get("value"_hs);
- ASSERT_TRUE(value);
- ASSERT_EQ(value, any.get("value"_hs));
- ASSERT_EQ(value, std::as_const(any).as_ref().get("value"_hs));
- ASSERT_NE(value.try_cast<int>(), nullptr);
- ASSERT_EQ(value.cast<int>(), 42);
- ASSERT_EQ(instance.value, 42);
- ASSERT_FALSE(any.set("non_existent"_hs, 42));
- ASSERT_FALSE(any.get("non_existent"_hs));
- }
|