|
|
@@ -559,6 +559,7 @@ TEST(SparseSet, StableErase) {
|
|
|
set.erase(entity[1u]);
|
|
|
|
|
|
ASSERT_EQ(set.size(), 3u);
|
|
|
+ ASSERT_EQ(set.free_list(), traits_type::entity_mask);
|
|
|
ASSERT_EQ(set.current(entity[0u]), traits_type::to_version(entt::tombstone));
|
|
|
ASSERT_EQ(set.current(entity[1u]), traits_type::to_version(entt::tombstone));
|
|
|
ASSERT_EQ(set.current(entity[2u]), traits_type::to_version(entt::tombstone));
|
|
|
@@ -573,6 +574,7 @@ TEST(SparseSet, StableErase) {
|
|
|
set.push(entt::entity{0});
|
|
|
|
|
|
ASSERT_EQ(set.size(), 4u);
|
|
|
+ ASSERT_EQ(set.free_list(), traits_type::entity_mask);
|
|
|
ASSERT_EQ(*set.begin(), entt::entity{0});
|
|
|
ASSERT_EQ(set.at(0u), entity[1u]);
|
|
|
ASSERT_EQ(set.at(1u), entity[0u]);
|
|
|
@@ -621,18 +623,51 @@ TEST(SparseSet, SwapOnlyErase) {
|
|
|
set.erase(set.begin(), set.end());
|
|
|
|
|
|
ASSERT_FALSE(set.empty());
|
|
|
- ASSERT_EQ(set.size(), 3u);
|
|
|
ASSERT_EQ(set.free_list(), 0u);
|
|
|
|
|
|
+ entity[0u] = traits_type::next(entity[0u]);
|
|
|
+ entity[1u] = traits_type::next(entity[1u]);
|
|
|
+ entity[2u] = traits_type::next(entity[2u]);
|
|
|
+
|
|
|
+ ASSERT_EQ(set.current(entity[0u]), traits_type::to_version(entity[0u]));
|
|
|
+ ASSERT_EQ(set.current(entity[1u]), traits_type::to_version(entity[1u]));
|
|
|
+ ASSERT_EQ(set.current(entity[2u]), traits_type::to_version(entity[2u]));
|
|
|
+
|
|
|
+ set.push(std::begin(entity), std::end(entity));
|
|
|
+ set.erase(entity, entity + 2u);
|
|
|
+
|
|
|
+ ASSERT_FALSE(set.empty());
|
|
|
+ ASSERT_EQ(set.free_list(), 1u);
|
|
|
+
|
|
|
+ entity[0u] = traits_type::next(entity[0u]);
|
|
|
+ entity[1u] = traits_type::next(entity[1u]);
|
|
|
+
|
|
|
+ ASSERT_EQ(set.current(entity[0u]), traits_type::to_version(entity[0u]));
|
|
|
+ ASSERT_EQ(set.current(entity[1u]), traits_type::to_version(entity[1u]));
|
|
|
+ ASSERT_EQ(set.current(entity[2u]), traits_type::to_version(entity[2u]));
|
|
|
+ ASSERT_EQ(*set.begin(), entity[0u]);
|
|
|
+
|
|
|
set.erase(entity[2u]);
|
|
|
|
|
|
ASSERT_FALSE(set.empty());
|
|
|
- ASSERT_EQ(set.size(), 3u);
|
|
|
ASSERT_EQ(set.free_list(), 0u);
|
|
|
|
|
|
- ASSERT_EQ(set.at(0u), entity[0u]);
|
|
|
- ASSERT_EQ(set.at(1u), entity[1u]);
|
|
|
- ASSERT_EQ(set.at(2u), entity[2u]);
|
|
|
+ entity[2u] = traits_type::next(entity[2u]);
|
|
|
+
|
|
|
+ ASSERT_EQ(set.current(entity[2u]), traits_type::to_version(entity[2u]));
|
|
|
+
|
|
|
+ set.push(std::begin(entity), std::end(entity));
|
|
|
+ std::swap(entity[1u], entity[2u]);
|
|
|
+ set.erase(entity, entity + 2u);
|
|
|
+
|
|
|
+ ASSERT_FALSE(set.empty());
|
|
|
+ ASSERT_EQ(set.free_list(), 1);
|
|
|
+
|
|
|
+ entity[0u] = traits_type::next(entity[0u]);
|
|
|
+ entity[1u] = traits_type::next(entity[1u]);
|
|
|
+
|
|
|
+ ASSERT_EQ(set.current(entity[2u]), traits_type::to_version(entity[2u]));
|
|
|
+ ASSERT_EQ(*set.begin(), entity[0u]);
|
|
|
}
|
|
|
|
|
|
ENTT_DEBUG_TEST(SparseSetDeathTest, SwapOnlyErase) {
|
|
|
@@ -646,6 +681,8 @@ ENTT_DEBUG_TEST(SparseSetDeathTest, SwapOnlyErase) {
|
|
|
}
|
|
|
|
|
|
TEST(SparseSet, CrossSwapOnlyErase) {
|
|
|
+ using traits_type = entt::entt_traits<entt::entity>;
|
|
|
+
|
|
|
entt::sparse_set set{entt::deletion_policy::swap_only};
|
|
|
entt::sparse_set other{entt::deletion_policy::swap_only};
|
|
|
entt::entity entity[2u]{entt::entity{3}, entt::entity{42}};
|
|
|
@@ -653,6 +690,7 @@ TEST(SparseSet, CrossSwapOnlyErase) {
|
|
|
set.push(std::begin(entity), std::end(entity));
|
|
|
other.push(entity[1u]);
|
|
|
set.erase(other.begin(), other.end());
|
|
|
+ entity[1u] = traits_type::next(entity[1u]);
|
|
|
|
|
|
ASSERT_TRUE(set.contains(entity[0u]));
|
|
|
ASSERT_TRUE(set.contains(entity[1u]));
|
|
|
@@ -891,22 +929,73 @@ TEST(SparseSet, SwapOnlyRemove) {
|
|
|
|
|
|
set.push(std::begin(entity), std::end(entity));
|
|
|
|
|
|
- ASSERT_EQ(set.remove(set.begin(), set.end()), 3u);
|
|
|
ASSERT_EQ(set.remove(set.begin(), set.end()), 3u);
|
|
|
ASSERT_FALSE(set.empty());
|
|
|
- ASSERT_EQ(set.size(), 3u);
|
|
|
+
|
|
|
+ entity[0u] = traits_type::next(entity[0u]);
|
|
|
+ entity[1u] = traits_type::next(entity[1u]);
|
|
|
+ entity[2u] = traits_type::next(entity[2u]);
|
|
|
+
|
|
|
+ ASSERT_EQ(set.current(entity[0u]), traits_type::to_version(entity[0u]));
|
|
|
+ ASSERT_EQ(set.current(entity[1u]), traits_type::to_version(entity[1u]));
|
|
|
+ ASSERT_EQ(set.current(entity[2u]), traits_type::to_version(entity[2u]));
|
|
|
+
|
|
|
+ set.push(std::begin(entity), std::end(entity));
|
|
|
+
|
|
|
+ ASSERT_EQ(set.remove(entity, entity + 2u), 2u);
|
|
|
+ ASSERT_FALSE(set.empty());
|
|
|
+
|
|
|
+ entity[0u] = traits_type::next(entity[0u]);
|
|
|
+ entity[1u] = traits_type::next(entity[1u]);
|
|
|
+
|
|
|
+ ASSERT_EQ(set.current(entity[0u]), traits_type::to_version(entity[0u]));
|
|
|
+ ASSERT_EQ(set.current(entity[1u]), traits_type::to_version(entity[1u]));
|
|
|
+ ASSERT_EQ(set.current(entity[2u]), traits_type::to_version(entity[2u]));
|
|
|
+ ASSERT_EQ(*set.begin(), entity[0u]);
|
|
|
|
|
|
ASSERT_TRUE(set.remove(entity[2u]));
|
|
|
+ ASSERT_FALSE(set.remove(entity[2u]));
|
|
|
+
|
|
|
+ entity[2u] = traits_type::next(entity[2u]);
|
|
|
+
|
|
|
ASSERT_TRUE(set.remove(entity[2u]));
|
|
|
+ ASSERT_FALSE(set.remove(entity[2u]));
|
|
|
ASSERT_FALSE(set.empty());
|
|
|
- ASSERT_EQ(set.size(), 3u);
|
|
|
+ ASSERT_EQ(set.current(entity[2u]), traits_type::to_version(traits_type::next(entity[2u])));
|
|
|
|
|
|
- ASSERT_EQ(set.at(0u), entity[0u]);
|
|
|
- ASSERT_EQ(set.at(1u), entity[1u]);
|
|
|
- ASSERT_EQ(set.at(2u), entity[2u]);
|
|
|
+ set.push(entity, entity + 2u);
|
|
|
+
|
|
|
+ ASSERT_EQ(set.remove(std::begin(entity), std::end(entity)), 2u);
|
|
|
+
|
|
|
+ entity[0u] = traits_type::next(entity[0u]);
|
|
|
+ entity[1u] = traits_type::next(entity[1u]);
|
|
|
+ entity[2u] = traits_type::next(entity[2u]);
|
|
|
+
|
|
|
+ ASSERT_EQ(set.current(entity[0u]), traits_type::to_version(entity[0u]));
|
|
|
+ ASSERT_EQ(set.current(entity[1u]), traits_type::to_version(entity[1u]));
|
|
|
+ ASSERT_EQ(set.current(entity[2u]), traits_type::to_version(entity[2u]));
|
|
|
+ ASSERT_FALSE(set.empty());
|
|
|
+
|
|
|
+ set.push(std::begin(entity), std::end(entity));
|
|
|
+ std::swap(entity[1u], entity[2u]);
|
|
|
+
|
|
|
+ ASSERT_EQ(set.remove(entity, entity + 2u), 2u);
|
|
|
+
|
|
|
+ entity[0u] = traits_type::next(entity[0u]);
|
|
|
+ entity[1u] = traits_type::next(entity[1u]);
|
|
|
+
|
|
|
+ ASSERT_EQ(set.current(entity[2u]), traits_type::to_version(entity[2u]));
|
|
|
+ ASSERT_FALSE(set.empty());
|
|
|
+ ASSERT_EQ(*set.begin(), entity[0u]);
|
|
|
+
|
|
|
+ ASSERT_FALSE(set.remove(traits_type::construct(9, 0)));
|
|
|
+ ASSERT_FALSE(set.remove(entt::tombstone));
|
|
|
+ ASSERT_FALSE(set.remove(entt::null));
|
|
|
}
|
|
|
|
|
|
TEST(SparseSet, CrossSwapOnlyRemove) {
|
|
|
+ using traits_type = entt::entt_traits<entt::entity>;
|
|
|
+
|
|
|
entt::sparse_set set{entt::deletion_policy::swap_only};
|
|
|
entt::sparse_set other{entt::deletion_policy::swap_only};
|
|
|
entt::entity entity[2u]{entt::entity{3}, entt::entity{42}};
|
|
|
@@ -914,6 +1003,7 @@ TEST(SparseSet, CrossSwapOnlyRemove) {
|
|
|
set.push(std::begin(entity), std::end(entity));
|
|
|
other.push(entity[1u]);
|
|
|
set.remove(other.begin(), other.end());
|
|
|
+ entity[1u] = traits_type::next(entity[1u]);
|
|
|
|
|
|
ASSERT_TRUE(set.contains(entity[0u]));
|
|
|
ASSERT_TRUE(set.contains(entity[1u]));
|