diff --git a/src/entt/meta/factory.hpp b/src/entt/meta/factory.hpp index b3eb99d26..a4ca802f5 100644 --- a/src/entt/meta/factory.hpp +++ b/src/entt/meta/factory.hpp @@ -64,7 +64,9 @@ class basic_meta_factory { details->conv.insert_or_assign(node.type, node); } else { static_assert(std::is_same_v, "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); } } diff --git a/src/entt/meta/meta.hpp b/src/entt/meta/meta.hpp index b7b120a47..54099a366 100644 --- a/src/entt/meta/meta.hpp +++ b/src/entt/meta/meta.hpp @@ -1444,7 +1444,7 @@ class meta_type { */ [[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); } } diff --git a/src/entt/meta/node.hpp b/src/entt/meta/node.hpp index 93103eb0d..2bed225f1 100644 --- a/src/entt/meta/node.hpp +++ b/src/entt/meta/node.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #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 ctor{}; + std::vector ctor{}; dense_map base{}; dense_map conv{}; dense_map data{};