meta: reduce cost of meta ctor
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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{};
|
||||
|
||||
Reference in New Issue
Block a user