Bläddra i källkod

meta: context no longer exists

Michele Caini 6 år sedan
förälder
incheckning
b8784863f2
3 ändrade filer med 43 tillägg och 65 borttagningar
  1. 39 7
      src/entt/meta/factory.hpp
  2. 1 52
      src/entt/meta/meta.hpp
  3. 3 6
      test/entt/meta/meta.cpp

+ 39 - 7
src/entt/meta/factory.hpp

@@ -10,6 +10,7 @@
 #include <type_traits>
 #include "../config/config.h"
 #include "../core/type_traits.hpp"
+#include "../core/utility.hpp"
 #include "policy.hpp"
 #include "meta.hpp"
 
@@ -390,11 +391,11 @@ public:
     auto type(const ENTT_ID_TYPE identifier) ENTT_NOEXCEPT {
         auto * const node = internal::meta_info<Type>::resolve();
 
-        ENTT_ASSERT(!duplicate(identifier, *internal::meta_info<>::global));
-        ENTT_ASSERT(!duplicate(node, *internal::meta_info<>::global));
+        ENTT_ASSERT(!duplicate(identifier, internal::meta_info<>::node));
+        ENTT_ASSERT(!duplicate(node, internal::meta_info<>::node));
         node->identifier = identifier;
-        node->next = *internal::meta_info<>::global;
-        *internal::meta_info<>::global = node;
+        node->next = internal::meta_info<>::node;
+        internal::meta_info<>::node = node;
 
         return meta_factory<Type, Type>{&node->prop};
     }
@@ -773,7 +774,38 @@ public:
      * Base classes aren't reset but the link between the two types is removed.
      */
     void reset() ENTT_NOEXCEPT {
-        internal::meta_info<>::reset(internal::meta_info<Type>::resolve());
+        auto * const node = internal::meta_info<Type>::resolve();
+        auto **it = &internal::meta_node<>::node;
+
+        while(*it && *it != node) {
+            it = &(*it)->next;
+        }
+
+        if(*it) {
+            *it = (*it)->next;
+        }
+
+        const auto unregister_all = y_combinator{
+            [](auto &&self, auto **curr, auto... member) {
+                while(*curr) {
+                    auto *prev = *curr;
+                    (self(&(prev->*member)), ...);
+                    *curr = prev->next;
+                    prev->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);
+
+        node->identifier = {};
+        node->next = nullptr;
+        node->dtor = nullptr;
     }
 };
 
@@ -816,7 +848,7 @@ inline meta_type resolve() ENTT_NOEXCEPT {
 inline meta_type resolve(const ENTT_ID_TYPE identifier) ENTT_NOEXCEPT {
     return internal::find_if([identifier](const auto *curr) {
         return curr->identifier == identifier;
-    }, *internal::meta_info<>::global);
+    }, internal::meta_info<>::node);
 }
 
 
@@ -828,7 +860,7 @@ inline meta_type resolve(const ENTT_ID_TYPE identifier) ENTT_NOEXCEPT {
 template<typename Op>
 inline std::enable_if_t<std::is_invocable_v<Op, meta_type>, void>
 resolve(Op op) {
-    internal::visit<meta_type>(std::move(op), *internal::meta_info<>::global);
+    internal::visit<meta_type>(std::move(op), internal::meta_info<>::node);
 }
 
 

+ 1 - 52
src/entt/meta/meta.hpp

@@ -8,7 +8,6 @@
 #include <type_traits>
 #include "../config/config.h"
 #include "../core/type_traits.hpp"
-#include "../core/utility.hpp"
 
 
 namespace entt {
@@ -195,42 +194,7 @@ struct meta_node;
 
 template<>
 struct meta_node<> {
-    inline static meta_type_node *local = nullptr;
-    inline static meta_type_node **global = &local;
-
-    static void reset(meta_type_node *node) ENTT_NOEXCEPT {
-        auto **it = global;
-
-        while(*it && *it != node) {
-            it = &(*it)->next;
-        }
-
-        if(*it) {
-            *it = (*it)->next;
-        }
-
-        const auto unregister_all = y_combinator{
-            [](auto &&self, auto **curr, auto... member) {
-                while(*curr) {
-                    auto *prev = *curr;
-                    (self(&(prev->*member)), ...);
-                    *curr = prev->next;
-                    prev->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);
-
-        node->identifier = {};
-        node->next = nullptr;
-        node->dtor = nullptr;
-    }
+    inline static meta_type_node *node = nullptr;
 };
 
 
@@ -1559,21 +1523,6 @@ private:
 };
 
 
-/*! @brief Opaque container for a meta context. */
-struct meta_ctx {
-    /**
-     * @brief Binds the meta system to the given context.
-     * @param other A valid context to which to bind.
-     */
-    static void bind(meta_ctx other) ENTT_NOEXCEPT {
-        internal::meta_info<>::global = other.ctx;
-    }
-
-private:
-    internal::meta_type_node **ctx{&internal::meta_info<>::local};
-};
-
-
 /*! @copydoc operator!=(const meta_prop &, const meta_prop &) */
 inline bool operator!=(const meta_type &lhs, const meta_type &rhs) ENTT_NOEXCEPT {
     return !(lhs == rhs);

+ 3 - 6
test/entt/meta/meta.cpp

@@ -1917,8 +1917,7 @@ TEST_F(Meta, PropertiesAndCornerCases) {
 }
 
 TEST_F(Meta, Reset) {
-    ASSERT_NE(*entt::internal::meta_info<>::global, nullptr);
-    ASSERT_NE(entt::internal::meta_info<>::local, nullptr);
+    ASSERT_NE(entt::internal::meta_info<>::node, nullptr);
 
     entt::meta<char>().reset();
     entt::meta<concrete_type>().reset();
@@ -1936,8 +1935,7 @@ TEST_F(Meta, Reset) {
     entt::meta<another_abstract_type>().reset();
     entt::meta<unsigned int>().reset();
 
-    ASSERT_EQ(*entt::internal::meta_info<>::global, nullptr);
-    ASSERT_EQ(entt::internal::meta_info<>::local, nullptr);
+    ASSERT_EQ(entt::internal::meta_info<>::node, nullptr);
 
     ASSERT_FALSE(entt::resolve("char"_hs));
     ASSERT_FALSE(entt::resolve("base"_hs));
@@ -1951,8 +1949,7 @@ TEST_F(Meta, Reset) {
     ASSERT_FALSE(entt::resolve("another_abstract_type"_hs));
     ASSERT_FALSE(entt::resolve("concrete"_hs));
 
-    ASSERT_EQ(*entt::internal::meta_info<>::global, nullptr);
-    ASSERT_EQ(entt::internal::meta_info<>::local, nullptr);
+    ASSERT_EQ(entt::internal::meta_info<>::node, nullptr);
 
     Meta::SetUpAfterUnregistration();
     entt::meta_any any{42.};