diff --git a/src/entt/meta/meta.hpp b/src/entt/meta/meta.hpp index c618d4753..39f7a9885 100644 --- a/src/entt/meta/meta.hpp +++ b/src/entt/meta/meta.hpp @@ -70,7 +70,6 @@ public: inline std::pair insert(iterator, meta_any); inline std::pair erase(iterator); [[nodiscard]] inline meta_any operator[](size_type); - [[nodiscard]] inline explicit operator bool() const ENTT_NOEXCEPT; private: @@ -137,7 +136,6 @@ public: inline bool insert(meta_any, meta_any); inline bool erase(meta_any); [[nodiscard]] inline iterator find(meta_any); - [[nodiscard]] inline explicit operator bool() const ENTT_NOEXCEPT; private: @@ -201,7 +199,7 @@ public: meta_any() ENTT_NOEXCEPT : storage{}, node{}, - deref{}, + deref{nullptr}, seq_factory{nullptr}, assoc_factory{nullptr} {} @@ -1432,17 +1430,17 @@ class meta_sequence_container::meta_iterator { /*! @brief A meta sequence container can access the underlying iterator. */ friend class meta_sequence_container; - template + template static void incr(meta_any any) { - ++any.cast(); + ++any.cast(); } - template + template [[nodiscard]] static meta_any deref(meta_any any) { - if constexpr(std::is_const_v())>>) { - return *any.cast(); + if constexpr(std::is_const_v())>>) { + return *any.cast(); } else { - return std::ref(*any.cast()); + return std::ref(*any.cast()); } } @@ -1463,13 +1461,13 @@ public: /** * @brief Constructs a meta iterator from a given iterator. - * @tparam Type Type of container to which the iterator belongs. + * @tparam It Type of actual iterator with which to build the meta iterator. * @param iter The actual iterator with which to build the meta iterator. */ - template - meta_iterator(std::in_place_type_t, typename Type::iterator iter) - : next_fn{&incr}, - get_fn{&deref}, + template + meta_iterator(It iter) + : next_fn{&incr}, + get_fn{&deref}, handle{std::move(iter)} {} @@ -1548,17 +1546,17 @@ struct meta_sequence_container::meta_sequence_container_proxy { } [[nodiscard]] static iterator begin(void *container) { - return iterator{std::in_place_type, traits_type::begin(*static_cast(container))}; + return iterator{traits_type::begin(*static_cast(container))}; } [[nodiscard]] static iterator end(void *container) { - return iterator{std::in_place_type, traits_type::end(*static_cast(container))}; + return iterator{traits_type::end(*static_cast(container))}; } [[nodiscard]] static std::pair insert(void *container, iterator it, meta_any value) { if(const auto *v_ptr = value.try_cast(); v_ptr || value.convert()) { auto ret = traits_type::insert(*static_cast(container), it.handle.cast(), v_ptr ? *v_ptr : value.cast()); - return {iterator{std::in_place_type, std::move(ret.first)}, ret.second}; + return {iterator{std::move(ret.first)}, ret.second}; } return {}; @@ -1566,7 +1564,7 @@ struct meta_sequence_container::meta_sequence_container_proxy { [[nodiscard]] static std::pair erase(void *container, iterator it) { auto ret = traits_type::erase(*static_cast(container), it.handle.cast()); - return {iterator{std::in_place_type, std::move(ret.first)}, ret.second}; + return {iterator{std::move(ret.first)}, ret.second}; } [[nodiscard]] static meta_any get(void *container, size_type pos) { @@ -1678,29 +1676,29 @@ inline std::pair meta_sequence_containe /*! @brief Opaque iterator for meta associative containers. */ class meta_associative_container::meta_iterator { - template + template static void incr(meta_any any) { - ++any.cast(); + ++any.cast(); } - template + template [[nodiscard]] static meta_any key(meta_any any) { - if constexpr(is_key_only_meta_associative_container_v) { - return *any.cast(); + if constexpr(KeyOnly) { + return *any.cast(); } else { - return any.cast()->first; + return any.cast()->first; } } - template - [[nodiscard]] static meta_any value(meta_any any) { - if constexpr(is_key_only_meta_associative_container_v) { + template + [[nodiscard]] static meta_any value([[maybe_unused]] meta_any any) { + if constexpr(KeyOnly) { return meta_any{}; } else { - if constexpr(std::is_const_v()->second)>>) { - return any.cast()->second; + if constexpr(std::is_const_v()->second)>>) { + return any.cast()->second; } else { - return std::ref(any.cast()->second); + return std::ref(any.cast()->second); } } } @@ -1722,14 +1720,16 @@ public: /** * @brief Constructs a meta iterator from a given iterator. - * @tparam Type Type of container to which the iterator belongs. + * @tparam KeyOnly True if the associative container is also key-only, false + * otherwise. + * @tparam It Type of actual iterator with which to build the meta iterator. * @param iter The actual iterator with which to build the meta iterator. */ - template - meta_iterator(std::in_place_type_t, typename Type::iterator iter) - : next_fn{&incr}, - key_fn{&key}, - value_fn{&value}, + template + meta_iterator(std::integral_constant, It iter) + : next_fn{&incr}, + key_fn{&key}, + value_fn{&value}, handle{std::move(iter)} {} @@ -1817,11 +1817,11 @@ struct meta_associative_container::meta_associative_container_proxy { } [[nodiscard]] static iterator begin(void *container) { - return iterator{std::in_place_type, traits_type::begin(*static_cast(container))}; + return iterator{is_key_only_meta_associative_container{}, traits_type::begin(*static_cast(container))}; } [[nodiscard]] static iterator end(void *container) { - return iterator{std::in_place_type, traits_type::end(*static_cast(container))}; + return iterator{is_key_only_meta_associative_container{}, traits_type::end(*static_cast(container))}; } [[nodiscard]] static bool insert(void *container, meta_any key, meta_any value) { @@ -1848,7 +1848,7 @@ struct meta_associative_container::meta_associative_container_proxy { [[nodiscard]] static iterator find(void *container, meta_any key) { if(const auto *k_ptr = key.try_cast(); k_ptr || key.convert()) { - return iterator{std::in_place_type, traits_type::find(*static_cast(container), k_ptr ? *k_ptr : key.cast())}; + return iterator{is_key_only_meta_associative_container{}, traits_type::find(*static_cast(container), k_ptr ? *k_ptr : key.cast())}; } return {};