Ver Fonte

meta: persistent traits in the factory class

Michele Caini há 1 ano atrás
pai
commit
872f1c8dd9
1 ficheiros alterados com 12 adições e 7 exclusões
  1. 12 7
      src/entt/meta/factory.hpp

+ 12 - 7
src/entt/meta/factory.hpp

@@ -33,6 +33,7 @@ protected:
         ENTT_ASSERT(owner->id == id || !resolve(*ctx, id), "Duplicate identifier");
         bucket = &owner->details->prop;
         user = &owner->custom;
+        mask = &owner->traits;
         dest = parent;
         owner->id = id;
     }
@@ -41,6 +42,7 @@ protected:
         owner->details->base.insert_or_assign(id, node);
         bucket = nullptr;
         user = nullptr;
+        mask = nullptr;
         dest = parent;
     }
 
@@ -48,6 +50,7 @@ protected:
         owner->details->conv.insert_or_assign(id, node);
         bucket = nullptr;
         user = nullptr;
+        mask = nullptr;
         dest = parent;
     }
 
@@ -55,6 +58,7 @@ protected:
         owner->details->ctor.insert_or_assign(id, node);
         bucket = nullptr;
         user = nullptr;
+        mask = nullptr;
         dest = parent;
     }
 
@@ -62,6 +66,7 @@ protected:
         owner->dtor = node;
         bucket = nullptr;
         user = nullptr;
+        mask = nullptr;
         dest = parent;
     }
 
@@ -70,6 +75,7 @@ protected:
         auto &&elem = owner->details->data[id];
         bucket = &elem.prop;
         user = &elem.custom;
+        mask = &elem.traits;
         is_data = true;
         dest = id;
     }
@@ -78,6 +84,7 @@ protected:
         auto &&it = owner->details->data.insert_or_assign(id, std::move(node)).first;
         bucket = &it->second.prop;
         user = &it->second.custom;
+        mask = &it->second.traits;
         is_data = true;
         dest = id;
     }
@@ -87,6 +94,7 @@ protected:
         auto &&elem = owner->details->func[id];
         bucket = &elem.prop;
         user = &elem.custom;
+        mask = &elem.traits;
         is_data = false;
         dest = id;
     }
@@ -102,6 +110,7 @@ protected:
                     *curr = std::move(node);
                     bucket = &curr->prop;
                     user = &curr->custom;
+                    mask = &curr->traits;
                     return;
                 }
             }
@@ -113,6 +122,7 @@ protected:
         auto &&it = owner->details->func.insert_or_assign(id, std::move(node)).first;
         bucket = &it->second.prop;
         user = &it->second.custom;
+        mask = &it->second.traits;
     }
 
     void prop(const id_type key, meta_prop_node value) {
@@ -120,13 +130,7 @@ protected:
     }
 
     void traits(const meta_traits value) {
-        if(dest == parent) {
-            owner->traits |= value;
-        } else if(is_data) {
-            owner->details->data[dest].traits |= value;
-        } else {
-            owner->details->func[dest].traits |= value;
-        }
+        *mask |= value;
     }
 
     void custom(meta_custom_node node) {
@@ -152,6 +156,7 @@ private:
     meta_type_node *owner{};
     dense_map<id_type, meta_prop_node, identity> *bucket{};
     meta_custom_node *user{};
+    meta_traits *mask;
     const id_type parent{};
     id_type dest{};
     bool is_data{};