From 75bff4d67f40c81a19250a867e214bf0da12d8b0 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Tue, 17 Oct 2023 14:20:11 +0200 Subject: [PATCH] meta: expose basic_meta_sequence_container_traits::fixed_size --- TODO | 1 + src/entt/meta/container.hpp | 33 ++++++++++++++++++--------------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/TODO b/TODO index 83d1482dec..a395e30119 100644 --- a/TODO +++ b/TODO @@ -18,6 +18,7 @@ TODO (high prio): * make ::pack part of the sparse set interface * storage-based invoke helpers (update sigh mixin to also support storage based cbs) * make nth_argument use function types rather than pointers +* use fixed_size_sequence_container_v to skip calls in meta.hpp, make funcs ret type void * ===> TEST: view (scoped begin) tests after the last changes WIP: diff --git a/src/entt/meta/container.hpp b/src/entt/meta/container.hpp index 906423dd7c..a0f7f20886 100644 --- a/src/entt/meta/container.hpp +++ b/src/entt/meta/container.hpp @@ -26,13 +26,13 @@ namespace entt { namespace internal { template -struct dynamic_sequence_container: std::false_type {}; +struct fixed_size_sequence_container: std::true_type {}; template -struct dynamic_sequence_container>: std::true_type {}; +struct fixed_size_sequence_container>: std::false_type {}; template -inline constexpr bool dynamic_sequence_container_v = dynamic_sequence_container::value; +inline constexpr bool fixed_size_sequence_container_v = fixed_size_sequence_container::value; template struct key_only_associative_container: std::true_type {}; @@ -67,6 +67,9 @@ template struct basic_meta_sequence_container_traits { static_assert(std::is_same_v>>, "Unexpected type"); + /*! @brief True in case of key-only containers, false otherwise. */ + static constexpr bool fixed_size = internal::fixed_size_sequence_container_v; + /*! @brief Unsigned integer type. */ using size_type = typename meta_sequence_container::size_type; /*! @brief Meta iterator type. */ @@ -87,11 +90,11 @@ struct basic_meta_sequence_container_traits { * @return True in case of success, false otherwise. */ [[nodiscard]] static bool clear([[maybe_unused]] void *container) { - if constexpr(internal::dynamic_sequence_container_v) { + if constexpr(fixed_size) { + return false; + } else { static_cast(container)->clear(); return true; - } else { - return false; } } @@ -117,11 +120,11 @@ struct basic_meta_sequence_container_traits { * @return True in case of success, false otherwise. */ [[nodiscard]] static bool resize([[maybe_unused]] void *container, [[maybe_unused]] const size_type sz) { - if constexpr(internal::dynamic_sequence_container_v && std::is_default_constructible_v) { + if constexpr(fixed_size || !std::is_default_constructible_v) { + return false; + } else { static_cast(container)->resize(sz); return true; - } else { - return false; } } @@ -161,7 +164,9 @@ struct basic_meta_sequence_container_traits { * @return True in case of success, false otherwise. */ [[nodiscard]] static bool insert([[maybe_unused]] void *container, [[maybe_unused]] const void *value, [[maybe_unused]] const void *cref, [[maybe_unused]] iterator &it) { - if constexpr(internal::dynamic_sequence_container_v) { + if constexpr(fixed_size) { + return false; + } else { auto *const non_const = any_cast(&it.base()); it.rebind(static_cast(container)->insert( @@ -169,8 +174,6 @@ struct basic_meta_sequence_container_traits { value ? *static_cast(value) : *static_cast *>(cref))); return true; - } else { - return false; } } @@ -181,12 +184,12 @@ struct basic_meta_sequence_container_traits { * @return True in case of success, false otherwise. */ [[nodiscard]] static bool erase([[maybe_unused]] void *container, [[maybe_unused]] iterator &it) { - if constexpr(internal::dynamic_sequence_container_v) { + if constexpr(fixed_size) { + return false; + } else { auto *const non_const = any_cast(&it.base()); it.rebind(static_cast(container)->erase(non_const ? *non_const : any_cast(it.base()))); return true; - } else { - return false; } } };