]> code.bitgloo.com Git - clyne/entityx.git/commitdiff
add serialization support serialize
authorClyne Sullivan <clyne@bitgloo.com>
Sat, 20 Aug 2022 13:46:05 +0000 (09:46 -0400)
committerClyne Sullivan <clyne@bitgloo.com>
Sat, 20 Aug 2022 13:46:05 +0000 (09:46 -0400)
entityx/Entity.h

index 418523de0f212b9a15d6963aa49cb87246098e36..f15d77939b58eeede7cce42231943aab172da9de 100644 (file)
@@ -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>