diff --git a/src/entt/meta/container.hpp b/src/entt/meta/container.hpp index 164d4c07f..8b1903703 100644 --- a/src/entt/meta/container.hpp +++ b/src/entt/meta/container.hpp @@ -54,15 +54,15 @@ struct basic_meta_sequence_container_traits { return false; } - [[nodiscard]] static iterator iter(any &container, const bool end) { + [[nodiscard]] static iterator iter(any &container, const bool as_end) { using std::begin; if(auto *const cont = any_cast(&container); cont) { - return iterator{begin(*cont), static_cast(end * cont->size())}; + return iterator{begin(*cont), static_cast(as_end * cont->size())}; } const Type &as_const = any_cast(container); - return iterator{begin(as_const), static_cast(end * as_const.size())}; + return iterator{begin(as_const), static_cast(as_end * as_const.size())}; } [[nodiscard]] static iterator insert([[maybe_unused]] any &container, [[maybe_unused]] const std::ptrdiff_t offset, [[maybe_unused]] meta_any &value) { @@ -114,24 +114,16 @@ struct basic_meta_associative_container_traits { return false; } - [[nodiscard]] static iterator begin(any &container) { + [[nodiscard]] static iterator iter(any &container, const bool as_end) { using std::begin; - - if(auto *const cont = any_cast(&container); cont) { - return iterator{std::integral_constant{}, cont->begin()}; - } - - return iterator{std::integral_constant{}, begin(any_cast(container))}; - } - - [[nodiscard]] static iterator end(any &container) { using std::end; if(auto *const cont = any_cast(&container); cont) { - return iterator{std::integral_constant{}, cont->end()}; + return iterator{std::integral_constant{}, as_end ? end(*cont) : begin(*cont)}; } - return iterator{std::integral_constant{}, end(any_cast(container))}; + const auto &as_const = any_cast(container); + return iterator{std::integral_constant{}, as_end ? end(as_const) : begin(as_const)}; } [[nodiscard]] static bool insert(any &container, meta_any &key, [[maybe_unused]] meta_any &value) { diff --git a/src/entt/meta/meta.hpp b/src/entt/meta/meta.hpp index b71e65757..d35d417aa 100644 --- a/src/entt/meta/meta.hpp +++ b/src/entt/meta/meta.hpp @@ -111,8 +111,7 @@ struct meta_associative_container { value_type_node{internal::meta_node>>::resolve()}, size_fn{&meta_associative_container_traits::size}, clear_fn{&meta_associative_container_traits::clear}, - begin_fn{&meta_associative_container_traits::begin}, - end_fn{&meta_associative_container_traits::end}, + iter_fn{&meta_associative_container_traits::iter}, insert_fn{&meta_associative_container_traits::insert}, erase_fn{&meta_associative_container_traits::erase}, find_fn{&meta_associative_container_traits::find}, @@ -142,7 +141,7 @@ private: internal::meta_type_node *value_type_node = nullptr; size_type (*size_fn)(const any &) ENTT_NOEXCEPT = nullptr; bool (*clear_fn)(any &) = nullptr; - iterator (*begin_fn)(any &) = nullptr; + iterator (*iter_fn)(any &, const bool) = nullptr; iterator (*end_fn)(any &) = nullptr; bool (*insert_fn)(any &, meta_any &, meta_any &) = nullptr; bool (*erase_fn)(any &, meta_any &) = nullptr; @@ -1527,10 +1526,10 @@ class meta_associative_container_iterator final { deref }; - using vtable_type = void(const operation, const any &, void *); + using vtable_type = void(const operation, const any &, std::pair *); template - static void basic_vtable(const operation op, const any &value, void *other) { + static void basic_vtable(const operation op, const any &value, std::pair *other) { switch(op) { case operation::incr: ++any_cast(const_cast(value)); @@ -1538,10 +1537,10 @@ class meta_associative_container_iterator final { case operation::deref: const auto &it = any_cast(value); if constexpr(KeyOnly) { - static_cast *>(other)->first.emplace(*it); + other->first.emplace(*it); } else { - static_cast *>(other)->first.emplacefirst))>(it->first); - static_cast *>(other)->second.emplacesecond))>(it->second); + other->first.emplacefirst))>(it->first); + other->second.emplacesecond))>(it->second); } break; } @@ -1734,12 +1733,12 @@ inline bool meta_associative_container::clear() { /*! @copydoc meta_sequence_container::begin */ [[nodiscard]] inline meta_associative_container::iterator meta_associative_container::begin() { - return begin_fn(storage); + return iter_fn(storage, false); } /*! @copydoc meta_sequence_container::end */ [[nodiscard]] inline meta_associative_container::iterator meta_associative_container::end() { - return end_fn(storage); + return iter_fn(storage, true); } /**