|
|
@@ -273,18 +273,109 @@ TYPED_TEST(SparseSet, Capacity) {
|
|
|
for(const auto policy: this->deletion_policy) {
|
|
|
sparse_set_type set{policy};
|
|
|
|
|
|
- set.reserve(64);
|
|
|
+ set.reserve(64u);
|
|
|
|
|
|
ASSERT_EQ(set.capacity(), 64u);
|
|
|
ASSERT_TRUE(set.empty());
|
|
|
|
|
|
- set.reserve(0);
|
|
|
+ set.reserve(0u);
|
|
|
|
|
|
ASSERT_EQ(set.capacity(), 64u);
|
|
|
ASSERT_TRUE(set.empty());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+TYPED_TEST(SparseSet, ShrinkToFit) {
|
|
|
+ using entity_type = typename TestFixture::type;
|
|
|
+ using sparse_set_type = entt::basic_sparse_set<entity_type>;
|
|
|
+ using traits_type = entt::entt_traits<entity_type>;
|
|
|
+
|
|
|
+ for(const auto policy: this->deletion_policy) {
|
|
|
+ sparse_set_type set{policy};
|
|
|
+
|
|
|
+ ASSERT_EQ(set.capacity(), 0u);
|
|
|
+ ASSERT_EQ(set.extent(), 0u);
|
|
|
+
|
|
|
+ set.reserve(8u);
|
|
|
+
|
|
|
+ set.push(entity_type{traits_type::page_size - 1u});
|
|
|
+ set.push(entity_type{traits_type::page_size});
|
|
|
+ set.erase(entity_type{traits_type::page_size - 1u});
|
|
|
+
|
|
|
+ ASSERT_EQ(set.capacity(), 8u);
|
|
|
+ ASSERT_EQ(set.extent(), 2 * traits_type::page_size);
|
|
|
+
|
|
|
+ ASSERT_FALSE(set.contains(entity_type{traits_type::page_size - 1u}));
|
|
|
+ ASSERT_TRUE(set.contains(entity_type{traits_type::page_size}));
|
|
|
+
|
|
|
+ set.shrink_to_fit();
|
|
|
+
|
|
|
+ switch(policy) {
|
|
|
+ case entt::deletion_policy::swap_only:
|
|
|
+ case entt::deletion_policy::in_place: {
|
|
|
+ ASSERT_EQ(set.capacity(), 2u);
|
|
|
+ ASSERT_EQ(set.extent(), 2 * traits_type::page_size);
|
|
|
+ } break;
|
|
|
+ case entt::deletion_policy::swap_and_pop: {
|
|
|
+ ASSERT_EQ(set.capacity(), 1u);
|
|
|
+ ASSERT_EQ(set.extent(), 2 * traits_type::page_size);
|
|
|
+ } break;
|
|
|
+ }
|
|
|
+
|
|
|
+ set.reserve(8u);
|
|
|
+
|
|
|
+ set.push(entity_type{traits_type::page_size - 1u});
|
|
|
+ set.erase(entity_type{traits_type::page_size});
|
|
|
+
|
|
|
+ ASSERT_EQ(set.capacity(), 8u);
|
|
|
+ ASSERT_EQ(set.extent(), 2 * traits_type::page_size);
|
|
|
+
|
|
|
+ ASSERT_TRUE(set.contains(entity_type{traits_type::page_size - 1u}));
|
|
|
+ ASSERT_FALSE(set.contains(entity_type{traits_type::page_size}));
|
|
|
+
|
|
|
+ set.shrink_to_fit();
|
|
|
+
|
|
|
+ switch(policy) {
|
|
|
+ case entt::deletion_policy::in_place: {
|
|
|
+ ASSERT_EQ(set.capacity(), 2u);
|
|
|
+ ASSERT_EQ(set.extent(), traits_type::page_size);
|
|
|
+ } break;
|
|
|
+ case entt::deletion_policy::swap_only: {
|
|
|
+ ASSERT_EQ(set.capacity(), 2u);
|
|
|
+ ASSERT_EQ(set.extent(), 2 * traits_type::page_size);
|
|
|
+ } break;
|
|
|
+ case entt::deletion_policy::swap_and_pop: {
|
|
|
+ ASSERT_EQ(set.capacity(), 1u);
|
|
|
+ ASSERT_EQ(set.extent(), traits_type::page_size);
|
|
|
+ } break;
|
|
|
+ }
|
|
|
+
|
|
|
+ ASSERT_TRUE(set.contains(entity_type{traits_type::page_size - 1u}));
|
|
|
+ ASSERT_FALSE(set.contains(entity_type{traits_type::page_size}));
|
|
|
+
|
|
|
+ set.erase(entity_type{traits_type::page_size - 1u});
|
|
|
+ set.shrink_to_fit();
|
|
|
+
|
|
|
+ switch(policy) {
|
|
|
+ case entt::deletion_policy::in_place: {
|
|
|
+ ASSERT_EQ(set.capacity(), 2u);
|
|
|
+ ASSERT_EQ(set.extent(), 0u);
|
|
|
+ } break;
|
|
|
+ case entt::deletion_policy::swap_only: {
|
|
|
+ ASSERT_EQ(set.capacity(), 2u);
|
|
|
+ ASSERT_EQ(set.extent(), 2 * traits_type::page_size);
|
|
|
+ } break;
|
|
|
+ case entt::deletion_policy::swap_and_pop: {
|
|
|
+ ASSERT_EQ(set.capacity(), 0u);
|
|
|
+ ASSERT_EQ(set.extent(), 0u);
|
|
|
+ } break;
|
|
|
+ }
|
|
|
+
|
|
|
+ ASSERT_FALSE(set.contains(entity_type{traits_type::page_size - 1u}));
|
|
|
+ ASSERT_FALSE(set.contains(entity_type{traits_type::page_size}));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
TYPED_TEST(SparseSet, Pagination) {
|
|
|
using entity_type = typename TestFixture::type;
|
|
|
using sparse_set_type = entt::basic_sparse_set<entity_type>;
|