Get += operator to work with negative numbers.
This commit is contained in:
parent
f5eb76d70f
commit
28fc001540
2 changed files with 47 additions and 10 deletions
|
@ -89,19 +89,35 @@ namespace dk {
|
||||||
template <uint32_t D>
|
template <uint32_t D>
|
||||||
const TileCoords<D>& TileCoords<D>::operator+= (CoordinateScalarType parValue) {
|
const TileCoords<D>& TileCoords<D>::operator+= (CoordinateScalarType parValue) {
|
||||||
std::size_t index = 0;
|
std::size_t index = 0;
|
||||||
while (parValue) {
|
if (parValue > 0) {
|
||||||
//naïve implementation
|
while (parValue) {
|
||||||
//parValue += m_pos[index];
|
//naïve implementation
|
||||||
//m_pos[index] = parValue % (m_size[index] + 1);
|
//parValue += m_pos[index];
|
||||||
//parValue /= (m_size[index] + 1);
|
//m_pos[index] = parValue % (m_size[index] + 1);
|
||||||
|
//parValue /= (m_size[index] + 1);
|
||||||
|
|
||||||
//overflow-aware implementation
|
//overflow-aware implementation
|
||||||
const auto new_pos = implem::sum_mod(m_pos[index], parValue, m_size[index] + 1);
|
const auto new_pos = implem::sum_mod(m_pos[index], parValue, m_size[index] + 1);
|
||||||
parValue = implem::sum_div(m_pos[index], parValue, m_size[index] + 1);
|
parValue = implem::sum_div(m_pos[index], parValue, m_size[index] + 1);
|
||||||
m_pos[index] = new_pos;
|
m_pos[index] = new_pos;
|
||||||
|
|
||||||
++index;
|
++index;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else if (parValue < 0) {
|
||||||
|
while (parValue) {
|
||||||
|
//const auto t = (-parValue) % (m_size[index] + 1);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -90,4 +90,25 @@ TEST(advance, tilecoords) {
|
||||||
EXPECT_EQ(1201, test[2]);
|
EXPECT_EQ(1201, test[2]);
|
||||||
EXPECT_EQ(710, test[3]);
|
EXPECT_EQ(710, test[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const coords4 max_coords(32);
|
||||||
|
tcoords4 test(max_coords);
|
||||||
|
|
||||||
|
test += 33 * 33 * 2;
|
||||||
|
EXPECT_EQ(0, test[0]);
|
||||||
|
EXPECT_EQ(0, test[1]);
|
||||||
|
EXPECT_EQ(2, test[2]);
|
||||||
|
EXPECT_EQ(0, test[3]);
|
||||||
|
|
||||||
|
test += -1;
|
||||||
|
EXPECT_EQ(32, test[0]);
|
||||||
|
EXPECT_EQ(32, test[1]);
|
||||||
|
EXPECT_EQ(1, test[2]);
|
||||||
|
EXPECT_EQ(0, test[3]);
|
||||||
|
|
||||||
|
test++;
|
||||||
|
test += -33 * 33 * 2;
|
||||||
|
EXPECT_EQ(tcoords4(max_coords), test);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue