sparse_set/storage:
* removed basic_sparse_set<...>::emplace_back * general cleanup
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user