Browse Source

meta: reduce symbol size of meta assoc traits ::clear function

Michele Caini 2 years ago
parent
commit
c8f5b1afa6
2 changed files with 17 additions and 21 deletions
  1. 15 19
      src/entt/meta/container.hpp
  2. 2 2
      src/entt/meta/meta.hpp

+ 15 - 19
src/entt/meta/container.hpp

@@ -69,24 +69,24 @@ struct basic_meta_sequence_container_traits {
 
 
     [[nodiscard]] static iterator insert_or_erase([[maybe_unused]] const meta_ctx &ctx, [[maybe_unused]] void *container, [[maybe_unused]] const any &handle, [[maybe_unused]] meta_any &value) {
     [[nodiscard]] static iterator insert_or_erase([[maybe_unused]] const meta_ctx &ctx, [[maybe_unused]] void *container, [[maybe_unused]] const any &handle, [[maybe_unused]] meta_any &value) {
         if constexpr(is_dynamic_sequence_container<Type>::value) {
         if constexpr(is_dynamic_sequence_container<Type>::value) {
-                typename Type::const_iterator it{};
+            typename Type::const_iterator it{};
 
 
             if(auto *const non_const = any_cast<typename Type::iterator>(&handle); non_const) {
             if(auto *const non_const = any_cast<typename Type::iterator>(&handle); non_const) {
-                    it = *non_const;
-                } else {
-                    it = any_cast<const typename Type::const_iterator &>(handle);
-                }
+                it = *non_const;
+            } else {
+                it = any_cast<const typename Type::const_iterator &>(handle);
+            }
 
 
             if(auto *const cont = static_cast<Type *>(container); value) {
             if(auto *const cont = static_cast<Type *>(container); value) {
-                    // this abomination is necessary because only on macos value_type and const_reference are different types for std::vector<bool>
-                    if(value.allow_cast<typename Type::const_reference>() || value.allow_cast<typename Type::value_type>()) {
-                        const auto *element = value.try_cast<std::remove_reference_t<typename Type::const_reference>>();
-                        return iterator{ctx, cont->insert(it, element ? *element : value.cast<typename Type::value_type>())};
-                    }
-                } else {
-                    return iterator{ctx, cont->erase(it)};
+                // this abomination is necessary because only on macos value_type and const_reference are different types for std::vector<bool>
+                if(value.allow_cast<typename Type::const_reference>() || value.allow_cast<typename Type::value_type>()) {
+                    const auto *element = value.try_cast<std::remove_reference_t<typename Type::const_reference>>();
+                    return iterator{ctx, cont->insert(it, element ? *element : value.cast<typename Type::value_type>())};
                 }
                 }
+            } else {
+                return iterator{ctx, cont->erase(it)};
             }
             }
+        }
 
 
         return iterator{};
         return iterator{};
     }
     }
@@ -105,13 +105,9 @@ struct basic_meta_associative_container_traits {
         return static_cast<const Type *>(container)->size();
         return static_cast<const Type *>(container)->size();
     }
     }
 
 
-    [[nodiscard]] static bool clear(any &container) {
-        if(auto *const cont = any_cast<Type>(&container); cont) {
-            cont->clear();
-            return true;
-        }
-
-        return false;
+    [[nodiscard]] static bool clear(void *container) {
+        static_cast<Type *>(container)->clear();
+        return true;
     }
     }
 
 
     [[nodiscard]] static iterator iter(const meta_ctx &ctx, any &container, const bool as_end) {
     [[nodiscard]] static iterator iter(const meta_ctx &ctx, any &container, const bool as_end) {

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

@@ -142,7 +142,7 @@ private:
     internal::meta_type_node (*mapped_type_node)(const internal::meta_context &){};
     internal::meta_type_node (*mapped_type_node)(const internal::meta_context &){};
     internal::meta_type_node (*value_type_node)(const internal::meta_context &){};
     internal::meta_type_node (*value_type_node)(const internal::meta_context &){};
     size_type (*size_fn)(const void *) noexcept {};
     size_type (*size_fn)(const void *) noexcept {};
-    bool (*clear_fn)(any &){};
+    bool (*clear_fn)(void *){};
     iterator (*iter_fn)(const meta_ctx &, any &, const bool){};
     iterator (*iter_fn)(const meta_ctx &, any &, const bool){};
     size_type (*insert_or_erase_fn)(any &, meta_any &, meta_any &){};
     size_type (*insert_or_erase_fn)(any &, meta_any &, meta_any &){};
     iterator (*find_fn)(const meta_ctx &, void *, const void *, meta_any &){};
     iterator (*find_fn)(const meta_ctx &, void *, const void *, meta_any &){};
@@ -1953,7 +1953,7 @@ inline meta_sequence_container::iterator meta_sequence_container::erase(iterator
 
 
 /*! @copydoc meta_sequence_container::clear */
 /*! @copydoc meta_sequence_container::clear */
 inline bool meta_associative_container::clear() {
 inline bool meta_associative_container::clear() {
-    return clear_fn(storage);
+    return (storage.policy() != any_policy::cref) && clear_fn(storage.data());
 }
 }
 
 
 /*! @copydoc meta_sequence_container::begin */
 /*! @copydoc meta_sequence_container::begin */