Add typedefs for const_iterator.

TileIterator needed to be modified in order to support const values.
This commit is contained in:
King_DuckZ 2014-12-30 17:53:15 +01:00
parent 3185505484
commit a6afd2eb54
3 changed files with 39 additions and 20 deletions

View file

@ -40,6 +40,7 @@ namespace dk {
public: public:
typedef typename LayerBase<D>::coords coords; typedef typename LayerBase<D>::coords coords;
typedef TileIterator<T, D> iterator; typedef TileIterator<T, D> iterator;
typedef TileIterator<const T, D> const_iterator;
Layer ( const Layer& ) = delete; Layer ( const Layer& ) = delete;
Layer ( Layer&& ) = default; Layer ( Layer&& ) = default;

View file

@ -5,12 +5,27 @@
#include <boost/iterator/iterator_facade.hpp> #include <boost/iterator/iterator_facade.hpp>
#include <iterator> #include <iterator>
#include <vector> #include <vector>
#include <type_traits>
namespace dk { namespace dk {
namespace implem { namespace implem {
template <size_t D> template <size_t D>
size_t get_index_from_pos ( const Vector<CoordinateScalarType, D>& parPos, const Vector<CoordinateScalarType, D>& parSize ) a_pure; size_t get_index_from_pos ( const Vector<CoordinateScalarType, D>& parPos, const Vector<CoordinateScalarType, D>& parSize ) a_pure;
template <typename I, typename O>
struct TypeWithQualifiers {
typedef typename std::conditional<std::is_volatile<I>::value && std::is_const<I>::value,
typename std::add_cv<O>::type,
typename std::conditional<std::is_volatile<I>::value,
typename std::add_volatile<typename std::remove_cv<O>::type>::type,
typename std::conditional<std::is_const<I>::value,
typename std::add_const<typename std::remove_cv<O>::type>::type,
typename std::remove_cv<O>::type
>::type
>::type
>::type result;
};
#if defined(NDEBUG) #if defined(NDEBUG)
template <> template <>
size_t get_index_from_pos<2> ( const Vector<CoordinateScalarType, 2>& parPos, const Vector<CoordinateScalarType, 2>& parSize ) a_pure; size_t get_index_from_pos<2> ( const Vector<CoordinateScalarType, 2>& parPos, const Vector<CoordinateScalarType, 2>& parSize ) a_pure;
@ -20,16 +35,19 @@ namespace dk {
Vector<CoordinateScalarType, D> buildPastEndCoordinate ( const Vector<CoordinateScalarType, D>& parFrom, const Vector<CoordinateScalarType, D>& parTo ) a_pure; Vector<CoordinateScalarType, D> buildPastEndCoordinate ( const Vector<CoordinateScalarType, D>& parFrom, const Vector<CoordinateScalarType, D>& parTo ) a_pure;
} //namespace implem } //namespace implem
template <typename T, size_t D> template <typename T, size_t D, typename T1=typename std::remove_cv<T>::type>
class TileIterator : public boost::iterator_facade<TileIterator<T, D>, T, boost::bidirectional_traversal_tag> { class TileIterator : public boost::iterator_facade<TileIterator<T, D>, T, boost::bidirectional_traversal_tag> {
friend class boost::iterator_core_access; friend class boost::iterator_core_access;
typedef std::vector<T1> vector_type;
typedef typename implem::TypeWithQualifiers<T, vector_type>::result qualif_vector_type;
public: public:
typedef Vector<CoordinateScalarType, D> coords; typedef Vector<CoordinateScalarType, D> coords;
TileIterator ( void ); TileIterator ( void );
TileIterator ( const TileIterator& parOther ) = default; TileIterator ( const TileIterator& parOther ) = default;
TileIterator ( std::vector<T>* parData, const coords& parFrom, const coords& parTo ); TileIterator ( TileIterator&& parOther ) = default;
TileIterator ( std::vector<T>* parData, const coords& parFrom, const coords& parTo, const coords& parAreaFrom, const coords& parAreaTo ); 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; ~TileIterator ( void ) = default;
const coords& position ( void ) const { return m_pos; } const coords& position ( void ) const { return m_pos; }
@ -48,7 +66,7 @@ namespace dk {
coords m_to; coords m_to;
coords m_areafrom; coords m_areafrom;
coords m_areato; coords m_areato;
std::vector<T>* m_data; qualif_vector_type* m_data;
}; };
} //namespace dk } //namespace dk

View file

@ -32,8 +32,8 @@ namespace dk {
} }
} //namespace implem } //namespace implem
template <typename T, size_t D> template <typename T, size_t D, typename T1>
TileIterator<T, D>::TileIterator() : TileIterator<T, D, T1>::TileIterator() :
m_pos(CoordinateScalarType()), m_pos(CoordinateScalarType()),
m_from(CoordinateScalarType()), m_from(CoordinateScalarType()),
m_to(CoordinateScalarType()), m_to(CoordinateScalarType()),
@ -43,8 +43,8 @@ namespace dk {
{ {
} }
template <typename T, size_t D> template <typename T, size_t D, typename T1>
TileIterator<T, D>::TileIterator (std::vector<T>* parData, const coords& parFrom, const coords& parTo) : TileIterator<T, D, T1>::TileIterator (qualif_vector_type* parData, const coords& parFrom, const coords& parTo) :
m_pos(parFrom), m_pos(parFrom),
m_from(parFrom), m_from(parFrom),
m_to(parTo), m_to(parTo),
@ -55,8 +55,8 @@ namespace dk {
DK_ASSERT(parData); DK_ASSERT(parData);
} }
template <typename T, size_t D> template <typename T, size_t D, typename T1>
TileIterator<T, D>::TileIterator (std::vector<T>* parData, const coords& parFrom, const coords& parTo, const coords& parAreaFrom, const coords& parAreaTo) : TileIterator<T, D, T1>::TileIterator (qualif_vector_type* parData, const coords& parFrom, const coords& parTo, const coords& parAreaFrom, const coords& parAreaTo) :
m_pos(parFrom), m_pos(parFrom),
m_from(parFrom), m_from(parFrom),
m_to(parTo), m_to(parTo),
@ -67,8 +67,8 @@ namespace dk {
DK_ASSERT(parData); DK_ASSERT(parData);
} }
template <typename T, size_t D> template <typename T, size_t D, typename T1>
void TileIterator<T, D>::increment() { void TileIterator<T, D, T1>::increment() {
for (size_t d = 0; d < D - 1; ++d) { for (size_t d = 0; d < D - 1; ++d) {
++m_pos[d]; ++m_pos[d];
if (m_pos[d] >= m_areato[d]) if (m_pos[d] >= m_areato[d])
@ -79,8 +79,8 @@ namespace dk {
++m_pos[D - 1]; ++m_pos[D - 1];
} }
template <typename T, size_t D> template <typename T, size_t D, typename T1>
void TileIterator<T, D>::decrement() { void TileIterator<T, D, T1>::decrement() {
for (size_t d = 0; d < D; ++d) { for (size_t d = 0; d < D; ++d) {
if (m_pos[d] > m_areafrom[d]) { if (m_pos[d] > m_areafrom[d]) {
--m_pos[d]; --m_pos[d];
@ -93,18 +93,18 @@ namespace dk {
++m_pos[D - 1]; ++m_pos[D - 1];
} }
template <typename T, size_t D> template <typename T, size_t D, typename T1>
void TileIterator<T, D>::advance (size_t parAdvance) { void TileIterator<T, D, T1>::advance (size_t parAdvance) {
//TODO: implement //TODO: implement
} }
template <typename T, size_t D> template <typename T, size_t D, typename T1>
ptrdiff_t TileIterator<T, D>::distance_to (const TileIterator& parOther) { ptrdiff_t TileIterator<T, D, T1>::distance_to (const TileIterator& parOther) {
return std::distance(this->get_current_index(), parOther.get_current_index()); return std::distance(this->get_current_index(), parOther.get_current_index());
} }
template <typename T, size_t D> template <typename T, size_t D, typename T1>
bool TileIterator<T, D>::equal (const TileIterator& parOther) const { bool TileIterator<T, D, T1>::equal (const TileIterator& parOther) const {
return m_data == parOther.m_data and m_pos == parOther.m_pos; return m_data == parOther.m_data and m_pos == parOther.m_pos;
} }
} //namespace dk } //namespace dk