Просмотр исходного кода

meta: avoid using y_combinator to clean up types (close #700)

Michele Caini 4 лет назад
Родитель
Сommit
00c0afd093
1 измененных файлов с 11 добавлено и 12 удалено
  1. 11 12
      src/entt/meta/meta.hpp

+ 11 - 12
src/entt/meta/meta.hpp

@@ -1069,6 +1069,14 @@ class meta_type {
         return nullptr;
     }
 
+    template<auto... Member, typename Node>
+    void unregister_all(Node **curr) {
+        while(*curr) {
+            (unregister_all(&((*curr)->*Member)), ...);
+            *curr = std::exchange((*curr)->next, nullptr);
+        }
+    };
+
 public:
     /*! @brief Node type. */
     using node_type = internal::meta_type_node;
@@ -1566,21 +1574,12 @@ public:
             }
         }
 
-        const auto unregister_all = y_combinator{
-            [](auto &&self, auto **curr, auto... member) {
-                while(*curr) {
-                    (self(&((*curr)->*member)), ...);
-                    *curr = std::exchange((*curr)->next, nullptr);
-                }
-            }
-        };
-
         unregister_all(&node->prop);
         unregister_all(&node->base);
         unregister_all(&node->conv);
-        unregister_all(&node->ctor, &internal::meta_ctor_node::prop);
-        unregister_all(&node->data, &internal::meta_data_node::prop);
-        unregister_all(&node->func, &internal::meta_func_node::prop);
+        unregister_all<&internal::meta_ctor_node::prop>(&node->ctor);
+        unregister_all<&internal::meta_data_node::prop>(&node->data);
+        unregister_all<&internal::meta_func_node::prop>(&node->func);
 
         node->id = {};
         node->ctor = node->def_ctor;