Add typedefs for const_iterator.
TileIterator needed to be modified in order to support const values.
This commit is contained in:
parent
3185505484
commit
a6afd2eb54
3 changed files with 39 additions and 20 deletions
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue