summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gfx/gl/instanceVertices.h17
-rw-r--r--test/test-instancing.cpp10
2 files changed, 14 insertions, 13 deletions
diff --git a/gfx/gl/instanceVertices.h b/gfx/gl/instanceVertices.h
index edcaef4..51bf4bc 100644
--- a/gfx/gl/instanceVertices.h
+++ b/gfx/gl/instanceVertices.h
@@ -132,19 +132,22 @@ protected:
{
// Destroy p's object
at(pidx).~T();
- if (next-- > index[pidx]) {
- // Remember p.index is free index now
- unused.push_back(pidx);
+ if (--next != index[pidx]) {
// Move last object into p's slot
new (&at(pidx)) T {std::move(data[next])};
(data[next]).~T();
- *std::find(index.begin(), index.end(), next) = index[pidx];
- // Not strictly required, but needed for uniqueness unit test assertion
- index[pidx] = static_cast<size_t>(-1);
+ *std::find_if(index.begin(), index.end(), [this](const auto & i) {
+ const auto n = &i - index.data();
+ return i == next && std::find(unused.begin(), unused.end(), n) == unused.end();
+ }) = index[pidx];
}
- else {
+ if (pidx == index.size() - 1) {
index.pop_back();
}
+ else {
+ // Remember p.index is free index now
+ unused.push_back(pidx);
+ }
}
void
diff --git a/test/test-instancing.cpp b/test/test-instancing.cpp
index 70b20fa..c743ce0 100644
--- a/test/test-instancing.cpp
+++ b/test/test-instancing.cpp
@@ -38,9 +38,8 @@ BOOST_AUTO_TEST_CASE(acquireRelease)
BOOST_CHECK(unused.empty());
}
BOOST_CHECK_EQUAL(0, next);
- BOOST_CHECK_EQUAL(1, unused.size());
- BOOST_CHECK_EQUAL(0, unused.front());
- BOOST_CHECK_EQUAL(1, index.size());
+ BOOST_CHECK(unused.empty());
+ BOOST_CHECK(index.empty());
}
BOOST_AUTO_TEST_CASE(acquireReleaseMove)
@@ -55,9 +54,8 @@ BOOST_AUTO_TEST_CASE(acquireReleaseMove)
BOOST_CHECK_EQUAL(data[0], 40);
}
BOOST_CHECK_EQUAL(0, next);
- BOOST_CHECK_EQUAL(1, unused.size());
- BOOST_CHECK_EQUAL(0, unused.front());
- BOOST_CHECK_EQUAL(1, index.size());
+ BOOST_CHECK(unused.empty());
+ BOOST_CHECK(index.empty());
}
BOOST_AUTO_TEST_CASE(autoMapUnmap)