Просмотр исходного кода

sparse_set: fix an issue with assuring pages properly on emplace (close #746)

Michele Caini 4 лет назад
Родитель
Сommit
3408556eea
2 измененных файлов с 14 добавлено и 1 удалено
  1. 1 1
      src/entt/entity/sparse_set.hpp
  2. 13 0
      test/entt/entity/sparse_set.cpp

+ 1 - 1
src/entt/entity/sparse_set.hpp

@@ -594,7 +594,7 @@ public:
         } else {
             ENTT_ASSERT(!contains(entt), "Set already contains entity");
             const auto pos = static_cast<size_type>(traits_type::to_entity(free_list));
-            sparse[page(entt)][offset(entt)] = traits_type::construct(static_cast<typename traits_type::entity_type>(pos));
+            assure_page(page(entt))[offset(entt)] = traits_type::construct(static_cast<typename traits_type::entity_type>(pos));
             free_list = std::exchange(packed[pos], entt);
             return pos;
         }

+ 13 - 0
test/entt/entity/sparse_set.cpp

@@ -207,6 +207,19 @@ TEST(SparseSet, Emplace) {
     ASSERT_EQ(set.index(entities[1u]), 0u);
 }
 
+TEST(SparseSet, EmplaceOutOfBounds) {
+    entt::sparse_set set{entt::deletion_policy::in_place};
+    entt::entity entities[2u]{entt::entity{0}, entt::entity{ENTT_SPARSE_PAGE}};
+    
+    ASSERT_EQ(set.emplace(entities[0u]), 0u);
+    ASSERT_EQ(set.extent(), ENTT_SPARSE_PAGE);
+
+    set.erase(entities[0u]);
+
+    ASSERT_EQ(set.emplace(entities[1u]), 0u);
+    ASSERT_EQ(set.extent(), 2u * ENTT_SPARSE_PAGE);
+}
+
 TEST(SparseSet, Insert) {
     entt::sparse_set set{entt::deletion_policy::in_place};
     entt::entity entities[2u];