diff --git a/include/components/layer.hpp b/include/components/layer.hpp index 9e19691..1d5146b 100644 --- a/include/components/layer.hpp +++ b/include/components/layer.hpp @@ -40,6 +40,7 @@ namespace dk { public: typedef typename LayerBase::coords coords; typedef TileIterator iterator; + typedef TileIterator const_iterator; Layer ( const Layer& ) = delete; Layer ( Layer&& ) = default; diff --git a/include/components/tileiterator.hpp b/include/components/tileiterator.hpp index ee61f7e..31640fc 100644 --- a/include/components/tileiterator.hpp +++ b/include/components/tileiterator.hpp @@ -5,12 +5,27 @@ #include #include #include +#include namespace dk { namespace implem { template size_t get_index_from_pos ( const Vector& parPos, const Vector& parSize ) a_pure; + template + struct TypeWithQualifiers { + typedef typename std::conditional::value && std::is_const::value, + typename std::add_cv::type, + typename std::conditional::value, + typename std::add_volatile::type>::type, + typename std::conditional::value, + typename std::add_const::type>::type, + typename std::remove_cv::type + >::type + >::type + >::type result; + }; + #if defined(NDEBUG) template <> size_t get_index_from_pos<2> ( const Vector& parPos, const Vector& parSize ) a_pure; @@ -20,16 +35,19 @@ namespace dk { Vector buildPastEndCoordinate ( const Vector& parFrom, const Vector& parTo ) a_pure; } //namespace implem - template + template ::type> class TileIterator : public boost::iterator_facade, T, boost::bidirectional_traversal_tag> { friend class boost::iterator_core_access; + typedef std::vector vector_type; + typedef typename implem::TypeWithQualifiers::result qualif_vector_type; public: typedef Vector coords; TileIterator ( void ); TileIterator ( const TileIterator& parOther ) = default; - TileIterator ( std::vector* parData, const coords& parFrom, const coords& parTo ); - TileIterator ( std::vector* parData, const coords& parFrom, const coords& parTo, const coords& parAreaFrom, const coords& parAreaTo ); + TileIterator ( TileIterator&& parOther ) = default; + TileIterator ( qualif_vector_type* parData, const coords& parFrom, const coords& parTo ); + TileIterator ( qualif_vector_type* parData, const coords& parFrom, const coords& parTo, const coords& parAreaFrom, const coords& parAreaTo ); ~TileIterator ( void ) = default; const coords& position ( void ) const { return m_pos; } @@ -48,7 +66,7 @@ namespace dk { coords m_to; coords m_areafrom; coords m_areato; - std::vector* m_data; + qualif_vector_type* m_data; }; } //namespace dk diff --git a/include/implem/tileiterator.inl b/include/implem/tileiterator.inl index 57b5633..10e9db3 100644 --- a/include/implem/tileiterator.inl +++ b/include/implem/tileiterator.inl @@ -32,8 +32,8 @@ namespace dk { } } //namespace implem - template - TileIterator::TileIterator() : + template + TileIterator::TileIterator() : m_pos(CoordinateScalarType()), m_from(CoordinateScalarType()), m_to(CoordinateScalarType()), @@ -43,8 +43,8 @@ namespace dk { { } - template - TileIterator::TileIterator (std::vector* parData, const coords& parFrom, const coords& parTo) : + template + TileIterator::TileIterator (qualif_vector_type* parData, const coords& parFrom, const coords& parTo) : m_pos(parFrom), m_from(parFrom), m_to(parTo), @@ -55,8 +55,8 @@ namespace dk { DK_ASSERT(parData); } - template - TileIterator::TileIterator (std::vector* parData, const coords& parFrom, const coords& parTo, const coords& parAreaFrom, const coords& parAreaTo) : + template + TileIterator::TileIterator (qualif_vector_type* parData, const coords& parFrom, const coords& parTo, const coords& parAreaFrom, const coords& parAreaTo) : m_pos(parFrom), m_from(parFrom), m_to(parTo), @@ -67,8 +67,8 @@ namespace dk { DK_ASSERT(parData); } - template - void TileIterator::increment() { + template + void TileIterator::increment() { for (size_t d = 0; d < D - 1; ++d) { ++m_pos[d]; if (m_pos[d] >= m_areato[d]) @@ -79,8 +79,8 @@ namespace dk { ++m_pos[D - 1]; } - template - void TileIterator::decrement() { + template + void TileIterator::decrement() { for (size_t d = 0; d < D; ++d) { if (m_pos[d] > m_areafrom[d]) { --m_pos[d]; @@ -93,18 +93,18 @@ namespace dk { ++m_pos[D - 1]; } - template - void TileIterator::advance (size_t parAdvance) { + template + void TileIterator::advance (size_t parAdvance) { //TODO: implement } - template - ptrdiff_t TileIterator::distance_to (const TileIterator& parOther) { + template + ptrdiff_t TileIterator::distance_to (const TileIterator& parOther) { return std::distance(this->get_current_index(), parOther.get_current_index()); } - template - bool TileIterator::equal (const TileIterator& parOther) const { + template + bool TileIterator::equal (const TileIterator& parOther) const { return m_data == parOther.m_data and m_pos == parOther.m_pos; } } //namespace dk