sparse_set: partial sorting not supported in case of tombstones
This commit is contained in:
@@ -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)...);
|
||||
}
|
||||
|
||||
|
||||
@@ -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{});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user