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:
typedef typename LayerBase<D>::coords coords;
typedef TileIterator<T, D> iterator;
typedef TileIterator<const T, D> const_iterator;
Layer ( const Layer& ) = delete;
Layer ( Layer&& ) = default;

View file

@ -5,12 +5,27 @@
#include <boost/iterator/iterator_facade.hpp>
#include <iterator>
#include <vector>
#include <type_traits>
namespace dk {
namespace implem {
template <size_t D>
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)
template <>
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;
} //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> {
friend class boost::iterator_core_access;
typedef std::vector<T1> vector_type;
typedef typename implem::TypeWithQualifiers<T, vector_type>::result qualif_vector_type;
public:
typedef Vector<CoordinateScalarType, D> coords;
TileIterator ( void );
TileIterator ( const TileIterator& parOther ) = default;
TileIterator ( std::vector<T>* parData, const coords& parFrom, const coords& parTo );
TileIterator ( std::vector<T>* 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<T>* m_data;
qualif_vector_type* m_data;
};
} //namespace dk

View file

@ -32,8 +32,8 @@ namespace dk {
}
} //namespace implem
template <typename T, size_t D>
TileIterator<T, D>::TileIterator() :
template <typename T, size_t D, typename T1>
TileIterator<T, D, T1>::TileIterator() :
m_pos(CoordinateScalarType()),
m_from(CoordinateScalarType()),
m_to(CoordinateScalarType()),
@ -43,8 +43,8 @@ namespace dk {
{
}
template <typename T, size_t D>
TileIterator<T, D>::TileIterator (std::vector<T>* parData, const coords& parFrom, const coords& parTo) :
template <typename T, size_t D, typename T1>
TileIterator<T, D, T1>::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 <typename T, size_t D>
TileIterator<T, D>::TileIterator (std::vector<T>* parData, const coords& parFrom, const coords& parTo, const coords& parAreaFrom, const coords& parAreaTo) :
template <typename T, size_t D, typename T1>
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_from(parFrom),
m_to(parTo),
@ -67,8 +67,8 @@ namespace dk {
DK_ASSERT(parData);
}
template <typename T, size_t D>
void TileIterator<T, D>::increment() {
template <typename T, size_t D, typename T1>
void TileIterator<T, D, T1>::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 <typename T, size_t D>
void TileIterator<T, D>::decrement() {
template <typename T, size_t D, typename T1>
void TileIterator<T, D, T1>::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 <typename T, size_t D>
void TileIterator<T, D>::advance (size_t parAdvance) {
template <typename T, size_t D, typename T1>
void TileIterator<T, D, T1>::advance (size_t parAdvance) {
//TODO: implement
}
template <typename T, size_t D>
ptrdiff_t TileIterator<T, D>::distance_to (const TileIterator& parOther) {
template <typename T, size_t D, typename T1>
ptrdiff_t TileIterator<T, D, T1>::distance_to (const TileIterator& parOther) {
return std::distance(this->get_current_index(), parOther.get_current_index());
}
template <typename T, size_t D>
bool TileIterator<T, D>::equal (const TileIterator& parOther) const {
template <typename T, size_t D, typename T1>
bool TileIterator<T, D, T1>::equal (const TileIterator& parOther) const {
return m_data == parOther.m_data and m_pos == parOther.m_pos;
}
} //namespace dk