From c26558cd6de400223ba16fb2704d68cbb7202ccc Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Wed, 13 Jul 2022 11:24:29 +0200 Subject: [PATCH] dense_map: fix an issue when erasing movable keys --- src/entt/container/dense_map.hpp | 2 +- test/entt/container/dense_map.cpp | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/entt/container/dense_map.hpp b/src/entt/container/dense_map.hpp index 37ec641fc..766618f5a 100644 --- a/src/entt/container/dense_map.hpp +++ b/src/entt/container/dense_map.hpp @@ -331,8 +331,8 @@ class dense_map { 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() + key_to_bucket(packed.first().back().element.first); + packed.first()[pos] = std::move(packed.first().back()); for(; *curr != last; curr = &packed.first()[*curr].next) {} *curr = pos; } diff --git a/test/entt/container/dense_map.cpp b/test/entt/container/dense_map.cpp index ad573e508..cd1a430fa 100644 --- a/test/entt/container/dense_map.cpp +++ b/test/entt/container/dense_map.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -788,6 +789,24 @@ TEST(DenseMap, Erase) { ASSERT_EQ(map.size(), 0u); } +TEST(DenseMap, EraseWithMovableKeyValue) { + static constexpr std::size_t minimum_bucket_count = 8u; + entt::dense_map map; + + map.emplace("0", 0u); + map.emplace("1", 1u); + + ASSERT_EQ(map.bucket_count(), minimum_bucket_count); + ASSERT_EQ(map.size(), 2u); + + auto it = map.erase(map.find("0")); + + ASSERT_EQ(it->first, "1"); + ASSERT_EQ(it->second, 1u); + ASSERT_EQ(map.size(), 1u); + ASSERT_FALSE(map.contains("0")); +} + TEST(DenseMap, EraseFromBucket) { static constexpr std::size_t minimum_bucket_count = 8u; entt::dense_map map;