Procházet zdrojové kódy

meta: update meta seq container ::clear

skypjack před 2 roky
rodič
revize
c4e7a62ac3
3 změnil soubory, kde provedl 13 přidání a 2 odebrání
  1. 1 1
      TODO
  2. 9 0
      src/entt/meta/container.hpp
  3. 3 1
      src/entt/meta/meta.hpp

+ 1 - 1
TODO

@@ -16,7 +16,7 @@ TODO (high prio):
 * deprecate/drop snapshot orphans function, make it a general purpose one
 * view with entity storage: begin/end should return filtered iterators maybe?
 * update view doc: single vs multi type views are no longer a thing actually
-* meta seq container ::clear invokes resize(0) which isn't exactly the expected behavior in C++
+* meta container: try to merge all functions in a single fake vtable
 * ===> TEST: review view tests after the last changes
 
 WIP:

+ 9 - 0
src/entt/meta/container.hpp

@@ -49,6 +49,15 @@ struct basic_meta_sequence_container_traits {
         return static_cast<const Type *>(container)->size();
     }
 
+    [[nodiscard]] static bool clear(void *container) {
+        if constexpr(is_dynamic_sequence_container<Type>::value) {
+            static_cast<Type *>(container)->clear();
+            return true;
+        } else {
+            return false;
+        }
+    }
+
     [[nodiscard]] static bool resize([[maybe_unused]] void *container, [[maybe_unused]] size_type sz) {
         if constexpr(is_dynamic_sequence_container<Type>::value) {
             static_cast<Type *>(container)->resize(sz);

+ 3 - 1
src/entt/meta/meta.hpp

@@ -53,6 +53,7 @@ public:
         ENTT_ASSERT(instance.type() == type_id<Type>(), "Unexpected type");
         value_type_node = &internal::resolve<typename Type::value_type>;
         size_fn = &meta_sequence_container_traits<Type>::size;
+        clear_fn = &meta_sequence_container_traits<Type>::clear;
         resize_fn = &meta_sequence_container_traits<Type>::resize;
         iter_fn = &meta_sequence_container_traits<Type>::iter;
         insert_or_erase_fn = &meta_sequence_container_traits<Type>::insert_or_erase;
@@ -74,6 +75,7 @@ private:
     const meta_ctx *ctx{};
     internal::meta_type_node (*value_type_node)(const internal::meta_context &){};
     size_type (*size_fn)(const void *) noexcept {};
+    bool (*clear_fn)(void *){};
     bool (*resize_fn)(void *, size_type){};
     iterator (*iter_fn)(const meta_ctx &, const void *, const bool, const bool){};
     iterator (*insert_or_erase_fn)(const meta_ctx &, void *, const any &, meta_any &){};
@@ -1856,7 +1858,7 @@ inline bool meta_sequence_container::resize(const size_type sz) {
  * @return True in case of success, false otherwise.
  */
 inline bool meta_sequence_container::clear() {
-    return resize(0u);
+    return (storage.policy() != any_policy::cref) && clear_fn(storage.data());
 }
 
 /**