Sfoglia il codice sorgente

meta: rollback redundant functions (reduce the number of generated symbols)

Michele Caini 3 anni fa
parent
commit
146a7b2aa3
1 ha cambiato i file con 22 aggiunte e 35 eliminazioni
  1. 22 35
      src/entt/meta/node.hpp

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

@@ -170,16 +170,34 @@ template<typename... Args>
 }
 }
 
 
 template<typename Type>
 template<typename Type>
-void meta_default_constructor([[maybe_unused]] meta_type_node &node) {
+[[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(context, type_id<Type>()); 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>>>};
+
     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) {
             return meta_any{ctx, std::in_place_type<Type>};
             return meta_any{ctx, std::in_place_type<Type>};
         };
         };
     }
     }
-}
 
 
-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));
@@ -189,10 +207,7 @@ void meta_conversion_helper([[maybe_unused]] meta_type_node &node) {
             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 = +[](const meta_ctx &ctx, void *element, const void *as_const) {
         node.from_void = +[](const meta_ctx &ctx, void *element, const void *as_const) {
             if(element) {
             if(element) {
@@ -202,34 +217,6 @@ void meta_from_void([[maybe_unused]] meta_type_node &node) {
             return meta_any{ctx, std::in_place_type<const std::decay_t<Type> &>, *static_cast<const std::decay_t<Type> *>(as_const)};
             return meta_any{ctx, std::in_place_type<const std::decay_t<Type> &>, *static_cast<const std::decay_t<Type> *>(as_const)};
         };
         };
     }
     }
-}
-
-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(context, type_id<Type>()); 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{