meta: update meta seq container ::clear
This commit is contained in:
2
TODO
2
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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user