Browse Source

meta: reduce lambda instantiations

Michele Caini 4 years ago
parent
commit
d12ba5e527
2 changed files with 23 additions and 4 deletions
  1. 4 4
      src/entt/meta/meta.hpp
  2. 19 0
      src/entt/meta/node.hpp

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

@@ -387,7 +387,7 @@ public:
         if(node) {
         if(node) {
             if(const auto info = type_id<Type>(); node->info == info) {
             if(const auto info = type_id<Type>(); node->info == info) {
                 return any_cast<Type>(&storage);
                 return any_cast<Type>(&storage);
-            } else if(const auto *base = internal::meta_visit<&internal::meta_type_node::base>([info](const auto *curr) { return curr->type()->info == info; }, node); base) {
+            } else if(const auto *base = internal::meta_visit<&internal::meta_type_node::base>(info, node); base) {
                 return static_cast<const Type *>(base->cast(storage.data()));
                 return static_cast<const Type *>(base->cast(storage.data()));
             }
             }
         }
         }
@@ -401,7 +401,7 @@ public:
         if(node) {
         if(node) {
             if(const auto info = type_id<Type>(); node->info == info) {
             if(const auto info = type_id<Type>(); node->info == info) {
                 return any_cast<Type>(&storage);
                 return any_cast<Type>(&storage);
-            } else if(const auto *base = internal::meta_visit<&internal::meta_type_node::base>([info](const auto *curr) { return curr->type()->info == info; }, node); base) {
+            } else if(const auto *base = internal::meta_visit<&internal::meta_type_node::base>(info, node); base) {
                 return static_cast<Type *>(const_cast<constness_as_t<void, Type> *>(base->cast(static_cast<constness_as_t<any, Type> &>(storage).data())));
                 return static_cast<Type *>(const_cast<constness_as_t<void, Type> *>(base->cast(static_cast<constness_as_t<any, Type> &>(storage).data())));
             }
             }
         }
         }
@@ -447,7 +447,7 @@ public:
         if(try_cast<std::remove_reference_t<Type>>() != nullptr) {
         if(try_cast<std::remove_reference_t<Type>>() != nullptr) {
             return as_ref();
             return as_ref();
         } else if(node) {
         } else if(node) {
-            if(const auto * const conv = internal::meta_visit<&internal::meta_type_node::conv>([info = type_id<Type>()](const auto *curr) { return curr->type()->info == info; }, node); conv) {
+            if(const auto * const conv = internal::meta_visit<&internal::meta_type_node::conv>(type_id<Type>(), node); conv) {
                 return conv->conv(storage.data());
                 return conv->conv(storage.data());
             }
             }
         }
         }
@@ -466,7 +466,7 @@ public:
         if(try_cast<std::remove_reference_t<const Type>>() != nullptr) {
         if(try_cast<std::remove_reference_t<const Type>>() != nullptr) {
             return true;
             return true;
         } else if(node) {
         } else if(node) {
-            if(const auto * const conv = internal::meta_visit<&internal::meta_type_node::conv>([info = type_id<Type>()](const auto *curr) { return curr->type()->info == info; }, node); conv) {
+            if(const auto * const conv = internal::meta_visit<&internal::meta_type_node::conv>(type_id<Type>(), node); conv) {
                 *this = conv->conv(std::as_const(storage).data());
                 *this = conv->conv(std::as_const(storage).data());
                 return true;
                 return true;
             }
             }

+ 19 - 0
src/entt/meta/node.hpp

@@ -139,6 +139,25 @@ struct meta_type_node {
 };
 };
 
 
 
 
+template<auto Member, typename Node>
+std::decay_t<decltype(std::declval<Node>().*Member)>
+meta_visit(const type_info &info, const Node *node) {
+    for(auto *curr = node->*Member; curr; curr = curr->next) {
+        if(curr->type()->info == info) {
+            return curr;
+        }
+    }
+
+    for(auto *curr = node->base; curr; curr = curr->next) {
+        if(auto *ret = meta_visit<Member>(info, curr->type()); ret) {
+            return ret;
+        }
+    }
+
+    return nullptr;
+}
+
+
 template<auto Member, typename Op, typename Node>
 template<auto Member, typename Op, typename Node>
 auto meta_visit(const Op &op, const Node *node)
 auto meta_visit(const Op &op, const Node *node)
 -> std::decay_t<decltype(node->*Member)> {
 -> std::decay_t<decltype(node->*Member)> {