namespace dk { namespace implem { template inline size_t get_index_from_pos (const Vector& parPos, const Vector& parSize) { size_t index = 0; for (size_t d = 0; d < D; ++d) { size_t pos = static_cast(parPos[D - 1 - d]); for (size_t p = 0; p < D - 1 - d; ++p) { pos *= static_cast(parSize[p]); } index += pos; } return index; } #if defined(NDEBUG) template <> inline size_t get_index_from_pos<2> (const Vector& parPos, const Vector& parSize) { return parPos.y() * parSize.x() + parPos.x(); } #endif template inline Vector buildPastEndCoordinate (const Vector& parFrom, const Vector& parTo) { Vector retval; for (size_t d = 0; d < D - 1; ++d) { retval[d] = parFrom[d]; } retval[D - 1] = parTo[D - 1]; return retval; } } //namespace implem template TileIterator::TileIterator() : m_pos(CoordinateScalarType()), m_from(CoordinateScalarType()), m_to(CoordinateScalarType()), m_areafrom(CoordinateScalarType()), m_areato(CoordinateScalarType()), m_data(nullptr) { } template TileIterator::TileIterator (qualif_vector_type* parData, const coords& parFrom, const coords& parTo) : m_pos(parFrom), m_from(parFrom), m_to(parTo), m_areafrom(parFrom), m_areato(parTo), m_data(parData) { DK_ASSERT(parData); } 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), m_areafrom(parAreaFrom), m_areato(parAreaTo), m_data(parData) { DK_ASSERT(parData); } template void TileIterator::increment() { for (size_t d = 0; d < D - 1; ++d) { ++m_pos[d]; if (m_pos[d] >= m_areato[d]) m_pos[d] = m_areafrom[d]; else return; } ++m_pos[D - 1]; } template void TileIterator::decrement() { for (size_t d = 0; d < D; ++d) { if (m_pos[d] > m_areafrom[d]) { --m_pos[d]; return; } else { m_pos[d] = m_areato[d]; } } ++m_pos[D - 1]; } template void TileIterator::advance (size_t parAdvance) { //TODO: implement } 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 { return m_data == parOther.m_data and m_pos == parOther.m_pos; } } //namespace dk