aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2022-08-20 09:46:05 -0400
committerClyne Sullivan <clyne@bitgloo.com>2022-08-20 09:46:05 -0400
commite04b856006cfe6b7e8ba5d6c1434331351cc791a (patch)
treee795a404e8652153822fb7598e89c43c5a39500d
parent39e07099da7227d7d7baec072411ddc0abfd8be4 (diff)
add serialization supportserialize
-rw-r--r--entityx/Entity.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/entityx/Entity.h b/entityx/Entity.h
index 418523d..f15d779 100644
--- a/entityx/Entity.h
+++ b/entityx/Entity.h
@@ -242,6 +242,8 @@ struct BaseComponent {
void operator delete(void *p) { fail(); }
void operator delete[](void *p) { fail(); }
+ virtual std::string serializeName() const = 0;
+ virtual void internal_serialize(bool save, void *ar) = 0;
protected:
static void fail() {
@@ -341,6 +343,7 @@ public:
virtual ~BaseComponentHelper() {}
virtual void remove_component(Entity e) = 0;
virtual void copy_component_to(Entity source, Entity target) = 0;
+ virtual BaseComponent *get_component(Entity e) = 0;
};
template <typename C>
@@ -352,6 +355,9 @@ public:
void copy_component_to(Entity source, Entity target) override {
target.assign_from_copy<C>(*(source.component<C>().get()));
}
+ BaseComponent *get_component(Entity e) override {
+ return e.component<C>().get();
+ }
};
/**
@@ -838,6 +844,19 @@ class EntityManager : entityx::help::NonCopyable {
return Component<typename std::remove_const<C>::type>::family();
}
+ template<class Serializer>
+ void serialize(Entity entity, Serializer serializer) {
+ assert(entity.valid());
+ auto mask = entity.component_mask();
+ for (size_t i = 0; i < component_helpers_.size(); i++) {
+ BaseComponentHelper *helper = component_helpers_[i];
+ if (helper && mask.test(i)) {
+ auto c = helper->get_component(entity);
+ serializer(c);
+ }
+ }
+ }
+
private:
friend class Entity;
template <typename C, typename EM>