diff options
Diffstat (limited to 'src/tile-iterator.hpp')
-rw-r--r-- | src/tile-iterator.hpp | 50 |
1 files changed, 38 insertions, 12 deletions
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<typename T> void swap(Magnum::Examples::basic_tile_iterator<T>& lhs, Magnum::Examples::basic_tile_iterator<T>& rhs) noexcept; -template<typename T> struct tuple_size<Magnum::Examples::basic_tile_iterator<T>> : std::integral_constant<std::size_t, 3> {}; template<typename T> struct tuple_element<0, Magnum::Examples::basic_tile_iterator<T>> { using type = T&; }; +template<typename T> struct tuple_element<0, const Magnum::Examples::basic_tile_iterator<T>> { using type = const T&; }; + template<typename T> struct tuple_element<1, Magnum::Examples::basic_tile_iterator<T>> { using type = std::size_t; }; template<typename T> struct tuple_element<2, Magnum::Examples::basic_tile_iterator<T>> { using type = Magnum::Examples::local_coords; }; +template<typename T> struct tuple_size<Magnum::Examples::basic_tile_iterator<T>> : std::integral_constant<std::size_t, 3> {}; } // namespace std @@ -41,24 +43,48 @@ public: basic_tile_iterator<T>& operator=(const basic_tile_iterator<T>&) = default; basic_tile_iterator<T>& operator++() { pos++; return *this; } basic_tile_iterator<T> operator++(int) { auto tmp = *this; operator++(); return tmp; } - basic_tile_iterator<T>* operator->() { return this; } - basic_tile_iterator<T>& operator*() { return *this; } + basic_tile_iterator<T>* operator->() & { return this; } + basic_tile_iterator<T>& operator*() & { return *this; } + basic_tile_iterator<T> const* operator->() const& { return this; } + basic_tile_iterator<T> const& operator*() const& { return *this; } auto operator<=>(const basic_tile_iterator<T>&) const noexcept = default; void swap(basic_tile_iterator<T>& other); - template<std::size_t N> typename std::tuple_element<N, basic_tile_iterator<T>>::type get(); + template<std::size_t N> typename std::tuple_element<N, basic_tile_iterator<T>>::type get() &; + template<std::size_t N> typename std::tuple_element<N, basic_tile_iterator<T>>::type get() const&; }; +template <typename T> +void basic_tile_iterator<T>::swap(basic_tile_iterator<T>& other) +{ + using std::swap; + swap(ptr, other.ptr); + swap(pos, other.pos); +} + +template <typename T> +template <std::size_t N> +typename std::tuple_element<N, basic_tile_iterator<T>>::type basic_tile_iterator<T>::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<std::integral_constant<int, N>>(); +} + +template <typename T> +template <std::size_t N> +typename std::tuple_element<N, basic_tile_iterator<T>>::type basic_tile_iterator<T>::get() const& +{ + return const_cast<basic_tile_iterator<T>&>(*this).get<N>(); +} + extern template class basic_tile_iterator<tile>; extern template class basic_tile_iterator<const tile>; -extern template typename std::tuple_element<0, basic_tile_iterator<tile>>::type basic_tile_iterator<tile>::get<0>(); -extern template typename std::tuple_element<1, basic_tile_iterator<tile>>::type basic_tile_iterator<tile>::get<1>(); -extern template typename std::tuple_element<2, basic_tile_iterator<tile>>::type basic_tile_iterator<tile>::get<2>(); - -extern template typename std::tuple_element<0, basic_tile_iterator<const tile>>::type basic_tile_iterator<const tile>::get<0>(); -extern template typename std::tuple_element<1, basic_tile_iterator<const tile>>::type basic_tile_iterator<const tile>::get<1>(); -extern template typename std::tuple_element<2, basic_tile_iterator<const tile>>::type basic_tile_iterator<const tile>::get<2>(); - } // namespace Magnum::Examples namespace std { |