snapshot: reintroduce support to storage listeners
This commit is contained in:
@@ -222,7 +222,9 @@ public:
|
||||
if constexpr(Registry::template storage_for_type<Type>::traits_type::page_size == 0u) {
|
||||
storage.emplace(entity);
|
||||
} else {
|
||||
archive(storage.emplace(entity));
|
||||
Type elem{};
|
||||
archive(elem);
|
||||
storage.emplace(entity, std::move(elem));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -402,7 +404,9 @@ public:
|
||||
if constexpr(Registry::template storage_for_type<Type>::traits_type::page_size == 0u) {
|
||||
storage.emplace(map(entt));
|
||||
} else {
|
||||
archive(storage.emplace(map(entt)));
|
||||
Type elem{};
|
||||
archive(elem);
|
||||
storage.emplace(map(entt), std::move(elem));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,11 +11,16 @@
|
||||
#include <entt/entity/entity.hpp>
|
||||
#include <entt/entity/registry.hpp>
|
||||
#include <entt/entity/snapshot.hpp>
|
||||
#include <entt/signal/sigh.hpp>
|
||||
|
||||
struct empty {};
|
||||
|
||||
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) {
|
||||
@@ -417,6 +422,33 @@ TEST(BasicSnapshotLoader, GetTypeSparse) {
|
||||
ASSERT_EQ(storage.get(entities[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>;
|
||||
@@ -823,6 +855,33 @@ TEST(BasicContinuousLoader, GetTypeSparse) {
|
||||
ASSERT_EQ(storage.get(loader.map(entities[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>;
|
||||
|
||||
Reference in New Issue
Block a user