Add implementation for operator-=
This commit is contained in:
parent
28fc001540
commit
a1996b2d75
4 changed files with 93 additions and 4 deletions
|
@ -19,9 +19,25 @@ namespace dk {
|
|||
///Equivalent to (parA + parB) / parDiv
|
||||
///----------------------------------------------------------------------
|
||||
inline CoordinateScalarType sum_div (CoordinateScalarType parA, CoordinateScalarType parB, CoordinateScalarType parDiv) {
|
||||
DK_ASSERT(parA >= 0 and parB >= 0 and parDiv > 0);
|
||||
DK_ASSERT(std::numeric_limits<CoordinateScalarType>::max() - (parA % parDiv) >= (parB % parDiv));
|
||||
const auto x = ((parA % parDiv) + (parB % parDiv)) / parDiv;
|
||||
DK_ASSERT(std::numeric_limits<CoordinateScalarType>::max() - parA / parDiv >= parB / parDiv);
|
||||
DK_ASSERT(std::numeric_limits<CoordinateScalarType>::max() - parA / parDiv - parB / parDiv >= x);
|
||||
return parA / parDiv + parB / parDiv + x;
|
||||
}
|
||||
|
||||
inline CoordinateScalarType sub_mod (CoordinateScalarType parA, CoordinateScalarType parB, CoordinateScalarType parDiv) {
|
||||
typedef std::make_unsigned<CoordinateScalarType>::type unsigned_coord;
|
||||
const unsigned_coord rounded_sum = static_cast<unsigned_coord>(sub_div(parA, parB, parDiv) * parDiv);
|
||||
const unsigned_coord ret = static_cast<unsigned_coord>(parA) - rounded_sum - static_cast<unsigned_coord>(parB);
|
||||
return static_cast<CoordinateScalarType>(ret);
|
||||
}
|
||||
|
||||
inline CoordinateScalarType sub_div (CoordinateScalarType parA, CoordinateScalarType parB, CoordinateScalarType parDiv) {
|
||||
const auto x = ((parA % parDiv) + (parB % parDiv)) / parDiv;
|
||||
return parA / parDiv - parB / parDiv + x;
|
||||
}
|
||||
} //namespace implem
|
||||
|
||||
template <uint32_t D>
|
||||
|
@ -86,6 +102,34 @@ namespace dk {
|
|||
return retval;
|
||||
}
|
||||
|
||||
template <uint32_t D>
|
||||
const TileCoords<D>& TileCoords<D>::operator-= (CoordinateScalarType parValue) {
|
||||
std::size_t index = 0;
|
||||
if (parValue > 0) {
|
||||
while (parValue) {
|
||||
const auto t = parValue % (m_size[index] + 1);
|
||||
DK_ASSERT(t >= 0);
|
||||
const CoordinateScalarType r = (t > m_pos[index] ? 1 : 0);
|
||||
m_pos[index] = (m_size[index] + 1) * r + m_pos[index] - t;
|
||||
parValue /= (m_size[index] + 1);
|
||||
parValue += r;
|
||||
|
||||
++index;
|
||||
}
|
||||
}
|
||||
else if (parValue < 0) {
|
||||
while (parValue) {
|
||||
const auto new_pos = implem::sub_mod(m_pos[index], parValue, m_size[index] + 1);
|
||||
parValue = -implem::sub_div(m_pos[index], parValue, m_size[index] + 1);
|
||||
m_pos[index] = new_pos;
|
||||
|
||||
++index;
|
||||
}
|
||||
}
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
template <uint32_t D>
|
||||
const TileCoords<D>& TileCoords<D>::operator+= (CoordinateScalarType parValue) {
|
||||
std::size_t index = 0;
|
||||
|
@ -143,4 +187,14 @@ namespace dk {
|
|||
DK_ASSERT(static_cast<uint32_t>(parIndex) < D);
|
||||
return m_pos[parIndex];
|
||||
}
|
||||
|
||||
template <uint32_t D>
|
||||
auto TileCoords<D>::position() const -> const coords& {
|
||||
return m_pos;
|
||||
}
|
||||
|
||||
template <uint32_t D>
|
||||
auto TileCoords<D>::upper() const -> const coords& {
|
||||
return m_size;
|
||||
}
|
||||
} //namespace dk
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue