dense_set: fix an issue when erasing movable keys
This commit is contained in:
@@ -279,8 +279,8 @@ class dense_set {
|
||||
|
||||
void move_and_pop(const std::size_t pos) {
|
||||
if(const auto last = size() - 1u; pos != last) {
|
||||
packed.first()[pos] = std::move(packed.first().back());
|
||||
size_type *curr = sparse.first().data() + value_to_bucket(packed.first().back().second);
|
||||
packed.first()[pos] = std::move(packed.first().back());
|
||||
for(; *curr != last; curr = &packed.first()[*curr].first) {}
|
||||
*curr = pos;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include <functional>
|
||||
#include <iterator>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <tuple>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
@@ -543,6 +544,25 @@ TEST(DenseSet, Erase) {
|
||||
ASSERT_EQ(set.size(), 0u);
|
||||
}
|
||||
|
||||
TEST(DenseSet, EraseWithMovableKeyValue) {
|
||||
// TODO
|
||||
|
||||
static constexpr std::size_t minimum_bucket_count = 8u;
|
||||
entt::dense_set<std::string> set;
|
||||
|
||||
set.emplace("0");
|
||||
set.emplace("1");
|
||||
|
||||
ASSERT_EQ(set.bucket_count(), minimum_bucket_count);
|
||||
ASSERT_EQ(set.size(), 2u);
|
||||
|
||||
auto it = set.erase(set.find("0"));
|
||||
|
||||
ASSERT_EQ(*it, "1");
|
||||
ASSERT_EQ(set.size(), 1u);
|
||||
ASSERT_FALSE(set.contains("0"));
|
||||
}
|
||||
|
||||
TEST(DenseSet, EraseFromBucket) {
|
||||
static constexpr std::size_t minimum_bucket_count = 8u;
|
||||
entt::dense_set<std::size_t, entt::identity> set;
|
||||
|
||||
Reference in New Issue
Block a user