瀏覽代碼

meta: reduce cost of meta ctor

Michele Caini 1 年之前
父節點
當前提交
5da2c3c3c2
共有 3 個文件被更改,包括 6 次插入3 次删除
  1. 3 1
      src/entt/meta/factory.hpp
  2. 1 1
      src/entt/meta/meta.hpp
  3. 2 1
      src/entt/meta/node.hpp

+ 3 - 1
src/entt/meta/factory.hpp

@@ -64,7 +64,9 @@ protected:
             details->conv.insert_or_assign(node.type, node);
         } else {
             static_assert(std::is_same_v<Type, meta_ctor_node>, "Unexpected type");
-            details->ctor.insert_or_assign(node.id, node);
+            std::size_t pos{};
+            for(const std::size_t last = details->ctor.size(); (pos != last) && (details->ctor[pos].id != node.id); ++pos) {}
+            (pos == details->ctor.size()) ? details->ctor.emplace_back(node) : (details->ctor[pos] = node);
         }
     }
 

+ 1 - 1
src/entt/meta/meta.hpp

@@ -1444,7 +1444,7 @@ public:
      */
     [[nodiscard]] meta_any construct(meta_any *const args, const size_type sz) const {
         if(node.details) {
-            if(const auto *candidate = lookup(args, sz, false, [first = node.details->ctor.cbegin(), last = node.details->ctor.cend()]() mutable { return first == last ? nullptr : &(first++)->second; }); candidate) {
+            if(const auto *candidate = lookup(args, sz, false, [first = node.details->ctor.cbegin(), last = node.details->ctor.cend()]() mutable { return first == last ? nullptr : &*(first++); }); candidate) {
                 return candidate->invoke(*ctx, args);
             }
         }

+ 2 - 1
src/entt/meta/node.hpp

@@ -5,6 +5,7 @@
 #include <memory>
 #include <type_traits>
 #include <utility>
+#include <vector>
 #include "../config/config.h"
 #include "../container/dense_map.hpp"
 #include "../core/attribute.h"
@@ -134,7 +135,7 @@ struct meta_template_node {
 };
 
 struct meta_type_descriptor {
-    dense_map<id_type, meta_ctor_node, identity> ctor{};
+    std::vector<meta_ctor_node> ctor{};
     dense_map<id_type, meta_base_node, identity> base{};
     dense_map<id_type, meta_conv_node, identity> conv{};
     dense_map<id_type, meta_data_node, identity> data{};