sparse_set: partial sorting not supported in case of tombstones

This commit is contained in:
Michele Caini
2021-09-25 18:29:45 +02:00
parent 48f23bd1ba
commit 2e2782b030
2 changed files with 18 additions and 2 deletions

View File

@@ -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)...);
}

View File

@@ -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{});