From 41f4f4b6f9ba5fa20bb41967dc8ef8020081e38e Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sat, 8 Oct 2022 01:34:44 +0200 Subject: a --- src/tile-iterator.hpp | 50 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 12 deletions(-) (limited to 'src/tile-iterator.hpp') diff --git a/src/tile-iterator.hpp b/src/tile-iterator.hpp index 1439eb4f..0fa5049d 100644 --- a/src/tile-iterator.hpp +++ b/src/tile-iterator.hpp @@ -18,10 +18,12 @@ template void swap(Magnum::Examples::basic_tile_iterator& lhs, Magnum::Examples::basic_tile_iterator& rhs) noexcept; -template struct tuple_size> : std::integral_constant {}; template struct tuple_element<0, Magnum::Examples::basic_tile_iterator> { using type = T&; }; +template struct tuple_element<0, const Magnum::Examples::basic_tile_iterator> { using type = const T&; }; + template struct tuple_element<1, Magnum::Examples::basic_tile_iterator> { using type = std::size_t; }; template struct tuple_element<2, Magnum::Examples::basic_tile_iterator> { using type = Magnum::Examples::local_coords; }; +template struct tuple_size> : std::integral_constant {}; } // namespace std @@ -41,24 +43,48 @@ public: basic_tile_iterator& operator=(const basic_tile_iterator&) = default; basic_tile_iterator& operator++() { pos++; return *this; } basic_tile_iterator operator++(int) { auto tmp = *this; operator++(); return tmp; } - basic_tile_iterator* operator->() { return this; } - basic_tile_iterator& operator*() { return *this; } + basic_tile_iterator* operator->() & { return this; } + basic_tile_iterator& operator*() & { return *this; } + basic_tile_iterator const* operator->() const& { return this; } + basic_tile_iterator const& operator*() const& { return *this; } auto operator<=>(const basic_tile_iterator&) const noexcept = default; void swap(basic_tile_iterator& other); - template typename std::tuple_element>::type get(); + template typename std::tuple_element>::type get() &; + template typename std::tuple_element>::type get() const&; }; +template +void basic_tile_iterator::swap(basic_tile_iterator& other) +{ + using std::swap; + swap(ptr, other.ptr); + swap(pos, other.pos); +} + +template +template +typename std::tuple_element>::type basic_tile_iterator::get() & +{ + if constexpr(N == 0) + return pos == TILE_COUNT ? ptr[0] : ptr[pos]; + else if constexpr(N == 1) + return pos; + else if constexpr(N == 2) + return local_coords{pos}; + else + return std::void_t>(); +} + +template +template +typename std::tuple_element>::type basic_tile_iterator::get() const& +{ + return const_cast&>(*this).get(); +} + extern template class basic_tile_iterator; extern template class basic_tile_iterator; -extern template typename std::tuple_element<0, basic_tile_iterator>::type basic_tile_iterator::get<0>(); -extern template typename std::tuple_element<1, basic_tile_iterator>::type basic_tile_iterator::get<1>(); -extern template typename std::tuple_element<2, basic_tile_iterator>::type basic_tile_iterator::get<2>(); - -extern template typename std::tuple_element<0, basic_tile_iterator>::type basic_tile_iterator::get<0>(); -extern template typename std::tuple_element<1, basic_tile_iterator>::type basic_tile_iterator::get<1>(); -extern template typename std::tuple_element<2, basic_tile_iterator>::type basic_tile_iterator::get<2>(); - } // namespace Magnum::Examples namespace std { -- cgit v1.2.3