diff --git a/src/entt/entity/view.hpp b/src/entt/entity/view.hpp index 6700efff6..6c2db747c 100644 --- a/src/entt/entity/view.hpp +++ b/src/entt/entity/view.hpp @@ -48,6 +48,9 @@ template class view_iterator final { + template + friend struct extended_view_iterator; + using iterator_type = typename Type::const_iterator; [[nodiscard]] bool valid(const typename iterator_type::value_type entt) const noexcept { @@ -131,12 +134,10 @@ struct extended_view_iterator final { using iterator_concept = std::forward_iterator_tag; constexpr extended_view_iterator() - : it{}, - pools{} {} + : it{} {} - extended_view_iterator(iterator_type from, std::tuple value) - : it{from}, - pools{value} {} + extended_view_iterator(iterator_type from) + : it{from} {} extended_view_iterator &operator++() noexcept { return ++it, *this; @@ -148,7 +149,7 @@ struct extended_view_iterator final { } [[nodiscard]] reference operator*() const noexcept { - return std::apply([entt = *it](auto *...curr) { return std::tuple_cat(std::make_tuple(entt), curr->get_as_tuple(entt)...); }, pools); + return std::apply([entt = *it](auto *...curr) { return std::tuple_cat(std::make_tuple(entt), static_cast(const_cast *>(curr))->get_as_tuple(entt)...); }, it.pools); } [[nodiscard]] pointer operator->() const noexcept { @@ -164,7 +165,6 @@ struct extended_view_iterator final { private: It it; - std::tuple pools; }; template @@ -379,11 +379,6 @@ class basic_view, exclude_t>: public basic_common_view template static constexpr std::size_t index_of = type_list_index_v, type_list>; - template - auto storage(std::index_sequence) const noexcept { - return std::make_tuple(storage()...); - } - template [[nodiscard]] auto dispatch_get(const std::tuple &curr) const { if constexpr(Curr == Other) { @@ -546,7 +541,7 @@ public: template [[nodiscard]] decltype(auto) get(const entity_type entt) const { if constexpr(sizeof...(Index) == 0) { - return std::apply([entt](auto *...curr) { return std::tuple_cat(curr->get_as_tuple(entt)...); }, storage(std::index_sequence_for{})); + return std::apply([entt](auto *...curr) { return std::tuple_cat(static_cast(const_cast *>(curr))->get_as_tuple(entt)...); }, this->pools); } else if constexpr(sizeof...(Index) == 1) { return (storage()->get(entt), ...); } else { @@ -586,8 +581,7 @@ public: * @return An iterable object to use to _visit_ the view. */ [[nodiscard]] iterable each() const noexcept { - const auto as_pools = storage(std::index_sequence_for{}); - return {internal::extended_view_iterator{base_type::begin(), as_pools}, internal::extended_view_iterator{base_type::end(), as_pools}}; + return iterable{base_type::begin(), base_type::end()}; } /**