فهرست منبع

meta: try to get around invalid code that msvc accepts happily otherwise

Michele Caini 3 سال پیش
والد
کامیت
238ebe4e8f
1فایلهای تغییر یافته به همراه35 افزوده شده و 22 حذف شده
  1. 35 22
      src/entt/meta/node.hpp

+ 35 - 22
src/entt/meta/node.hpp

@@ -170,28 +170,7 @@ template<typename... Args>
 }
 }
 
 
 template<typename Type>
 template<typename Type>
-[[nodiscard]] meta_type_node resolve(const meta_context &context) noexcept {
-    static_assert(std::is_same_v<Type, std::remove_const_t<std::remove_reference_t<Type>>>, "Invalid type");
-
-    if(auto *elem = try_resolve(type_id<Type>(), context); elem) {
-        return *elem;
-    }
-
-    meta_type_node node{
-        &type_id<Type>(),
-        type_id<Type>().hash(),
-        (std::is_arithmetic_v<Type> ? meta_traits::is_arithmetic : meta_traits::is_none)
-            | (std::is_integral_v<Type> ? meta_traits::is_integral : meta_traits::is_none)
-            | (std::is_signed_v<Type> ? meta_traits::is_signed : meta_traits::is_none)
-            | (std::is_array_v<Type> ? meta_traits::is_array : meta_traits::is_none)
-            | (std::is_enum_v<Type> ? meta_traits::is_enum : meta_traits::is_none)
-            | (std::is_class_v<Type> ? meta_traits::is_class : meta_traits::is_none)
-            | (is_meta_pointer_like_v<Type> ? meta_traits::is_meta_pointer_like : meta_traits::is_none)
-            | (is_complete_v<meta_sequence_container_traits<Type>> ? meta_traits::is_meta_sequence_container : meta_traits::is_none)
-            | (is_complete_v<meta_associative_container_traits<Type>> ? meta_traits::is_meta_associative_container : meta_traits::is_none),
-        size_of_v<Type>,
-        &resolve<std::remove_cv_t<std::remove_pointer_t<Type>>>};
-
+void meta_default_constructor([[maybe_unused]] meta_type_node &node) {
     if constexpr(std::is_default_constructible_v<Type>) {
     if constexpr(std::is_default_constructible_v<Type>) {
         node.default_constructor = +[](const meta_ctx &ctx) {
         node.default_constructor = +[](const meta_ctx &ctx) {
             // TODO it would be great if we had value and context construction support for meta_any
             // TODO it would be great if we had value and context construction support for meta_any
@@ -200,7 +179,10 @@ template<typename Type>
             return elem;
             return elem;
         };
         };
     }
     }
+}
 
 
+template<typename Type>
+void meta_conversion_helper([[maybe_unused]] meta_type_node &node) {
     if constexpr(std::is_arithmetic_v<Type>) {
     if constexpr(std::is_arithmetic_v<Type>) {
         node.conversion_helper = +[](void *bin, const void *value) {
         node.conversion_helper = +[](void *bin, const void *value) {
             return bin ? static_cast<double>(*static_cast<Type *>(bin) = static_cast<Type>(*static_cast<const double *>(value))) : static_cast<double>(*static_cast<const Type *>(value));
             return bin ? static_cast<double>(*static_cast<Type *>(bin) = static_cast<Type>(*static_cast<const double *>(value))) : static_cast<double>(*static_cast<const Type *>(value));
@@ -210,7 +192,10 @@ template<typename Type>
             return bin ? static_cast<double>(*static_cast<Type *>(bin) = static_cast<Type>(static_cast<std::underlying_type_t<Type>>(*static_cast<const double *>(value)))) : static_cast<double>(*static_cast<const Type *>(value));
             return bin ? static_cast<double>(*static_cast<Type *>(bin) = static_cast<Type>(static_cast<std::underlying_type_t<Type>>(*static_cast<const double *>(value)))) : static_cast<double>(*static_cast<const Type *>(value));
         };
         };
     }
     }
+}
 
 
+template<typename Type>
+void meta_from_void([[maybe_unused]] meta_type_node &node) {
     if constexpr(!std::is_same_v<Type, void> && !std::is_function_v<Type>) {
     if constexpr(!std::is_same_v<Type, void> && !std::is_function_v<Type>) {
         node.from_void = +[](void *element, const void *as_const, const meta_ctx &ctx) {
         node.from_void = +[](void *element, const void *as_const, const meta_ctx &ctx) {
             // TODO it would be great if we had value and context construction support for meta_any
             // TODO it would be great if we had value and context construction support for meta_any
@@ -219,6 +204,34 @@ template<typename Type>
             return elem;
             return elem;
         };
         };
     }
     }
+}
+
+template<typename Type>
+[[nodiscard]] meta_type_node resolve(const meta_context &context) noexcept {
+    static_assert(std::is_same_v<Type, std::remove_const_t<std::remove_reference_t<Type>>>, "Invalid type");
+
+    if(auto *elem = try_resolve(type_id<Type>(), context); elem) {
+        return *elem;
+    }
+
+    meta_type_node node{
+        &type_id<Type>(),
+        type_id<Type>().hash(),
+        (std::is_arithmetic_v<Type> ? meta_traits::is_arithmetic : meta_traits::is_none)
+            | (std::is_integral_v<Type> ? meta_traits::is_integral : meta_traits::is_none)
+            | (std::is_signed_v<Type> ? meta_traits::is_signed : meta_traits::is_none)
+            | (std::is_array_v<Type> ? meta_traits::is_array : meta_traits::is_none)
+            | (std::is_enum_v<Type> ? meta_traits::is_enum : meta_traits::is_none)
+            | (std::is_class_v<Type> ? meta_traits::is_class : meta_traits::is_none)
+            | (is_meta_pointer_like_v<Type> ? meta_traits::is_meta_pointer_like : meta_traits::is_none)
+            | (is_complete_v<meta_sequence_container_traits<Type>> ? meta_traits::is_meta_sequence_container : meta_traits::is_none)
+            | (is_complete_v<meta_associative_container_traits<Type>> ? meta_traits::is_meta_associative_container : meta_traits::is_none),
+        size_of_v<Type>,
+        &resolve<std::remove_cv_t<std::remove_pointer_t<Type>>>};
+
+    meta_default_constructor<Type>(node);
+    meta_conversion_helper<Type>(node);
+    meta_from_void<Type>(node);
 
 
     if constexpr(is_complete_v<meta_template_traits<Type>>) {
     if constexpr(is_complete_v<meta_template_traits<Type>>) {
         node.templ = meta_template_node{
         node.templ = meta_template_node{