Crash fix when going from a smaller view to a larger one.

This commit is contained in:
King_DuckZ 2015-05-24 17:18:46 +02:00
parent b2eae08d02
commit edbb3fe1d8
4 changed files with 20 additions and 9 deletions

View file

@ -9,6 +9,9 @@
#include <vector> #include <vector>
#include <memory> #include <memory>
#include <cstdint> #include <cstdint>
#if !defined(NDEBUG)
#include <iostream>
#endif
namespace dk { namespace dk {
template <uint32_t D> template <uint32_t D>

View file

@ -68,7 +68,7 @@ namespace dk {
void advance ( size_t parAdvance ); void advance ( size_t parAdvance );
ptrdiff_t distance_to ( const TileIterator& parOther ); ptrdiff_t distance_to ( const TileIterator& parOther );
bool equal ( const TileIterator& parOther ) const; bool equal ( const TileIterator& parOther ) const;
T& dereference ( void ) const { return (*m_data)[get_current_index()]; } T& dereference ( void ) const;
size_t get_current_index ( void ) const { return implem::get_index_from_pos<D>(m_pos, m_subdivareasize) + m_subindex; } size_t get_current_index ( void ) const { return implem::get_index_from_pos<D>(m_pos, m_subdivareasize) + m_subindex; }
coords m_pos; coords m_pos;

View file

@ -139,4 +139,12 @@ namespace dk {
bool TileIterator<T, D, T1>::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;
} }
template <typename T, uint32_t D, typename T1>
T& TileIterator<T, D, T1>::dereference() const {
const auto index = this->get_current_index();
assert(m_data);
assert(index < m_data->size());
return (*m_data)[index];
}
} //namespace dk } //namespace dk

View file

@ -199,33 +199,33 @@ namespace cloonel {
///-------------------------------------------------------------------------- ///--------------------------------------------------------------------------
template <typename T, typename U, uint32_t S> template <typename T, typename U, uint32_t S>
inline bool operator< (const Vector<T, S>& parA, const Vector<U, S>& parB) { inline bool operator< (const Vector<T, S>& parA, const Vector<U, S>& parB) {
bool retVal = true; bool retVal = false;
for (uint32_t z = 0; z < S; ++z) { for (uint32_t z = 0; z < S; ++z) {
retVal &= static_cast<bool>(parA[z] < parB[z]); retVal |= static_cast<bool>(parA[z] < parB[z]);
} }
return retVal; return retVal;
} }
template <typename T, typename U, uint32_t S> template <typename T, typename U, uint32_t S>
inline bool operator> (const Vector<T, S>& parA, const Vector<U, S>& parB) { inline bool operator> (const Vector<T, S>& parA, const Vector<U, S>& parB) {
bool retVal = true; bool retVal = false;
for (uint32_t z = 0; z < S; ++z) { for (uint32_t z = 0; z < S; ++z) {
retVal &= static_cast<bool>(parA[z] > parB[z]); retVal |= static_cast<bool>(parA[z] > parB[z]);
} }
return retVal; return retVal;
} }
template <typename T, typename U, uint32_t S> template <typename T, typename U, uint32_t S>
inline bool operator<= (const Vector<T, S>& parA, const Vector<U, S>& parB) { inline bool operator<= (const Vector<T, S>& parA, const Vector<U, S>& parB) {
bool retVal = true; bool retVal = false;
for (uint32_t z = 0; z < S; ++z) { for (uint32_t z = 0; z < S; ++z) {
retVal &= static_cast<bool>(parA[z] <= parB[z]); retVal |= static_cast<bool>(parA[z] <= parB[z]);
} }
return retVal; return retVal;
} }
template <typename T, typename U, uint32_t S> template <typename T, typename U, uint32_t S>
inline bool operator>= (const Vector<T, S>& parA, const Vector<U, S>& parB) { inline bool operator>= (const Vector<T, S>& parA, const Vector<U, S>& parB) {
bool retVal = true; bool retVal = false;
for (uint32_t z = 0; z < S; ++z) { for (uint32_t z = 0; z < S; ++z) {
retVal &= static_cast<bool>(parA[z] >= parB[z]); retVal |= static_cast<bool>(parA[z] >= parB[z]);
} }
return retVal; return retVal;
} }