Browse Source

sparse_set: partial sorting not supported in case of tombstones

Michele Caini 4 years ago
parent
commit
2e2782b030
2 changed files with 18 additions and 2 deletions
  1. 2 1
      src/entt/entity/sparse_set.hpp
  2. 16 1
      test/entt/entity/sparse_set.cpp

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

@@ -842,7 +842,7 @@ public:
     void sort_n(const size_type length, Compare compare, Sort algo = Sort{}, Args &&...args) {
         // basic no-leak guarantee (with invalid state) if sorting throws
         ENTT_ASSERT(!(length > count), "Length exceeds the number of elements");
-        compact();
+        ENTT_ASSERT(free_list == null, "Partial sorting with tombstones is not supported");
 
         algo(std::make_reverse_iterator(packed + length), std::make_reverse_iterator(packed), std::move(compare), std::forward<Args>(args)...);
 
@@ -876,6 +876,7 @@ public:
      */
     template<typename Compare, typename Sort = std_sort, typename... Args>
     void sort(Compare compare, Sort algo = Sort{}, Args &&...args) {
+        compact();
         sort_n(count, std::move(compare), std::move(algo), std::forward<Args>(args)...);
     }
 

+ 16 - 1
test/entt/entity/sparse_set.cpp

@@ -960,9 +960,24 @@ TEST(SparseSet, SortUnordered) {
 }
 
 TEST(SparseSet, SortRange) {
-    entt::sparse_set set;
+    entt::sparse_set set{entt::deletion_policy::in_place};
     entt::entity entities[5u]{entt::entity{7}, entt::entity{9}, entt::entity{3}, entt::entity{12}, entt::entity{42}};
 
+    set.insert(std::begin(entities), std::end(entities));
+    set.erase(entities[0u]);
+
+    ASSERT_DEATH(set.sort_n(0u, std::less{});, "");
+    ASSERT_EQ(set.size(), 5u);
+
+    set.sort(std::less{});
+
+    ASSERT_EQ(set.size(), 4u);
+    ASSERT_EQ(set[0u], entities[4u]);
+    ASSERT_EQ(set[1u], entities[3u]);
+    ASSERT_EQ(set[2u], entities[1u]);
+    ASSERT_EQ(set[3u], entities[2u]);
+
+    set.clear();
     set.insert(std::begin(entities), std::end(entities));
     set.sort_n(0u, std::less{});