| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930 |
- #include <iterator>
- #include <type_traits>
- #include <utility>
- #include <vector>
- #include <gtest/gtest.h>
- #include <entt/core/any.hpp>
- #include <entt/core/hashed_string.hpp>
- #include <entt/entity/entity.hpp>
- #include <entt/entity/registry.hpp>
- #include <entt/entity/snapshot.hpp>
- #include <entt/signal/sigh.hpp>
- #include "../common/config.h"
- #include "../common/empty.h"
- struct shadow {
- entt::entity target{entt::null};
- static void listener(entt::entity &elem, entt::registry ®istry, const entt::entity entt) {
- elem = registry.get<shadow>(entt).target;
- }
- };
- TEST(BasicSnapshot, Constructors) {
- static_assert(!std::is_default_constructible_v<entt::basic_snapshot<entt::registry>>, "Default constructible type not allowed");
- static_assert(!std::is_copy_constructible_v<entt::basic_snapshot<entt::registry>>, "Copy constructible type not allowed");
- static_assert(!std::is_copy_assignable_v<entt::basic_snapshot<entt::registry>>, "Copy assignable type not allowed");
- static_assert(std::is_move_constructible_v<entt::basic_snapshot<entt::registry>>, "Move constructible type required");
- static_assert(std::is_move_assignable_v<entt::basic_snapshot<entt::registry>>, "Move assignable type required");
- const entt::registry registry;
- entt::basic_snapshot snapshot{registry};
- entt::basic_snapshot other{std::move(snapshot)};
- ASSERT_NO_THROW(snapshot = std::move(other));
- }
- TEST(BasicSnapshot, GetEntityType) {
- using namespace entt::literals;
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- const entt::basic_snapshot snapshot{registry};
- const auto &storage = registry.storage<entt::entity>();
- std::vector<entt::any> data{};
- auto archive = [&data](auto &&elem) { data.emplace_back(std::forward<decltype(elem)>(elem)); };
- snapshot.get<entt::entity>(archive);
- ASSERT_EQ(data.size(), 2u);
- ASSERT_NE(entt::any_cast<typename traits_type::entity_type>(&data[0u]), nullptr);
- ASSERT_EQ(entt::any_cast<typename traits_type::entity_type>(data[0u]), storage.size());
- ASSERT_NE(entt::any_cast<typename traits_type::entity_type>(&data[1u]), nullptr);
- ASSERT_EQ(entt::any_cast<typename traits_type::entity_type>(data[1u]), storage.free_list());
- entt::entity entity[3u]; // NOLINT
- registry.create(std::begin(entity), std::end(entity));
- registry.destroy(entity[1u]);
- data.clear();
- snapshot.get<entt::entity>(archive, "ignored"_hs);
- ASSERT_EQ(data.size(), 5u);
- ASSERT_NE(entt::any_cast<typename traits_type::entity_type>(&data[0u]), nullptr);
- ASSERT_EQ(entt::any_cast<typename traits_type::entity_type>(data[0u]), storage.size());
- ASSERT_NE(entt::any_cast<typename traits_type::entity_type>(&data[1u]), nullptr);
- ASSERT_EQ(entt::any_cast<typename traits_type::entity_type>(data[1u]), storage.free_list());
- ASSERT_NE(entt::any_cast<entt::entity>(&data[2u]), nullptr);
- ASSERT_EQ(entt::any_cast<entt::entity>(data[2u]), storage.data()[0u]);
- ASSERT_NE(entt::any_cast<entt::entity>(&data[3u]), nullptr);
- ASSERT_EQ(entt::any_cast<entt::entity>(data[3u]), storage.data()[1u]);
- ASSERT_NE(entt::any_cast<entt::entity>(&data[4u]), nullptr);
- ASSERT_EQ(entt::any_cast<entt::entity>(data[4u]), storage.data()[2u]);
- }
- TEST(BasicSnapshot, GetType) {
- using namespace entt::literals;
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- const entt::basic_snapshot snapshot{registry};
- const auto &storage = registry.storage<int>();
- entt::entity entity[3u]; // NOLINT
- const int values[3u]{1, 2, 3}; // NOLINT
- registry.create(std::begin(entity), std::end(entity));
- registry.insert<int>(std::begin(entity), std::end(entity), std::begin(values));
- registry.destroy(entity[1u]);
- std::vector<entt::any> data{};
- auto archive = [&data](auto &&elem) { data.emplace_back(std::forward<decltype(elem)>(elem)); };
- snapshot.get<int>(archive, "other"_hs);
- ASSERT_EQ(data.size(), 1u);
- ASSERT_NE(entt::any_cast<typename traits_type::entity_type>(&data[0u]), nullptr);
- ASSERT_EQ(entt::any_cast<typename traits_type::entity_type>(data[0u]), 0u);
- data.clear();
- snapshot.get<int>(archive);
- ASSERT_EQ(data.size(), 5u);
- ASSERT_NE(entt::any_cast<typename traits_type::entity_type>(&data[0u]), nullptr);
- ASSERT_EQ(entt::any_cast<typename traits_type::entity_type>(data[0u]), storage.size());
- ASSERT_NE(entt::any_cast<entt::entity>(&data[1u]), nullptr);
- ASSERT_EQ(entt::any_cast<entt::entity>(data[1u]), entity[0u]);
- ASSERT_NE(entt::any_cast<int>(&data[2u]), nullptr);
- ASSERT_EQ(entt::any_cast<int>(data[2u]), values[0u]);
- ASSERT_NE(entt::any_cast<entt::entity>(&data[3u]), nullptr);
- ASSERT_EQ(entt::any_cast<entt::entity>(data[3u]), entity[2u]);
- ASSERT_NE(entt::any_cast<int>(&data[4u]), nullptr);
- ASSERT_EQ(entt::any_cast<int>(data[4u]), values[2u]);
- }
- TEST(BasicSnapshot, GetEmptyType) {
- using namespace entt::literals;
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- const entt::basic_snapshot snapshot{registry};
- const auto &storage = registry.storage<test::empty>();
- entt::entity entity[3u]; // NOLINT
- registry.create(std::begin(entity), std::end(entity));
- registry.insert<test::empty>(std::begin(entity), std::end(entity));
- registry.destroy(entity[1u]);
- std::vector<entt::any> data{};
- auto archive = [&data](auto &&elem) { data.emplace_back(std::forward<decltype(elem)>(elem)); };
- snapshot.get<test::empty>(archive, "other"_hs);
- ASSERT_EQ(data.size(), 1u);
- ASSERT_NE(entt::any_cast<typename traits_type::entity_type>(&data[0u]), nullptr);
- ASSERT_EQ(entt::any_cast<typename traits_type::entity_type>(data[0u]), 0u);
- data.clear();
- snapshot.get<test::empty>(archive);
- ASSERT_EQ(data.size(), 3u);
- ASSERT_NE(entt::any_cast<typename traits_type::entity_type>(&data[0u]), nullptr);
- ASSERT_EQ(entt::any_cast<typename traits_type::entity_type>(data[0u]), storage.size());
- ASSERT_NE(entt::any_cast<entt::entity>(&data[1u]), nullptr);
- ASSERT_EQ(entt::any_cast<entt::entity>(data[1u]), entity[0u]);
- ASSERT_NE(entt::any_cast<entt::entity>(&data[2u]), nullptr);
- ASSERT_EQ(entt::any_cast<entt::entity>(data[2u]), entity[2u]);
- }
- TEST(BasicSnapshot, GetTypeSparse) {
- using namespace entt::literals;
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- const entt::basic_snapshot snapshot{registry};
- entt::entity entity[3u]; // NOLINT
- const int values[3u]{1, 2, 3}; // NOLINT
- registry.create(std::begin(entity), std::end(entity));
- registry.insert<int>(std::begin(entity), std::end(entity), std::begin(values));
- registry.destroy(entity[1u]);
- std::vector<entt::any> data{};
- auto archive = [&data](auto &&elem) { data.emplace_back(std::forward<decltype(elem)>(elem)); };
- snapshot.get<int>(archive, std::begin(entity), std::end(entity), "other"_hs);
- ASSERT_EQ(data.size(), 1u);
- ASSERT_NE(entt::any_cast<typename traits_type::entity_type>(&data[0u]), nullptr);
- ASSERT_EQ(entt::any_cast<typename traits_type::entity_type>(data[0u]), 0u);
- data.clear();
- snapshot.get<int>(archive, std::begin(entity), std::end(entity));
- ASSERT_EQ(data.size(), 6u);
- ASSERT_NE(entt::any_cast<typename traits_type::entity_type>(&data[0u]), nullptr);
- ASSERT_EQ(entt::any_cast<typename traits_type::entity_type>(data[0u]), static_cast<typename traits_type::entity_type>(std::distance(std::begin(entity), std::end(entity))));
- ASSERT_NE(entt::any_cast<entt::entity>(&data[1u]), nullptr);
- ASSERT_EQ(entt::any_cast<entt::entity>(data[1u]), entity[0u]);
- ASSERT_NE(entt::any_cast<int>(&data[2u]), nullptr);
- ASSERT_EQ(entt::any_cast<int>(data[2u]), values[0u]);
- ASSERT_NE(entt::any_cast<entt::entity>(&data[3u]), nullptr);
- ASSERT_EQ(entt::any_cast<entt::entity>(data[3u]), static_cast<entt::entity>(entt::null));
- ASSERT_NE(entt::any_cast<entt::entity>(&data[4u]), nullptr);
- ASSERT_EQ(entt::any_cast<entt::entity>(data[4u]), entity[2u]);
- ASSERT_NE(entt::any_cast<int>(&data[5u]), nullptr);
- ASSERT_EQ(entt::any_cast<int>(data[5u]), values[2u]);
- }
- TEST(BasicSnapshotLoader, Constructors) {
- static_assert(!std::is_default_constructible_v<entt::basic_snapshot_loader<entt::registry>>, "Default constructible type not allowed");
- static_assert(!std::is_copy_constructible_v<entt::basic_snapshot_loader<entt::registry>>, "Copy constructible type not allowed");
- static_assert(!std::is_copy_assignable_v<entt::basic_snapshot_loader<entt::registry>>, "Copy assignable type not allowed");
- static_assert(std::is_move_constructible_v<entt::basic_snapshot_loader<entt::registry>>, "Move constructible type required");
- static_assert(std::is_move_assignable_v<entt::basic_snapshot_loader<entt::registry>>, "Move assignable type required");
- entt::registry registry;
- entt::basic_snapshot_loader loader{registry};
- entt::basic_snapshot_loader other{std::move(loader)};
- ASSERT_NO_THROW(loader = std::move(other));
- }
- ENTT_DEBUG_TEST(BasicSnapshotLoaderDeathTest, Constructors) {
- entt::registry registry;
- registry.emplace<int>(registry.create());
- ASSERT_DEATH([[maybe_unused]] const entt::basic_snapshot_loader loader{registry}, "");
- }
- TEST(BasicSnapshotLoader, GetEntityType) {
- using namespace entt::literals;
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- entt::basic_snapshot_loader loader{registry};
- const auto &storage = registry.storage<entt::entity>();
- std::vector<entt::any> data{};
- auto archive = [&data, pos = 0u](auto &elem) mutable { elem = entt::any_cast<std::remove_reference_t<decltype(elem)>>(data[pos++]); };
- const entt::entity entity[3u]{traits_type::construct(0u, 0u), traits_type::construct(2u, 0u), traits_type::construct(1u, 1u)}; // NOLINT
- ASSERT_FALSE(registry.valid(entity[0u]));
- ASSERT_FALSE(registry.valid(entity[1u]));
- ASSERT_FALSE(registry.valid(entity[2u]));
- data.emplace_back(static_cast<typename traits_type::entity_type>(0u));
- data.emplace_back(static_cast<typename traits_type::entity_type>(0u));
- loader.get<entt::entity>(archive);
- ASSERT_FALSE(registry.valid(entity[0u]));
- ASSERT_FALSE(registry.valid(entity[1u]));
- ASSERT_FALSE(registry.valid(entity[2u]));
- ASSERT_EQ(storage.size(), 0u);
- ASSERT_EQ(storage.free_list(), 0u);
- data.emplace_back(static_cast<typename traits_type::entity_type>(3u));
- data.emplace_back(static_cast<typename traits_type::entity_type>(2u));
- data.emplace_back(entity[0u]);
- data.emplace_back(entity[1u]);
- data.emplace_back(entity[2u]);
- loader.get<entt::entity>(archive, "ignored"_hs);
- ASSERT_TRUE(registry.valid(entity[0u]));
- ASSERT_TRUE(registry.valid(entity[1u]));
- ASSERT_FALSE(registry.valid(entity[2u]));
- ASSERT_EQ(storage.size(), 3u);
- ASSERT_EQ(storage.free_list(), 2u);
- ASSERT_EQ(storage[0u], entity[0u]);
- ASSERT_EQ(storage[1u], entity[1u]);
- ASSERT_EQ(storage[2u], entity[2u]);
- ASSERT_EQ(registry.create(), entity[2u]);
- }
- TEST(BasicSnapshotLoader, GetType) {
- using namespace entt::literals;
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- entt::basic_snapshot_loader loader{registry};
- const auto &storage = registry.storage<int>();
- std::vector<entt::any> data{};
- auto archive = [&data, pos = 0u](auto &elem) mutable { elem = entt::any_cast<std::remove_reference_t<decltype(elem)>>(data[pos++]); };
- const entt::entity entity[2u]{traits_type::construct(0u, 0u), traits_type::construct(2u, 0u)}; // NOLINT
- const int values[2u]{1, 3}; // NOLINT
- ASSERT_FALSE(registry.valid(entity[0u]));
- ASSERT_FALSE(registry.valid(entity[1u]));
- data.emplace_back(static_cast<typename traits_type::entity_type>(1u));
- data.emplace_back(entity[0u]);
- data.emplace_back(values[0u]);
- loader.get<int>(archive, "other"_hs);
- ASSERT_TRUE(registry.valid(entity[0u]));
- ASSERT_FALSE(registry.valid(entity[1u]));
- ASSERT_EQ(storage.size(), 0u);
- ASSERT_EQ(registry.storage<int>("other"_hs).size(), 1u);
- data.emplace_back(static_cast<typename traits_type::entity_type>(2u));
- data.emplace_back(entity[0u]);
- data.emplace_back(values[0u]);
- data.emplace_back(entity[1u]);
- data.emplace_back(values[1u]);
- loader.get<int>(archive);
- ASSERT_TRUE(registry.valid(entity[0u]));
- ASSERT_TRUE(registry.valid(entity[1u]));
- ASSERT_EQ(storage.size(), 2u);
- ASSERT_TRUE(storage.contains(entity[0u]));
- ASSERT_TRUE(storage.contains(entity[1u]));
- ASSERT_EQ(storage.get(entity[0u]), values[0u]);
- ASSERT_EQ(storage.get(entity[1u]), values[1u]);
- }
- TEST(BasicSnapshotLoader, GetEmptyType) {
- using namespace entt::literals;
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- entt::basic_snapshot_loader loader{registry};
- const auto &storage = registry.storage<test::empty>();
- std::vector<entt::any> data{};
- auto archive = [&data, pos = 0u](auto &elem) mutable { elem = entt::any_cast<std::remove_reference_t<decltype(elem)>>(data[pos++]); };
- const entt::entity entity[2u]{traits_type::construct(0u, 0u), traits_type::construct(2u, 0u)}; // NOLINT
- ASSERT_FALSE(registry.valid(entity[0u]));
- ASSERT_FALSE(registry.valid(entity[1u]));
- data.emplace_back(static_cast<typename traits_type::entity_type>(1u));
- data.emplace_back(entity[0u]);
- loader.get<test::empty>(archive, "other"_hs);
- ASSERT_TRUE(registry.valid(entity[0u]));
- ASSERT_FALSE(registry.valid(entity[1u]));
- ASSERT_EQ(storage.size(), 0u);
- ASSERT_EQ(registry.storage<test::empty>("other"_hs).size(), 1u);
- data.emplace_back(static_cast<typename traits_type::entity_type>(2u));
- data.emplace_back(entity[0u]);
- data.emplace_back(entity[1u]);
- loader.get<test::empty>(archive);
- ASSERT_TRUE(registry.valid(entity[0u]));
- ASSERT_TRUE(registry.valid(entity[1u]));
- ASSERT_EQ(storage.size(), 2u);
- ASSERT_TRUE(storage.contains(entity[0u]));
- ASSERT_TRUE(storage.contains(entity[1u]));
- }
- TEST(BasicSnapshotLoader, GetTypeSparse) {
- using namespace entt::literals;
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- entt::basic_snapshot_loader loader{registry};
- const auto &storage = registry.storage<int>();
- std::vector<entt::any> data{};
- auto archive = [&data, pos = 0u](auto &elem) mutable { elem = entt::any_cast<std::remove_reference_t<decltype(elem)>>(data[pos++]); };
- const entt::entity entity[2u]{traits_type::construct(0u, 0u), traits_type::construct(2u, 0u)}; // NOLINT
- const int values[2u]{1, 3}; // NOLINT
- ASSERT_FALSE(registry.valid(entity[0u]));
- ASSERT_FALSE(registry.valid(entity[1u]));
- data.emplace_back(static_cast<typename traits_type::entity_type>(2u));
- data.emplace_back(static_cast<entt::entity>(entt::null));
- data.emplace_back(entity[0u]);
- data.emplace_back(values[0u]);
- loader.get<int>(archive, "other"_hs);
- ASSERT_TRUE(registry.valid(entity[0u]));
- ASSERT_FALSE(registry.valid(entity[1u]));
- ASSERT_EQ(storage.size(), 0u);
- ASSERT_EQ(registry.storage<int>("other"_hs).size(), 1u);
- data.emplace_back(static_cast<typename traits_type::entity_type>(3u));
- data.emplace_back(entity[0u]);
- data.emplace_back(values[0u]);
- data.emplace_back(static_cast<entt::entity>(entt::null));
- data.emplace_back(entity[1u]);
- data.emplace_back(values[1u]);
- loader.get<int>(archive);
- ASSERT_TRUE(registry.valid(entity[0u]));
- ASSERT_TRUE(registry.valid(entity[1u]));
- ASSERT_EQ(storage.size(), 2u);
- ASSERT_TRUE(storage.contains(entity[0u]));
- ASSERT_TRUE(storage.contains(entity[1u]));
- ASSERT_EQ(storage.get(entity[0u]), values[0u]);
- ASSERT_EQ(storage.get(entity[1u]), values[1u]);
- }
- TEST(BasicSnapshotLoader, GetTypeWithListener) {
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- entt::basic_snapshot_loader loader{registry};
- entt::entity check{entt::null};
- std::vector<entt::any> data{};
- auto archive = [&data, pos = 0u](auto &value) mutable { value = entt::any_cast<std::remove_reference_t<decltype(value)>>(data[pos++]); };
- const auto entity{traits_type::construct(1u, 1u)};
- const shadow value{entity};
- ASSERT_FALSE(registry.valid(entity));
- ASSERT_EQ(check, static_cast<entt::entity>(entt::null));
- registry.on_construct<shadow>().connect<&shadow::listener>(check);
- data.emplace_back(static_cast<typename traits_type::entity_type>(1u));
- data.emplace_back(entity);
- data.emplace_back(value);
- loader.get<shadow>(archive);
- ASSERT_TRUE(registry.valid(entity));
- ASSERT_EQ(check, entity);
- }
- TEST(BasicSnapshotLoader, Orphans) {
- using namespace entt::literals;
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- entt::basic_snapshot_loader loader{registry};
- std::vector<entt::any> data{};
- auto archive = [&data, pos = 0u](auto &elem) mutable { elem = entt::any_cast<std::remove_reference_t<decltype(elem)>>(data[pos++]); };
- const entt::entity entity[2u]{traits_type::construct(0u, 0u), traits_type::construct(2u, 0u)}; // NOLINT
- const int value = 42;
- ASSERT_FALSE(registry.valid(entity[0u]));
- ASSERT_FALSE(registry.valid(entity[1u]));
- data.emplace_back(static_cast<typename traits_type::entity_type>(2u));
- data.emplace_back(static_cast<typename traits_type::entity_type>(2u));
- data.emplace_back(entity[0u]);
- data.emplace_back(entity[1u]);
- data.emplace_back(static_cast<typename traits_type::entity_type>(1u));
- data.emplace_back(entity[0u]);
- data.emplace_back(value);
- loader.get<entt::entity>(archive);
- loader.get<int>(archive);
- ASSERT_TRUE(registry.valid(entity[0u]));
- ASSERT_TRUE(registry.valid(entity[1u]));
- loader.orphans();
- ASSERT_TRUE(registry.valid(entity[0u]));
- ASSERT_FALSE(registry.valid(entity[1u]));
- }
- TEST(BasicContinuousLoader, Constructors) {
- static_assert(!std::is_default_constructible_v<entt::basic_continuous_loader<entt::registry>>, "Default constructible type not allowed");
- static_assert(!std::is_copy_constructible_v<entt::basic_continuous_loader<entt::registry>>, "Copy constructible type not allowed");
- static_assert(!std::is_copy_assignable_v<entt::basic_continuous_loader<entt::registry>>, "Copy assignable type not allowed");
- static_assert(std::is_move_constructible_v<entt::basic_continuous_loader<entt::registry>>, "Move constructible type required");
- static_assert(std::is_move_assignable_v<entt::basic_continuous_loader<entt::registry>>, "Move assignable type required");
- entt::registry registry;
- entt::basic_continuous_loader loader{registry};
- entt::basic_continuous_loader other{std::move(loader)};
- ASSERT_NO_THROW(loader = std::move(other));
- }
- TEST(BasicContinuousLoader, GetEntityType) {
- using namespace entt::literals;
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- entt::basic_continuous_loader loader{registry};
- const auto &storage = registry.storage<entt::entity>();
- std::vector<entt::any> data{};
- auto archive = [&data, pos = 0u](auto &elem) mutable { elem = entt::any_cast<std::remove_reference_t<decltype(elem)>>(data[pos++]); };
- const entt::entity entity[3u]{traits_type::construct(1u, 0u), traits_type::construct(0u, 0u), traits_type::construct(2u, 0u)}; // NOLINT
- ASSERT_FALSE(registry.valid(entity[0u]));
- ASSERT_FALSE(registry.valid(entity[1u]));
- ASSERT_FALSE(registry.valid(entity[2u]));
- data.emplace_back(static_cast<typename traits_type::entity_type>(0u));
- data.emplace_back(static_cast<typename traits_type::entity_type>(0u));
- loader.get<entt::entity>(archive);
- ASSERT_FALSE(registry.valid(entity[0u]));
- ASSERT_FALSE(registry.valid(entity[1u]));
- ASSERT_FALSE(registry.valid(entity[2u]));
- ASSERT_FALSE(loader.contains(entity[0u]));
- ASSERT_FALSE(loader.contains(entity[1u]));
- ASSERT_FALSE(loader.contains(entity[2u]));
- ASSERT_EQ(loader.map(entity[0u]), static_cast<entt::entity>(entt::null));
- ASSERT_EQ(loader.map(entity[1u]), static_cast<entt::entity>(entt::null));
- ASSERT_EQ(loader.map(entity[2u]), static_cast<entt::entity>(entt::null));
- ASSERT_EQ(storage.size(), 0u);
- ASSERT_EQ(storage.free_list(), 0u);
- data.emplace_back(static_cast<typename traits_type::entity_type>(3u));
- data.emplace_back(static_cast<typename traits_type::entity_type>(2u));
- data.emplace_back(entity[0u]);
- data.emplace_back(entity[1u]);
- data.emplace_back(entity[2u]);
- loader.get<entt::entity>(archive, "ignored"_hs);
- ASSERT_TRUE(loader.contains(entity[0u]));
- ASSERT_TRUE(loader.contains(entity[1u]));
- ASSERT_FALSE(loader.contains(entity[2u]));
- ASSERT_NE(loader.map(entity[0u]), static_cast<entt::entity>(entt::null));
- ASSERT_NE(loader.map(entity[1u]), static_cast<entt::entity>(entt::null));
- ASSERT_EQ(loader.map(entity[2u]), static_cast<entt::entity>(entt::null));
- ASSERT_TRUE(registry.valid(loader.map(entity[0u])));
- ASSERT_TRUE(registry.valid(loader.map(entity[1u])));
- ASSERT_EQ(storage.size(), 2u);
- ASSERT_EQ(storage.free_list(), 2u);
- ASSERT_EQ(storage[0u], loader.map(entity[0u]));
- ASSERT_EQ(storage[1u], loader.map(entity[1u]));
- ASSERT_EQ(registry.create(), entity[2u]);
- data.emplace_back(static_cast<typename traits_type::entity_type>(3u));
- data.emplace_back(static_cast<typename traits_type::entity_type>(3u));
- data.emplace_back(entity[0u]);
- data.emplace_back(entity[1u]);
- data.emplace_back(entity[2u]);
- loader.get<entt::entity>(archive);
- ASSERT_TRUE(loader.contains(entity[0u]));
- ASSERT_TRUE(loader.contains(entity[1u]));
- ASSERT_TRUE(loader.contains(entity[2u]));
- ASSERT_NE(loader.map(entity[0u]), static_cast<entt::entity>(entt::null));
- ASSERT_NE(loader.map(entity[1u]), static_cast<entt::entity>(entt::null));
- ASSERT_NE(loader.map(entity[2u]), static_cast<entt::entity>(entt::null));
- ASSERT_TRUE(registry.valid(loader.map(entity[0u])));
- ASSERT_TRUE(registry.valid(loader.map(entity[1u])));
- ASSERT_TRUE(registry.valid(loader.map(entity[2u])));
- ASSERT_EQ(storage.size(), 4u);
- ASSERT_EQ(storage.free_list(), 4u);
- ASSERT_EQ(storage[0u], loader.map(entity[0u]));
- ASSERT_EQ(storage[1u], loader.map(entity[1u]));
- ASSERT_EQ(storage[3u], loader.map(entity[2u]));
- registry.destroy(loader.map(entity[1u]));
- ASSERT_TRUE(loader.contains(entity[1u]));
- ASSERT_NE(loader.map(entity[1u]), static_cast<entt::entity>(entt::null));
- ASSERT_FALSE(registry.valid(loader.map(entity[1u])));
- data.emplace_back(static_cast<typename traits_type::entity_type>(1u));
- data.emplace_back(static_cast<typename traits_type::entity_type>(1u));
- data.emplace_back(entity[1u]);
- loader.get<entt::entity>(archive);
- ASSERT_TRUE(loader.contains(entity[1u]));
- ASSERT_NE(loader.map(entity[1u]), static_cast<entt::entity>(entt::null));
- ASSERT_TRUE(registry.valid(loader.map(entity[1u])));
- ASSERT_EQ(storage[3u], loader.map(entity[1u]));
- data.emplace_back(static_cast<typename traits_type::entity_type>(3u));
- data.emplace_back(static_cast<typename traits_type::entity_type>(1u));
- data.emplace_back(entity[1u]);
- data.emplace_back(entity[2u]);
- data.emplace_back(entity[0u]);
- loader.get<entt::entity>(archive, "ignored"_hs);
- ASSERT_FALSE(loader.contains(entity[0u]));
- ASSERT_TRUE(loader.contains(entity[1u]));
- ASSERT_FALSE(loader.contains(entity[2u]));
- ASSERT_EQ(loader.map(entity[0u]), static_cast<entt::entity>(entt::null));
- ASSERT_NE(loader.map(entity[1u]), static_cast<entt::entity>(entt::null));
- ASSERT_EQ(loader.map(entity[2u]), static_cast<entt::entity>(entt::null));
- ASSERT_TRUE(registry.valid(loader.map(entity[1u])));
- ASSERT_EQ(storage.size(), 4u);
- ASSERT_EQ(storage.free_list(), 2u);
- ASSERT_EQ(storage[1u], loader.map(entity[1u]));
- }
- TEST(BasicContinuousLoader, GetType) {
- using namespace entt::literals;
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- entt::basic_continuous_loader loader{registry};
- const auto &storage = registry.storage<int>();
- std::vector<entt::any> data{};
- auto archive = [&data, pos = 0u](auto &elem) mutable { elem = entt::any_cast<std::remove_reference_t<decltype(elem)>>(data[pos++]); };
- const entt::entity entity[2u]{traits_type::construct(0u, 0u), traits_type::construct(2u, 0u)}; // NOLINT
- const int values[2u]{1, 3}; // NOLINT
- ASSERT_FALSE(loader.contains(entity[0u]));
- ASSERT_FALSE(loader.contains(entity[1u]));
- ASSERT_FALSE(registry.valid(loader.map(entity[0u])));
- ASSERT_FALSE(registry.valid(loader.map(entity[1u])));
- data.emplace_back(static_cast<typename traits_type::entity_type>(1u));
- data.emplace_back(entity[0u]);
- data.emplace_back(values[0u]);
- loader.get<int>(archive, "other"_hs);
- ASSERT_TRUE(loader.contains(entity[0u]));
- ASSERT_FALSE(loader.contains(entity[1u]));
- ASSERT_TRUE(registry.valid(loader.map(entity[0u])));
- ASSERT_FALSE(registry.valid(loader.map(entity[1u])));
- ASSERT_EQ(storage.size(), 0u);
- ASSERT_EQ(registry.storage<int>("other"_hs).size(), 1u);
- data.emplace_back(static_cast<typename traits_type::entity_type>(2u));
- data.emplace_back(entity[0u]);
- data.emplace_back(values[0u]);
- data.emplace_back(entity[1u]);
- data.emplace_back(values[1u]);
- loader.get<int>(archive);
- ASSERT_TRUE(loader.contains(entity[0u]));
- ASSERT_TRUE(loader.contains(entity[1u]));
- ASSERT_TRUE(registry.valid(loader.map(entity[0u])));
- ASSERT_TRUE(registry.valid(loader.map(entity[1u])));
- ASSERT_EQ(storage.size(), 2u);
- ASSERT_TRUE(storage.contains(loader.map(entity[0u])));
- ASSERT_TRUE(storage.contains(loader.map(entity[1u])));
- ASSERT_EQ(storage.get(loader.map(entity[0u])), values[0u]);
- ASSERT_EQ(storage.get(loader.map(entity[1u])), values[1u]);
- }
- TEST(BasicContinuousLoader, GetTypeExtended) {
- using namespace entt::literals;
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- entt::basic_continuous_loader loader{registry};
- const auto &storage = registry.storage<shadow>();
- std::vector<entt::any> data{};
- const entt::entity entity[2u]{traits_type::construct(0u, 1u), traits_type::construct(1u, 1u)}; // NOLINT
- const shadow value{entity[0u]};
- auto archive = [&loader, &data, pos = 0u](auto &elem) mutable {
- elem = entt::any_cast<std::remove_reference_t<decltype(elem)>>(data[pos++]);
- if constexpr(std::is_same_v<std::remove_reference_t<decltype(elem)>, shadow>) {
- elem.target = loader.map(elem.target);
- }
- };
- ASSERT_FALSE(loader.contains(entity[0u]));
- ASSERT_FALSE(loader.contains(entity[1u]));
- ASSERT_FALSE(registry.valid(loader.map(entity[0u])));
- ASSERT_FALSE(registry.valid(loader.map(entity[1u])));
- data.emplace_back(static_cast<typename traits_type::entity_type>(2u));
- data.emplace_back(static_cast<typename traits_type::entity_type>(2u));
- data.emplace_back(entity[0u]);
- data.emplace_back(entity[1u]);
- data.emplace_back(static_cast<typename traits_type::entity_type>(1u));
- data.emplace_back(entity[1u]);
- data.emplace_back(value);
- loader.get<entt::entity>(archive);
- loader.get<shadow>(archive);
- ASSERT_TRUE(loader.contains(entity[0u]));
- ASSERT_TRUE(loader.contains(entity[1u]));
- ASSERT_TRUE(registry.valid(loader.map(entity[0u])));
- ASSERT_TRUE(registry.valid(loader.map(entity[1u])));
- ASSERT_FALSE(registry.valid(entity[0u]));
- ASSERT_FALSE(registry.valid(entity[1u]));
- ASSERT_EQ(storage.size(), 1u);
- ASSERT_TRUE(storage.contains(loader.map(entity[1u])));
- ASSERT_EQ(storage.get(loader.map(entity[1u])).target, loader.map(entity[0u]));
- }
- TEST(BasicContinuousLoader, GetEmptyType) {
- using namespace entt::literals;
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- entt::basic_continuous_loader loader{registry};
- const auto &storage = registry.storage<test::empty>();
- std::vector<entt::any> data{};
- auto archive = [&data, pos = 0u](auto &elem) mutable { elem = entt::any_cast<std::remove_reference_t<decltype(elem)>>(data[pos++]); };
- const entt::entity entity[2u]{traits_type::construct(0u, 0u), traits_type::construct(2u, 0u)}; // NOLINT
- ASSERT_FALSE(loader.contains(entity[0u]));
- ASSERT_FALSE(loader.contains(entity[1u]));
- ASSERT_FALSE(registry.valid(loader.map(entity[0u])));
- ASSERT_FALSE(registry.valid(loader.map(entity[1u])));
- data.emplace_back(static_cast<typename traits_type::entity_type>(1u));
- data.emplace_back(entity[0u]);
- loader.get<test::empty>(archive, "other"_hs);
- ASSERT_TRUE(loader.contains(entity[0u]));
- ASSERT_FALSE(loader.contains(entity[1u]));
- ASSERT_TRUE(registry.valid(loader.map(entity[0u])));
- ASSERT_FALSE(registry.valid(loader.map(entity[1u])));
- ASSERT_EQ(storage.size(), 0u);
- ASSERT_EQ(registry.storage<test::empty>("other"_hs).size(), 1u);
- data.emplace_back(static_cast<typename traits_type::entity_type>(2u));
- data.emplace_back(entity[0u]);
- data.emplace_back(entity[1u]);
- loader.get<test::empty>(archive);
- ASSERT_TRUE(loader.contains(entity[0u]));
- ASSERT_TRUE(loader.contains(entity[1u]));
- ASSERT_TRUE(registry.valid(loader.map(entity[0u])));
- ASSERT_TRUE(registry.valid(loader.map(entity[1u])));
- ASSERT_EQ(storage.size(), 2u);
- ASSERT_TRUE(storage.contains(loader.map(entity[0u])));
- ASSERT_TRUE(storage.contains(loader.map(entity[1u])));
- }
- TEST(BasicContinuousLoader, GetTypeSparse) {
- using namespace entt::literals;
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- entt::basic_continuous_loader loader{registry};
- const auto &storage = registry.storage<int>();
- std::vector<entt::any> data{};
- auto archive = [&data, pos = 0u](auto &elem) mutable { elem = entt::any_cast<std::remove_reference_t<decltype(elem)>>(data[pos++]); };
- const entt::entity entity[2u]{traits_type::construct(0u, 0u), traits_type::construct(2u, 0u)}; // NOLINT
- const int values[2u]{1, 3}; // NOLINT
- ASSERT_FALSE(loader.contains(entity[0u]));
- ASSERT_FALSE(loader.contains(entity[1u]));
- ASSERT_FALSE(registry.valid(loader.map(entity[0u])));
- ASSERT_FALSE(registry.valid(loader.map(entity[1u])));
- data.emplace_back(static_cast<typename traits_type::entity_type>(2u));
- data.emplace_back(static_cast<entt::entity>(entt::null));
- data.emplace_back(entity[0u]);
- data.emplace_back(values[0u]);
- loader.get<int>(archive, "other"_hs);
- ASSERT_TRUE(loader.contains(entity[0u]));
- ASSERT_FALSE(loader.contains(entity[1u]));
- ASSERT_TRUE(registry.valid(loader.map(entity[0u])));
- ASSERT_FALSE(registry.valid(loader.map(entity[1u])));
- ASSERT_EQ(storage.size(), 0u);
- ASSERT_EQ(registry.storage<int>("other"_hs).size(), 1u);
- data.emplace_back(static_cast<typename traits_type::entity_type>(3u));
- data.emplace_back(entity[0u]);
- data.emplace_back(values[0u]);
- data.emplace_back(static_cast<entt::entity>(entt::null));
- data.emplace_back(entity[1u]);
- data.emplace_back(values[1u]);
- loader.get<int>(archive);
- ASSERT_TRUE(loader.contains(entity[0u]));
- ASSERT_TRUE(loader.contains(entity[1u]));
- ASSERT_TRUE(registry.valid(loader.map(entity[0u])));
- ASSERT_TRUE(registry.valid(loader.map(entity[1u])));
- ASSERT_EQ(storage.size(), 2u);
- ASSERT_TRUE(storage.contains(loader.map(entity[0u])));
- ASSERT_TRUE(storage.contains(loader.map(entity[1u])));
- ASSERT_EQ(storage.get(loader.map(entity[0u])), values[0u]);
- ASSERT_EQ(storage.get(loader.map(entity[1u])), values[1u]);
- }
- TEST(BasicContinuousLoader, GetTypeWithListener) {
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- entt::basic_continuous_loader loader{registry};
- entt::entity check{entt::null};
- std::vector<entt::any> data{};
- auto archive = [&data, pos = 0u](auto &value) mutable { value = entt::any_cast<std::remove_reference_t<decltype(value)>>(data[pos++]); };
- const auto entity{traits_type::construct(1u, 1u)};
- const shadow value{entity};
- ASSERT_FALSE(registry.valid(loader.map(entity)));
- ASSERT_EQ(check, static_cast<entt::entity>(entt::null));
- registry.on_construct<shadow>().connect<&shadow::listener>(check);
- data.emplace_back(static_cast<typename traits_type::entity_type>(1u));
- data.emplace_back(entity);
- data.emplace_back(value);
- loader.get<shadow>(archive);
- ASSERT_TRUE(registry.valid(loader.map(entity)));
- ASSERT_EQ(check, entity);
- }
- TEST(BasicContinuousLoader, Orphans) {
- using namespace entt::literals;
- using traits_type = entt::entt_traits<entt::entity>;
- entt::registry registry;
- entt::basic_continuous_loader loader{registry};
- std::vector<entt::any> data{};
- auto archive = [&data, pos = 0u](auto &elem) mutable { elem = entt::any_cast<std::remove_reference_t<decltype(elem)>>(data[pos++]); };
- const entt::entity entity[2u]{traits_type::construct(0u, 0u), traits_type::construct(2u, 0u)}; // NOLINT
- const int value = 42;
- ASSERT_FALSE(registry.valid(entity[0u]));
- ASSERT_FALSE(registry.valid(entity[1u]));
- data.emplace_back(static_cast<typename traits_type::entity_type>(2u));
- data.emplace_back(static_cast<typename traits_type::entity_type>(2u));
- data.emplace_back(entity[0u]);
- data.emplace_back(entity[1u]);
- data.emplace_back(static_cast<typename traits_type::entity_type>(1u));
- data.emplace_back(entity[0u]);
- data.emplace_back(value);
- loader.get<entt::entity>(archive);
- loader.get<int>(archive);
- ASSERT_TRUE(loader.contains(entity[0u]));
- ASSERT_TRUE(loader.contains(entity[1u]));
- ASSERT_TRUE(registry.valid(loader.map(entity[0u])));
- ASSERT_TRUE(registry.valid(loader.map(entity[1u])));
- loader.orphans();
- ASSERT_TRUE(loader.contains(entity[0u]));
- ASSERT_TRUE(loader.contains(entity[1u]));
- ASSERT_TRUE(registry.valid(loader.map(entity[0u])));
- ASSERT_FALSE(registry.valid(loader.map(entity[1u])));
- }
|