From c4e7a62ac3ab0b6eb734bda57a8a4acd18acf48d Mon Sep 17 00:00:00 2001 From: skypjack Date: Sat, 15 Jul 2023 11:47:02 +0200 Subject: [PATCH] meta: update meta seq container ::clear --- TODO | 2 +- src/entt/meta/container.hpp | 9 +++++++++ src/entt/meta/meta.hpp | 4 +++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/TODO b/TODO index 5bf636ab9..48d526225 100644 --- a/TODO +++ b/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: diff --git a/src/entt/meta/container.hpp b/src/entt/meta/container.hpp index 3bb20c4fc..ecbf59907 100644 --- a/src/entt/meta/container.hpp +++ b/src/entt/meta/container.hpp @@ -49,6 +49,15 @@ struct basic_meta_sequence_container_traits { return static_cast(container)->size(); } + [[nodiscard]] static bool clear(void *container) { + if constexpr(is_dynamic_sequence_container::value) { + static_cast(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::value) { static_cast(container)->resize(sz); diff --git a/src/entt/meta/meta.hpp b/src/entt/meta/meta.hpp index 41d9a78b3..0876abead 100644 --- a/src/entt/meta/meta.hpp +++ b/src/entt/meta/meta.hpp @@ -53,6 +53,7 @@ public: ENTT_ASSERT(instance.type() == type_id(), "Unexpected type"); value_type_node = &internal::resolve; size_fn = &meta_sequence_container_traits::size; + clear_fn = &meta_sequence_container_traits::clear; resize_fn = &meta_sequence_container_traits::resize; iter_fn = &meta_sequence_container_traits::iter; insert_or_erase_fn = &meta_sequence_container_traits::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()); } /**