|
@@ -27,9 +27,11 @@ namespace entt {
|
|
|
namespace internal {
|
|
namespace internal {
|
|
|
|
|
|
|
|
class basic_meta_factory {
|
|
class basic_meta_factory {
|
|
|
- enum class bucket_category : std::uint8_t { type,
|
|
|
|
|
- data,
|
|
|
|
|
- func };
|
|
|
|
|
|
|
+ enum class bucket_category : std::uint8_t {
|
|
|
|
|
+ type,
|
|
|
|
|
+ data,
|
|
|
|
|
+ func
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
protected:
|
|
protected:
|
|
|
[[nodiscard]] inline decltype(auto) owner() {
|
|
[[nodiscard]] inline decltype(auto) owner() {
|
|
@@ -46,17 +48,17 @@ protected:
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void extend(const id_type id, meta_base_node node) {
|
|
void extend(const id_type id, meta_base_node node) {
|
|
|
- owner().details->base.insert_or_assign(id, std::move(node));
|
|
|
|
|
|
|
+ details->base.insert_or_assign(id, std::move(node));
|
|
|
category = bucket_category::type;
|
|
category = bucket_category::type;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void extend(const id_type id, meta_conv_node node) {
|
|
void extend(const id_type id, meta_conv_node node) {
|
|
|
- owner().details->conv.insert_or_assign(id, std::move(node));
|
|
|
|
|
|
|
+ details->conv.insert_or_assign(id, std::move(node));
|
|
|
category = bucket_category::type;
|
|
category = bucket_category::type;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void extend(const id_type id, meta_ctor_node node) {
|
|
void extend(const id_type id, meta_ctor_node node) {
|
|
|
- owner().details->ctor.insert_or_assign(id, std::move(node));
|
|
|
|
|
|
|
+ details->ctor.insert_or_assign(id, std::move(node));
|
|
|
category = bucket_category::type;
|
|
category = bucket_category::type;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -66,7 +68,7 @@ protected:
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void extend(const id_type id, meta_data_node node) {
|
|
void extend(const id_type id, meta_data_node node) {
|
|
|
- owner().details->data.insert_or_assign(id, std::move(node));
|
|
|
|
|
|
|
+ details->data.insert_or_assign(id, std::move(node));
|
|
|
category = bucket_category::data;
|
|
category = bucket_category::data;
|
|
|
bucket = id;
|
|
bucket = id;
|
|
|
}
|
|
}
|
|
@@ -75,9 +77,7 @@ protected:
|
|
|
category = bucket_category::func;
|
|
category = bucket_category::func;
|
|
|
bucket = id;
|
|
bucket = id;
|
|
|
|
|
|
|
|
- auto &&elem = owner();
|
|
|
|
|
-
|
|
|
|
|
- if(auto it = elem.details->func.find(id); it != elem.details->func.end()) {
|
|
|
|
|
|
|
+ if(auto it = details->func.find(id); it != details->func.end()) {
|
|
|
for(auto *curr = &it->second; curr; curr = curr->next.get()) {
|
|
for(auto *curr = &it->second; curr; curr = curr->next.get()) {
|
|
|
if(curr->invoke == node.invoke) {
|
|
if(curr->invoke == node.invoke) {
|
|
|
node.next = std::move(curr->next);
|
|
node.next = std::move(curr->next);
|
|
@@ -87,26 +87,24 @@ protected:
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// locally overloaded function
|
|
// locally overloaded function
|
|
|
- node.next = std::make_shared<meta_func_node>(std::move(elem.details->func[id]));
|
|
|
|
|
|
|
+ node.next = std::make_shared<meta_func_node>(std::move(details->func[id]));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- elem.details->func.insert_or_assign(id, std::move(node));
|
|
|
|
|
|
|
+ details->func.insert_or_assign(id, std::move(node));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void property(const id_type key, internal::meta_prop_node value) {
|
|
void property(const id_type key, internal::meta_prop_node value) {
|
|
|
- auto &&elem = owner();
|
|
|
|
|
-
|
|
|
|
|
switch(category) {
|
|
switch(category) {
|
|
|
case bucket_category::type:
|
|
case bucket_category::type:
|
|
|
- elem.details->prop[key] = std::move(value);
|
|
|
|
|
|
|
+ details->prop[key] = std::move(value);
|
|
|
break;
|
|
break;
|
|
|
case bucket_category::data:
|
|
case bucket_category::data:
|
|
|
- ENTT_ASSERT(elem.details->data.find(bucket) != elem.details->data.cend(), "Invalid bucket");
|
|
|
|
|
- elem.details->data[bucket].prop[key] = std::move(value);
|
|
|
|
|
|
|
+ ENTT_ASSERT(details->data.find(bucket) != details->data.cend(), "Invalid bucket");
|
|
|
|
|
+ details->data[bucket].prop[key] = std::move(value);
|
|
|
break;
|
|
break;
|
|
|
case bucket_category::func:
|
|
case bucket_category::func:
|
|
|
- ENTT_ASSERT(elem.details->func.find(bucket) != elem.details->func.cend(), "Invalid bucket");
|
|
|
|
|
- elem.details->func[bucket].prop[key] = std::move(value);
|
|
|
|
|
|
|
+ ENTT_ASSERT(details->func.find(bucket) != details->func.cend(), "Invalid bucket");
|
|
|
|
|
+ details->func[bucket].prop[key] = std::move(value);
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -114,18 +112,24 @@ protected:
|
|
|
public:
|
|
public:
|
|
|
basic_meta_factory(const type_info &info, meta_ctx &area)
|
|
basic_meta_factory(const type_info &info, meta_ctx &area)
|
|
|
: parent{info.hash()},
|
|
: parent{info.hash()},
|
|
|
- bucket{parent},
|
|
|
|
|
|
|
+ details{},
|
|
|
category{bucket_category::type},
|
|
category{bucket_category::type},
|
|
|
|
|
+ bucket{parent},
|
|
|
ctx{&area} {
|
|
ctx{&area} {
|
|
|
- if(auto &&elem = owner(); !elem.details) {
|
|
|
|
|
|
|
+ auto &&elem = owner();
|
|
|
|
|
+
|
|
|
|
|
+ if(!elem.details) {
|
|
|
elem.details = std::make_shared<internal::meta_type_descriptor>();
|
|
elem.details = std::make_shared<internal::meta_type_descriptor>();
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ details = elem.details;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
private:
|
|
|
const id_type parent;
|
|
const id_type parent;
|
|
|
- id_type bucket;
|
|
|
|
|
|
|
+ std::shared_ptr<meta_type_descriptor> details;
|
|
|
bucket_category category;
|
|
bucket_category category;
|
|
|
|
|
+ id_type bucket;
|
|
|
meta_ctx *ctx;
|
|
meta_ctx *ctx;
|
|
|
};
|
|
};
|
|
|
|
|
|