sparse_set/storage:

* removed basic_sparse_set<...>::emplace_back
* general cleanup
This commit is contained in:
Michele Caini
2021-08-26 15:22:29 +02:00
parent 60c175a51d
commit de6b660b12
3 changed files with 17 additions and 35 deletions

View File

@@ -243,11 +243,7 @@ class basic_sparse_set {
}
std::size_t append(const Entity entt) {
if(const auto len = reserved.second(); count == len) {
const size_type sz = static_cast<size_type>(len * growth_factor_v);
resize_packed_array(sz + !(sz > len));
}
ENTT_ASSERT(count != reserved.second(), "Not enough space left");
ENTT_ASSERT(current(entt) == entity_traits::to_version(tombstone), "Slot not available");
assure_page(page(entt))[offset(entt)] = entity_traits::combine(static_cast<typename entity_traits::entity_type>(count), entity_traits::to_integral(entt));
packed_array[count] = entt;
@@ -647,20 +643,6 @@ public:
return packed_array[pos];
}
/**
* @brief Appends an entity to a sparse set.
*
* @warning
* Attempting to assign an entity that already belongs to the sparse set
* results in undefined behavior.
*
* @param entt A valid identifier.
* @return The slot used for insertion.
*/
size_type emplace_back(const entity_type entt) {
return append(entt);
}
/**
* @brief Assigns an entity to a sparse set.
*
@@ -672,7 +654,16 @@ public:
* @return The slot used for insertion.
*/
size_type emplace(const entity_type entt) {
return (free_list == null) ? append(entt) : recycle(entt);
if(free_list == null) {
if(const auto len = reserved.second(); count == len) {
const size_type sz = static_cast<size_type>(len * growth_factor_v);
resize_packed_array(sz + !(sz > len));
}
return append(entt);
} else {
return recycle(entt);
}
}
/**

View File

@@ -283,15 +283,7 @@ class basic_storage: public basic_sparse_set<Entity, typename std::allocator_tra
reserve(req);
for(; first != last; ++first) {
const auto pos = base_type::size();
construct(packed[page(pos)] + offset(pos), generator());
ENTT_TRY {
base_type::emplace_back(*first);
} ENTT_CATCH {
destroy(packed[page(pos)][offset(pos)]);
ENTT_THROW;
}
emplace(*first, generator());
}
}

View File

@@ -254,11 +254,11 @@ TEST(SparseSet, Emplace) {
set.emplace(entities[0u]);
set.erase(entities[0u]);
set.emplace_back(entities[0u]);
set.emplace(entities[1u]);
set.emplace(entities[0u]);
ASSERT_DEATH(set.emplace(traits_type::combine(3, 1)), "");
ASSERT_DEATH(set.emplace_back(entities[1u]), "");
ASSERT_DEATH(set.emplace(entities[1u]), "");
ASSERT_EQ(set.at(0u), entities[1u]);
ASSERT_EQ(set.at(1u), entities[0u]);
@@ -267,12 +267,11 @@ TEST(SparseSet, Emplace) {
set.erase(std::begin(entities), std::end(entities));
set.emplace(entities[1u]);
set.emplace_back(entities[0u]);
set.emplace(entities[0u]);
ASSERT_EQ(set.at(0u), entities[1u]);
ASSERT_EQ(set.at(1u), static_cast<entt::entity>(entt::null));
ASSERT_EQ(set.at(2u), entities[0u]);
ASSERT_EQ(set.index(entities[0u]), 2u);
ASSERT_EQ(set.at(1u), entities[0u]);
ASSERT_EQ(set.index(entities[0u]), 1u);
ASSERT_EQ(set.index(entities[1u]), 0u);
}