Browse Source

meta: further reduce the number of instantiations

Michele Caini 3 years ago
parent
commit
dac4ae94c0
2 changed files with 21 additions and 26 deletions
  1. 6 6
      src/entt/meta/meta.hpp
  2. 15 20
      src/entt/meta/node.hpp

+ 6 - 6
src/entt/meta/meta.hpp

@@ -764,7 +764,7 @@ struct meta_data {
      * @brief Returns a range to visit registered meta properties.
      * @brief Returns a range to visit registered meta properties.
      * @return An iterable range to visit registered meta properties.
      * @return An iterable range to visit registered meta properties.
      */
      */
-    [[nodiscard]] meta_range<meta_prop, typename decltype(internal::meta_data_node::cold_data_t::prop)::const_iterator> prop() const noexcept {
+    [[nodiscard]] meta_range<meta_prop, typename decltype(internal::meta_prop_map::prop)::const_iterator> prop() const noexcept {
         if(node.details) {
         if(node.details) {
             return {node.details->prop.cbegin(), node.details->prop.cend()};
             return {node.details->prop.cbegin(), node.details->prop.cend()};
         }
         }
@@ -882,7 +882,7 @@ struct meta_func {
     }
     }
 
 
     /*! @copydoc meta_data::prop */
     /*! @copydoc meta_data::prop */
-    [[nodiscard]] meta_range<meta_prop, typename decltype(internal::meta_func_node::cold_data_t::prop)::const_iterator> prop() const noexcept {
+    [[nodiscard]] meta_range<meta_prop, typename decltype(internal::meta_prop_map::prop)::const_iterator> prop() const noexcept {
         if(node.details) {
         if(node.details) {
             return {node.details->prop.cbegin(), node.details->prop.cend()};
             return {node.details->prop.cbegin(), node.details->prop.cend()};
         }
         }
@@ -1143,7 +1143,7 @@ public:
      * @brief Returns a range to visit registered top-level base meta types.
      * @brief Returns a range to visit registered top-level base meta types.
      * @return An iterable range to visit registered top-level base meta types.
      * @return An iterable range to visit registered top-level base meta types.
      */
      */
-    [[nodiscard]] meta_range<meta_type, typename decltype(internal::meta_type_node::cold_data_t::base)::const_iterator> base() const noexcept {
+    [[nodiscard]] meta_range<meta_type, typename decltype(internal::meta_type_descriptor::base)::const_iterator> base() const noexcept {
         if(node.details) {
         if(node.details) {
             return {node.details->base.cbegin(), node.details->base.cend()};
             return {node.details->base.cbegin(), node.details->base.cend()};
         }
         }
@@ -1155,7 +1155,7 @@ public:
      * @brief Returns a range to visit registered top-level meta data.
      * @brief Returns a range to visit registered top-level meta data.
      * @return An iterable range to visit registered top-level meta data.
      * @return An iterable range to visit registered top-level meta data.
      */
      */
-    [[nodiscard]] meta_range<meta_data, typename decltype(internal::meta_type_node::cold_data_t::data)::const_iterator> data() const noexcept {
+    [[nodiscard]] meta_range<meta_data, typename decltype(internal::meta_type_descriptor::data)::const_iterator> data() const noexcept {
         if(node.details) {
         if(node.details) {
             return {node.details->data.cbegin(), node.details->data.cend()};
             return {node.details->data.cbegin(), node.details->data.cend()};
         }
         }
@@ -1191,7 +1191,7 @@ public:
      * @brief Returns a range to visit registered top-level functions.
      * @brief Returns a range to visit registered top-level functions.
      * @return An iterable range to visit registered top-level functions.
      * @return An iterable range to visit registered top-level functions.
      */
      */
-    [[nodiscard]] meta_range<meta_func, typename decltype(internal::meta_type_node::cold_data_t::func)::const_iterator> func() const noexcept {
+    [[nodiscard]] meta_range<meta_func, typename decltype(internal::meta_type_descriptor::func)::const_iterator> func() const noexcept {
         if(node.details) {
         if(node.details) {
             return {node.details->func.cbegin(), node.details->func.cend()};
             return {node.details->func.cbegin(), node.details->func.cend()};
         }
         }
@@ -1375,7 +1375,7 @@ public:
      * @brief Returns a range to visit registered top-level meta properties.
      * @brief Returns a range to visit registered top-level meta properties.
      * @return An iterable range to visit registered top-level meta properties.
      * @return An iterable range to visit registered top-level meta properties.
      */
      */
-    [[nodiscard]] meta_range<meta_prop, typename decltype(internal::meta_type_node::cold_data_t::prop)::const_iterator> prop() const noexcept {
+    [[nodiscard]] meta_range<meta_prop, typename decltype(internal::meta_prop_map::prop)::const_iterator> prop() const noexcept {
         if(node.details) {
         if(node.details) {
             return {node.details->prop.cbegin(), node.details->prop.cend()};
             return {node.details->prop.cbegin(), node.details->prop.cend()};
         }
         }

+ 15 - 20
src/entt/meta/node.hpp

@@ -52,6 +52,10 @@ struct meta_prop_node {
     std::shared_ptr<void> value{};
     std::shared_ptr<void> value{};
 };
 };
 
 
+struct meta_prop_map {
+    dense_map<id_type, meta_prop_node, identity> prop{};
+};
+
 struct meta_base_node {
 struct meta_base_node {
     meta_type_node (*type)() noexcept {};
     meta_type_node (*type)() noexcept {};
     meta_any (*cast)(meta_any) noexcept {};
     meta_any (*cast)(meta_any) noexcept {};
@@ -76,33 +80,25 @@ struct meta_dtor_node {
 struct meta_data_node {
 struct meta_data_node {
     using size_type = std::size_t;
     using size_type = std::size_t;
 
 
-    struct cold_data_t {
-        dense_map<id_type, meta_prop_node, identity> prop;
-    };
-
     meta_traits traits{meta_traits::is_none};
     meta_traits traits{meta_traits::is_none};
     size_type arity{0u};
     size_type arity{0u};
     meta_type_node (*type)() noexcept {};
     meta_type_node (*type)() noexcept {};
     meta_type (*arg)(const size_type) noexcept {};
     meta_type (*arg)(const size_type) noexcept {};
     bool (*set)(meta_handle, meta_any){};
     bool (*set)(meta_handle, meta_any){};
     meta_any (*get)(meta_handle){};
     meta_any (*get)(meta_handle){};
-    std::shared_ptr<cold_data_t> details{};
+    std::shared_ptr<meta_prop_map> details{};
 };
 };
 
 
 struct meta_func_node {
 struct meta_func_node {
     using size_type = std::size_t;
     using size_type = std::size_t;
 
 
-    struct cold_data_t {
-        dense_map<id_type, meta_prop_node, identity> prop;
-    };
-
     meta_traits traits{meta_traits::is_none};
     meta_traits traits{meta_traits::is_none};
     size_type arity{0u};
     size_type arity{0u};
     meta_type_node (*ret)() noexcept {};
     meta_type_node (*ret)() noexcept {};
     meta_type (*arg)(const size_type) noexcept {};
     meta_type (*arg)(const size_type) noexcept {};
     meta_any (*invoke)(meta_handle, meta_any *const){};
     meta_any (*invoke)(meta_handle, meta_any *const){};
     std::shared_ptr<meta_func_node> next{};
     std::shared_ptr<meta_func_node> next{};
-    std::shared_ptr<cold_data_t> details{};
+    std::shared_ptr<meta_prop_map> details{};
 };
 };
 
 
 struct meta_template_node {
 struct meta_template_node {
@@ -113,18 +109,17 @@ struct meta_template_node {
     meta_type_node (*arg)(const size_type) noexcept {};
     meta_type_node (*arg)(const size_type) noexcept {};
 };
 };
 
 
+struct meta_type_descriptor: meta_prop_map {
+    dense_map<id_type, meta_ctor_node, identity> ctor{};
+    dense_map<id_type, meta_base_node, identity> base{};
+    dense_map<id_type, meta_conv_node, identity> conv{};
+    dense_map<id_type, meta_data_node, identity> data{};
+    dense_map<id_type, meta_func_node, identity> func{};
+};
+
 struct meta_type_node {
 struct meta_type_node {
     using size_type = std::size_t;
     using size_type = std::size_t;
 
 
-    struct cold_data_t {
-        dense_map<id_type, meta_prop_node, identity> prop{};
-        dense_map<id_type, meta_ctor_node, identity> ctor{};
-        dense_map<id_type, meta_base_node, identity> base{};
-        dense_map<id_type, meta_conv_node, identity> conv{};
-        dense_map<id_type, meta_data_node, identity> data{};
-        dense_map<id_type, meta_func_node, identity> func{};
-    };
-
     const type_info *info{};
     const type_info *info{};
     id_type id{};
     id_type id{};
     meta_traits traits{meta_traits::is_none};
     meta_traits traits{meta_traits::is_none};
@@ -135,7 +130,7 @@ struct meta_type_node {
     meta_any (*from_void)(void *, const void *){};
     meta_any (*from_void)(void *, const void *){};
     meta_template_node templ{};
     meta_template_node templ{};
     meta_dtor_node dtor{};
     meta_dtor_node dtor{};
-    std::shared_ptr<cold_data_t> details{};
+    std::shared_ptr<meta_type_descriptor> details{};
 };
 };
 
 
 template<typename Type>
 template<typename Type>