meta: update meta seq container ::clear

This commit is contained in:
skypjack
2023-07-15 11:47:02 +02:00
committed by Michele Caini
parent f354378fec
commit c4e7a62ac3
3 changed files with 13 additions and 2 deletions

2
TODO
View File

@@ -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:

View File

@@ -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);

View File

@@ -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());
}
/**