diff options
author | Clyne Sullivan <clyne@bitgloo.com> | 2022-08-20 09:46:05 -0400 |
---|---|---|
committer | Clyne Sullivan <clyne@bitgloo.com> | 2022-08-20 09:46:05 -0400 |
commit | e04b856006cfe6b7e8ba5d6c1434331351cc791a (patch) | |
tree | e795a404e8652153822fb7598e89c43c5a39500d | |
parent | 39e07099da7227d7d7baec072411ddc0abfd8be4 (diff) |
add serialization supportserialize
-rw-r--r-- | entityx/Entity.h | 19 |
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> |