Browse Source

meta, get rid of useless info from meta_type to further reduce instantiations:
* removed meta_type::rank (no alternative provided)
* removed meta_type::extent (no alternative provided)
* removed meta_type::rmove_extent (no alternative provided)
* removed meta_type::remove_pointer ((*any).type())

Michele Caini 4 years ago
parent
commit
0332188b6b

+ 1 - 0
TODO

@@ -10,6 +10,7 @@ WIP:
 * custom allocators all over
 
 WIP:
+* payload traking destroy mixin for pools
 * make sparse_set/storage adhere to AllocatorAwareContainer requirements
 * make it possible to register externally managed pools with the registry (allow for system centric mode)
 * registry: switch to the udata/mixin model and get rid of poly storage, use pointer to sparse set only for pools, discard pool_data type.

+ 8 - 8
src/entt/meta/factory.hpp

@@ -403,9 +403,9 @@ struct meta_factory<Type> {
                 {},
                 nullptr,
                 nullptr,
-                internal::meta_trait::IS_NONE
-                    | ((std::is_same_v<Type, data_type> || std::is_const_v<data_type>) ? internal::meta_trait::IS_CONST : internal::meta_trait::IS_NONE)
-                    | internal::meta_trait::IS_STATIC,
+                internal::meta_traits::IS_NONE
+                    | ((std::is_same_v<Type, data_type> || std::is_const_v<data_type>) ? internal::meta_traits::IS_CONST : internal::meta_traits::IS_NONE)
+                    | internal::meta_traits::IS_STATIC,
                 internal::meta_info<data_type>::resolve(),
                 &meta_setter<Type, Data>,
                 &meta_getter<Type, Data, Policy>
@@ -452,8 +452,8 @@ struct meta_factory<Type> {
             {},
             nullptr,
             nullptr,
-            internal::meta_trait::IS_NONE
-                | ((std::is_same_v<decltype(Setter), std::nullptr_t> || (std::is_member_object_pointer_v<decltype(Setter)> && std::is_const_v<underlying_type>)) ? internal::meta_trait::IS_CONST : internal::meta_trait::IS_NONE)
+            internal::meta_traits::IS_NONE
+                | ((std::is_same_v<decltype(Setter), std::nullptr_t> || (std::is_member_object_pointer_v<decltype(Setter)> && std::is_const_v<underlying_type>)) ? internal::meta_traits::IS_CONST : internal::meta_traits::IS_NONE)
                 /* this is never static */,
             internal::meta_info<underlying_type>::resolve(),
             &meta_setter<Type, Setter>,
@@ -494,9 +494,9 @@ struct meta_factory<Type> {
             nullptr,
             nullptr,
             descriptor::args_type::size,
-            internal::meta_trait::IS_NONE
-                | (descriptor::is_const ? internal::meta_trait::IS_CONST : internal::meta_trait::IS_NONE)
-                | (descriptor::is_static ? internal::meta_trait::IS_STATIC : internal::meta_trait::IS_NONE),
+            internal::meta_traits::IS_NONE
+                | (descriptor::is_const ? internal::meta_traits::IS_CONST : internal::meta_traits::IS_NONE)
+                | (descriptor::is_static ? internal::meta_traits::IS_STATIC : internal::meta_traits::IS_NONE),
             internal::meta_info<std::conditional_t<std::is_same_v<Policy, as_void_t>, void, typename descriptor::return_type>>::resolve(),
             &meta_arg<typename descriptor::args_type>,
             &meta_invoke<Type, Candidate, Policy>

+ 17 - 53
src/entt/meta/meta.hpp

@@ -819,7 +819,7 @@ struct meta_data {
      * @return True if the data member is constant, false otherwise.
      */
     [[nodiscard]] bool is_const() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_CONST);
+        return (node->traits & internal::meta_traits::IS_CONST);
     }
 
     /**
@@ -827,7 +827,7 @@ struct meta_data {
      * @return True if the data member is static, false otherwise.
      */
     [[nodiscard]] bool is_static() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_STATIC);
+        return (node->traits & internal::meta_traits::IS_STATIC);
     }
 
     /*! @copydoc meta_any::type */
@@ -928,7 +928,7 @@ struct meta_func {
      * @return True if the member function is constant, false otherwise.
      */
     [[nodiscard]] bool is_const() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_CONST);
+        return (node->traits & internal::meta_traits::IS_CONST);
     }
 
     /**
@@ -936,7 +936,7 @@ struct meta_func {
      * @return True if the member function is static, false otherwise.
      */
     [[nodiscard]] bool is_static() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_STATIC);
+        return (node->traits & internal::meta_traits::IS_STATIC);
     }
 
     /**
@@ -1103,7 +1103,7 @@ public:
      * @return True if the underlying type is an integral type, false otherwise.
      */
     [[nodiscard]] bool is_integral() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_INTEGRAL);
+        return (node->traits & internal::meta_traits::IS_INTEGRAL);
     }
 
     /**
@@ -1112,7 +1112,7 @@ public:
      * otherwise.
      */
     [[nodiscard]] bool is_floating_point() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_FLOATING_POINT);
+        return (node->traits & internal::meta_traits::IS_FLOATING_POINT);
     }
 
     /**
@@ -1120,7 +1120,7 @@ public:
      * @return True if the underlying type is an array type, false otherwise.
      */
     [[nodiscard]] bool is_array() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_ARRAY);
+        return (node->traits & internal::meta_traits::IS_ARRAY);
     }
 
     /**
@@ -1128,7 +1128,7 @@ public:
      * @return True if the underlying type is an enum, false otherwise.
      */
     [[nodiscard]] bool is_enum() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_ENUM);
+        return (node->traits & internal::meta_traits::IS_ENUM);
     }
 
     /**
@@ -1136,7 +1136,7 @@ public:
      * @return True if the underlying type is an union, false otherwise.
      */
     [[nodiscard]] bool is_union() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_UNION);
+        return (node->traits & internal::meta_traits::IS_UNION);
     }
 
     /**
@@ -1144,7 +1144,7 @@ public:
      * @return True if the underlying type is a class, false otherwise.
      */
     [[nodiscard]] bool is_class() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_CLASS);
+        return (node->traits & internal::meta_traits::IS_CLASS);
     }
 
     /**
@@ -1152,7 +1152,7 @@ public:
      * @return True if the underlying type is a pointer, false otherwise.
      */
     [[nodiscard]] bool is_pointer() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_POINTER);
+        return (node->traits & internal::meta_traits::IS_POINTER);
     }
 
     /**
@@ -1161,7 +1161,7 @@ public:
      * otherwise.
      */
     [[nodiscard]] bool is_function_pointer() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_FUNCTION_POINTER);
+        return (node->traits & internal::meta_traits::IS_FUNCTION_POINTER);
     }
 
     /**
@@ -1170,7 +1170,7 @@ public:
      * otherwise.
      */
     [[nodiscard]] bool is_member_object_pointer() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_MEMBER_OBJECT_POINTER);
+        return (node->traits & internal::meta_traits::IS_MEMBER_OBJECT_POINTER);
     }
 
     /**
@@ -1180,7 +1180,7 @@ public:
      * false otherwise.
      */
     [[nodiscard]] bool is_member_function_pointer() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_MEMBER_FUNCTION_POINTER);
+        return (node->traits & internal::meta_traits::IS_MEMBER_FUNCTION_POINTER);
     }
 
     /**
@@ -1189,7 +1189,7 @@ public:
      * otherwise.
      */
     [[nodiscard]] bool is_pointer_like() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_META_POINTER_LIKE);
+        return (node->traits & internal::meta_traits::IS_META_POINTER_LIKE);
     }
 
     /**
@@ -1197,7 +1197,7 @@ public:
      * @return True if the type is a sequence container, false otherwise.
      */
     [[nodiscard]] bool is_sequence_container() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_META_SEQUENCE_CONTAINER);
+        return (node->traits & internal::meta_traits::IS_META_SEQUENCE_CONTAINER);
     }
 
     /**
@@ -1205,7 +1205,7 @@ public:
      * @return True if the type is an associative container, false otherwise.
      */
     [[nodiscard]] bool is_associative_container() const ENTT_NOEXCEPT {
-        return (node->traits & internal::meta_trait::IS_META_ASSOCIATIVE_CONTAINER);
+        return (node->traits & internal::meta_traits::IS_META_ASSOCIATIVE_CONTAINER);
     }
 
     /**
@@ -1246,42 +1246,6 @@ public:
         return index < template_arity() ? node->templ->arg(index) : meta_type{};
     }
 
-    /**
-     * @brief Provides the number of dimensions of an array type.
-     * @return The number of dimensions in case of array types, 0 otherwise.
-     */
-    [[nodiscard]] size_type rank() const ENTT_NOEXCEPT {
-        return node->rank;
-    }
-
-    /**
-     * @brief The number of elements along the given dimension of an array type.
-     * @param dim The dimension of which to return the number of elements.
-     * @return The number of elements along the given dimension in case of array
-     * types, 0 otherwise.
-     */
-    [[nodiscard]] size_type extent(const size_type dim = {}) const ENTT_NOEXCEPT {
-        return node->extent(dim);
-    }
-
-    /**
-     * @brief Provides the type for which the pointer is defined.
-     * @return The type for which the pointer is defined or this type if it
-     * doesn't refer to a pointer type.
-     */
-    [[nodiscard]] meta_type remove_pointer() const ENTT_NOEXCEPT {
-        return node->remove_pointer();
-    }
-
-    /**
-     * @brief Provides the type for which the array is defined.
-     * @return The type for which the array is defined or this type if it
-     * doesn't refer to an array type.
-     */
-    [[nodiscard]] meta_type remove_extent() const ENTT_NOEXCEPT {
-        return node->remove_extent();
-    }
-
     /**
      * @brief Returns a range to use to visit top-level base meta types.
      * @return An iterable range to use to visit top-level base meta types.

+ 18 - 33
src/entt/meta/node.hpp

@@ -30,7 +30,7 @@ struct meta_handle;
 namespace internal {
 
 
-enum meta_trait: std::uint32_t {
+enum meta_traits: std::uint32_t {
     IS_NONE = 0x0000,
     IS_CONST = 0x0001,
     IS_STATIC = 0x0002,
@@ -88,7 +88,7 @@ struct meta_data_node {
     id_type id;
     meta_data_node * next;
     meta_prop_node * prop;
-    std::underlying_type_t<meta_trait> traits;
+    std::underlying_type_t<meta_traits> traits;
     meta_type_node * const type;
     bool(* const set)(meta_handle, meta_any);
     meta_any(* const get)(meta_handle);
@@ -101,7 +101,7 @@ struct meta_func_node {
     meta_func_node * next;
     meta_prop_node * prop;
     const size_type arity;
-    std::underlying_type_t<meta_trait> traits;
+    std::underlying_type_t<meta_traits> traits;
     meta_type_node * const ret;
     meta_type(* const arg)(const size_type) ENTT_NOEXCEPT;
     meta_any(* const invoke)(meta_handle, meta_any * const);
@@ -123,11 +123,7 @@ struct meta_type_node {
     meta_type_node * next;
     meta_prop_node * prop;
     const size_type size_of;
-    std::underlying_type_t<meta_trait> traits;
-    const size_type rank;
-    size_type(* const extent)(const size_type) ENTT_NOEXCEPT ;
-    meta_type_node *(* const remove_pointer)() ENTT_NOEXCEPT;
-    meta_type_node *(* const remove_extent)() ENTT_NOEXCEPT;
+    std::underlying_type_t<meta_traits> traits;
     const meta_template_node *const templ;
     meta_ctor_node * const def_ctor;
     meta_ctor_node *ctor{nullptr};
@@ -147,13 +143,6 @@ template<typename Type>
 class ENTT_API meta_node {
     static_assert(std::is_same_v<Type, std::remove_cv_t<std::remove_reference_t<Type>>>, "Invalid type");
 
-    template<std::size_t... Index>
-    [[nodiscard]] static auto extent(const meta_type_node::size_type dim, std::index_sequence<Index...>) ENTT_NOEXCEPT {
-        meta_type_node::size_type ext{};
-        ((ext = (dim == Index ? std::extent_v<Type, Index> : ext)), ...);
-        return ext;
-    }
-
     [[nodiscard]] static meta_ctor_node * meta_default_constructor([[maybe_unused]] meta_type_node *type) ENTT_NOEXCEPT {
         if constexpr(std::is_default_constructible_v<Type>) {
             static meta_ctor_node node{
@@ -194,24 +183,20 @@ public:
             nullptr,
             nullptr,
             size_of_v<Type>,
-            internal::meta_trait::IS_NONE
-                | (std::is_integral_v<Type> ? internal::meta_trait::IS_INTEGRAL : internal::meta_trait::IS_NONE)
-                | (std::is_floating_point_v<Type> ? internal::meta_trait::IS_FLOATING_POINT : internal::meta_trait::IS_NONE)
-                | (std::is_array_v<Type> ? internal::meta_trait::IS_ARRAY : internal::meta_trait::IS_NONE)
-                | (std::is_enum_v<Type> ? internal::meta_trait::IS_ENUM : internal::meta_trait::IS_NONE)
-                | (std::is_union_v<Type> ? internal::meta_trait::IS_UNION : internal::meta_trait::IS_NONE)
-                | (std::is_class_v<Type> ? internal::meta_trait::IS_CLASS : internal::meta_trait::IS_NONE)
-                | (std::is_pointer_v<Type> ? internal::meta_trait::IS_POINTER : internal::meta_trait::IS_NONE)
-                | (std::is_pointer_v<Type> && std::is_function_v<std::remove_pointer_t<Type>> ? internal::meta_trait::IS_FUNCTION_POINTER : internal::meta_trait::IS_NONE)
-                | (std::is_member_object_pointer_v<Type> ? internal::meta_trait::IS_MEMBER_OBJECT_POINTER : internal::meta_trait::IS_NONE)
-                | (std::is_member_function_pointer_v<Type> ? internal::meta_trait::IS_MEMBER_FUNCTION_POINTER : internal::meta_trait::IS_NONE)
-                | (is_meta_pointer_like_v<Type> ? internal::meta_trait::IS_META_POINTER_LIKE : internal::meta_trait::IS_NONE)
-                | (is_complete_v<meta_sequence_container_traits<Type>> ? internal::meta_trait::IS_META_SEQUENCE_CONTAINER : internal::meta_trait::IS_NONE)
-                | (is_complete_v<meta_associative_container_traits<Type>> ? internal::meta_trait::IS_META_ASSOCIATIVE_CONTAINER : internal::meta_trait::IS_NONE),
-            std::rank_v<Type>,
-            [](meta_type_node::size_type dim) ENTT_NOEXCEPT { return extent(dim, std::make_index_sequence<std::rank_v<Type>>{}); },
-            &meta_node<std::remove_cv_t<std::remove_reference_t<std::remove_pointer_t<Type>>>>::resolve,
-            &meta_node<std::remove_cv_t<std::remove_reference_t<std::remove_extent_t<Type>>>>::resolve,
+            internal::meta_traits::IS_NONE
+                | (std::is_integral_v<Type> ? internal::meta_traits::IS_INTEGRAL : internal::meta_traits::IS_NONE)
+                | (std::is_floating_point_v<Type> ? internal::meta_traits::IS_FLOATING_POINT : internal::meta_traits::IS_NONE)
+                | (std::is_array_v<Type> ? internal::meta_traits::IS_ARRAY : internal::meta_traits::IS_NONE)
+                | (std::is_enum_v<Type> ? internal::meta_traits::IS_ENUM : internal::meta_traits::IS_NONE)
+                | (std::is_union_v<Type> ? internal::meta_traits::IS_UNION : internal::meta_traits::IS_NONE)
+                | (std::is_class_v<Type> ? internal::meta_traits::IS_CLASS : internal::meta_traits::IS_NONE)
+                | (std::is_pointer_v<Type> ? internal::meta_traits::IS_POINTER : internal::meta_traits::IS_NONE)
+                | (std::is_pointer_v<Type> && std::is_function_v<std::remove_pointer_t<Type>> ? internal::meta_traits::IS_FUNCTION_POINTER : internal::meta_traits::IS_NONE)
+                | (std::is_member_object_pointer_v<Type> ? internal::meta_traits::IS_MEMBER_OBJECT_POINTER : internal::meta_traits::IS_NONE)
+                | (std::is_member_function_pointer_v<Type> ? internal::meta_traits::IS_MEMBER_FUNCTION_POINTER : internal::meta_traits::IS_NONE)
+                | (is_meta_pointer_like_v<Type> ? internal::meta_traits::IS_META_POINTER_LIKE : internal::meta_traits::IS_NONE)
+                | (is_complete_v<meta_sequence_container_traits<Type>> ? internal::meta_traits::IS_META_SEQUENCE_CONTAINER : internal::meta_traits::IS_NONE)
+                | (is_complete_v<meta_associative_container_traits<Type>> ? internal::meta_traits::IS_META_ASSOCIATIVE_CONTAINER : internal::meta_traits::IS_NONE),
             meta_template_info(),
             meta_default_constructor(&node),
             meta_default_constructor(&node)

+ 0 - 2
test/entt/meta/meta_data.cpp

@@ -465,7 +465,6 @@ TEST_F(MetaData, ArrayStatic) {
     ASSERT_FALSE(data.is_const());
     ASSERT_TRUE(data.is_static());
     ASSERT_TRUE(data.type().is_array());
-    ASSERT_EQ(data.type().extent(), 3u);
     ASSERT_FALSE(data.get({}));
 }
 
@@ -481,7 +480,6 @@ TEST_F(MetaData, Array) {
     ASSERT_FALSE(data.is_const());
     ASSERT_FALSE(data.is_static());
     ASSERT_TRUE(data.type().is_array());
-    ASSERT_EQ(data.type().extent(), 5u);
     ASSERT_FALSE(data.get(instance));
 }
 

+ 0 - 2
test/entt/meta/meta_pointer.cpp

@@ -278,7 +278,6 @@ TEST(MetaPointerLike, DereferencePointerToVoid) {
     auto test = [](entt::meta_any any) {
         ASSERT_TRUE(any.type().is_pointer());
         ASSERT_TRUE(any.type().is_pointer_like());
-        ASSERT_EQ(any.type().remove_pointer(), entt::resolve<void>());
 
         auto deref = *any;
 
@@ -308,7 +307,6 @@ TEST(MetaPointerLike, DereferencePointerToFunction) {
     auto test = [](entt::meta_any any) {
         ASSERT_TRUE(any.type().is_pointer());
         ASSERT_TRUE(any.type().is_pointer_like());
-        ASSERT_EQ(any.type().remove_pointer(), entt::resolve<int()>());
         ASSERT_NE(any.try_cast<int(*)()>(), nullptr);
         ASSERT_EQ(any.cast<int(*)()>()(), 42);
     };

+ 0 - 19
test/entt/meta/meta_type.cpp

@@ -258,13 +258,6 @@ TEST_F(MetaType, Traits) {
     ASSERT_FALSE((entt::resolve<int>().is_associative_container()));
     ASSERT_TRUE((entt::resolve<std::map<int, char>>().is_associative_container()));
     ASSERT_FALSE(entt::resolve<std::vector<int>>().is_associative_container());
-
-    ASSERT_EQ(entt::resolve<int>().rank(), 0u);
-    ASSERT_EQ(entt::resolve<int[5][3]>().rank(), 2u);
-    ASSERT_EQ(entt::resolve<int>().extent(), 0u);
-    ASSERT_EQ(entt::resolve<int[5][3]>().extent(), 5u);
-    ASSERT_EQ(entt::resolve<int[5][3]>().extent(1u), 3u);
-    ASSERT_EQ(entt::resolve<int[5][3]>().extent(2u), 0u);
 }
 
 TEST_F(MetaType, TemplateInfo) {
@@ -280,18 +273,6 @@ TEST_F(MetaType, TemplateInfo) {
     ASSERT_EQ(entt::resolve<std::shared_ptr<int>>().template_arg(1u), entt::meta_type{});
 }
 
-TEST_F(MetaType, RemovePointer) {
-    ASSERT_EQ(entt::resolve<void *>().remove_pointer(), entt::resolve<void>());
-    ASSERT_EQ(entt::resolve<int(*)(char, double)>().remove_pointer(), entt::resolve<int(char, double)>());
-    ASSERT_EQ(entt::resolve<derived_t>().remove_pointer(), entt::resolve<derived_t>());
-}
-
-TEST_F(MetaType, RemoveExtent) {
-    ASSERT_EQ(entt::resolve<int[3]>().remove_extent(), entt::resolve<int>());
-    ASSERT_EQ(entt::resolve<int[3][3]>().remove_extent(), entt::resolve<int[3]>());
-    ASSERT_EQ(entt::resolve<derived_t>().remove_extent(), entt::resolve<derived_t>());
-}
-
 TEST_F(MetaType, Base) {
     using namespace entt::literals;