snapshot: full support to stable types - close #1118

This commit is contained in:
Michele Caini
2024-03-28 10:49:18 +01:00
parent d5a2e353cd
commit 4dc3f650e8
2 changed files with 74 additions and 10 deletions

View File

@@ -86,6 +86,17 @@ public:
for(auto first = storage->data(), last = first + storage->size(); first != last; ++first) {
archive(*first);
}
} else if constexpr(component_traits<Type>::in_place_delete) {
using common_type = typename registry_type::common_type;
for(auto it = storage->common_type::rbegin(), last = storage->common_type::rend(); it != last; ++it) {
if(const auto entt = *it; entt == tombstone) {
archive(static_cast<entity_type>(null));
} else {
archive(entt);
std::apply([&archive](auto &&...args) { (archive(std::forward<decltype(args)>(args)), ...); }, storage->get_as_tuple(entt));
}
}
} else {
for(auto elem: storage->reach()) {
std::apply([&archive](auto &&...args) { (archive(std::forward<decltype(args)>(args)), ...); }, elem);

View File

@@ -11,6 +11,7 @@
#include <entt/signal/sigh.hpp>
#include "../common/config.h"
#include "../common/empty.h"
#include "../common/pointer_stable.h"
struct shadow {
entt::entity target{entt::null};
@@ -88,12 +89,13 @@ TEST(BasicSnapshot, GetType) {
entt::registry registry;
const entt::basic_snapshot snapshot{registry};
const auto &storage = registry.storage<int>();
constexpr auto number_of_entities = 3u;
entt::entity entity[3u]; // NOLINT
const int values[3u]{1, 2, 3}; // NOLINT
std::array<entt::entity, number_of_entities> entity{};
const std::array value{1, 2, 3};
registry.create(std::begin(entity), std::end(entity));
registry.insert<int>(std::begin(entity), std::end(entity), std::begin(values));
registry.insert<int>(std::begin(entity), std::end(entity), std::begin(value));
registry.destroy(entity[1u]);
std::vector<entt::any> data{};
@@ -118,13 +120,63 @@ TEST(BasicSnapshot, GetType) {
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_EQ(entt::any_cast<int>(data[2u]), value[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]);
ASSERT_EQ(entt::any_cast<int>(data[4u]), value[2u]);
}
TEST(BasicSnapshot, GetPointerStableType) {
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::pointer_stable>();
constexpr auto number_of_entities = 3u;
std::array<entt::entity, number_of_entities> entity{};
const std::array<test::pointer_stable, number_of_entities> value{1, 2, 3};
registry.create(entity.begin(), entity.end());
registry.insert<test::pointer_stable>(entity.begin(), entity.end(), value.begin());
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::pointer_stable>(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::pointer_stable>(archive);
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]), 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<test::pointer_stable>(&data[2u]), nullptr);
ASSERT_EQ(entt::any_cast<test::pointer_stable>(data[2u]), value[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<test::pointer_stable>(&data[5u]), nullptr);
ASSERT_EQ(entt::any_cast<test::pointer_stable>(data[5u]), value[2u]);
}
TEST(BasicSnapshot, GetEmptyType) {
@@ -172,12 +224,13 @@ TEST(BasicSnapshot, GetTypeSparse) {
entt::registry registry;
const entt::basic_snapshot snapshot{registry};
constexpr auto number_of_entities = 3u;
entt::entity entity[3u]; // NOLINT
const int values[3u]{1, 2, 3}; // NOLINT
std::array<entt::entity, number_of_entities> entity{};
const std::array value{1, 2, 3};
registry.create(std::begin(entity), std::end(entity));
registry.insert<int>(std::begin(entity), std::end(entity), std::begin(values));
registry.insert<int>(std::begin(entity), std::end(entity), std::begin(value));
registry.destroy(entity[1u]);
std::vector<entt::any> data{};
@@ -202,7 +255,7 @@ TEST(BasicSnapshot, GetTypeSparse) {
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_EQ(entt::any_cast<int>(data[2u]), value[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));
@@ -211,7 +264,7 @@ TEST(BasicSnapshot, GetTypeSparse) {
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]);
ASSERT_EQ(entt::any_cast<int>(data[5u]), value[2u]);
}
TEST(BasicSnapshotLoader, Constructors) {