improvements

This commit is contained in:
Michele Caini
2018-04-18 13:48:50 +02:00
parent c0213e84f6
commit 8ef4cdc9c3
4 changed files with 20 additions and 24 deletions

1
TODO
View File

@@ -11,4 +11,5 @@
* update benchmarks, destroy is probably slower now because of signals on components/tags
* "singleton mode" for tags (see #66)
* introduce a fast destroy that doesn't check for components or tags (it does it only in debug) and discards the entity immediately (use it with snapshot orphans)
* http://ics.upjs.sk/~krajci/skola/ine/SVK/pdf/Majerech.pdf
* AOB

View File

@@ -680,7 +680,7 @@ public:
* @return True if `entity` is managed by the loader, false otherwise.
*/
bool has(entity_type entity) {
return !(remloc.find(entity) == remloc.cend());
return (remloc.find(entity) != remloc.cend());
}
/**

View File

@@ -103,7 +103,7 @@ class SparseSet<Entity> {
std::size_t pos;
};
static constexpr Entity in_use = (Entity{1} << traits_type::entity_shift);
static constexpr auto pending = ~typename traits_type::entity_type{};
public:
/*! @brief Underlying entity identifier. */
@@ -239,7 +239,7 @@ public:
bool has(entity_type entity) const noexcept {
const auto pos = size_type(entity & traits_type::entity_mask);
// the in-use control bit permits to avoid accessing the direct vector
return (pos < reverse.size()) && (reverse[pos] & in_use);
return (pos < reverse.size()) && (reverse[pos] != pending);
}
/**
@@ -263,7 +263,7 @@ public:
const auto pos = size_type(entity & traits_type::entity_mask);
assert(pos < reverse.size());
// the in-use control bit permits to avoid accessing the direct vector
return (reverse[pos] & in_use);
return (reverse[pos] != pending);
}
/**
@@ -280,9 +280,7 @@ public:
*/
pos_type get(entity_type entity) const noexcept {
assert(has(entity));
const auto entt = entity & traits_type::entity_mask;
// we must get rid of the in-use bit for it's not part of the position
return reverse[entt] & traits_type::entity_mask;
return reverse[entity & traits_type::entity_mask];
}
/**
@@ -301,13 +299,12 @@ public:
const auto pos = size_type(entity & traits_type::entity_mask);
if(!(pos < reverse.size())) {
reverse.resize(pos+1, pos_type{});
const auto value = pending;
reverse.resize(pos+1, value);
}
// we exploit the fact that pos_type is equal to entity_type and pos has
// traits_type::version_mask bits unused we can use to mark it as in-use
reverse[pos] = pos_type(direct.size()) | in_use;
direct.emplace_back(entity);
reverse[pos] = pos_type(direct.size());
direct.push_back(entity);
}
/**
@@ -323,14 +320,12 @@ public:
*/
virtual void destroy(entity_type entity) {
assert(has(entity));
const auto entt = entity & traits_type::entity_mask;
const auto back = direct.back() & traits_type::entity_mask;
// we must get rid of the in-use bit for it's not part of the position
const auto pos = reverse[entt] & traits_type::entity_mask;
reverse[back] = reverse[entt];
reverse[entt] = pos;
const auto back = direct.back();
auto &candidate = reverse[entity & traits_type::entity_mask];
// swapping isn't required here, we are getting rid of the last element
direct[pos] = direct.back();
reverse[back & traits_type::entity_mask] = candidate;
direct[candidate] = back;
candidate = pending;
direct.pop_back();
}
@@ -352,10 +347,10 @@ public:
void swap(pos_type lhs, pos_type rhs) noexcept {
assert(lhs < direct.size());
assert(rhs < direct.size());
const auto src = direct[lhs] & traits_type::entity_mask;
const auto dst = direct[rhs] & traits_type::entity_mask;
std::swap(reverse[src], reverse[dst]);
std::swap(direct[lhs], direct[rhs]);
auto &src = direct[lhs];
auto &dst = direct[rhs];
std::swap(reverse[src & traits_type::entity_mask], reverse[dst & traits_type::entity_mask]);
std::swap(src, dst);
}
/**

View File

@@ -170,7 +170,7 @@ public:
* @return True if the cache contains the resource, false otherwise.
*/
bool contains(resource_type id) const noexcept {
return !(resources.find(id) == resources.cend());
return (resources.find(id) != resources.cend());
}
/**