Skip to content

Commit 1e9c9fe

Browse files
committed
registry: better, faster range-remove + refine range-erase
1 parent 80fac8d commit 1e9c9fe

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

src/entt/entity/registry.hpp

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -956,17 +956,28 @@ class basic_registry {
956956
*/
957957
template<typename Type, typename... Other, typename It>
958958
size_type remove(It first, It last) {
959+
size_type count{};
960+
959961
if constexpr(sizeof...(Other) == 0u) {
960-
return assure<Type>().remove(std::move(first), std::move(last));
961-
} else {
962-
size_type count{};
962+
count += assure<Type>().remove(std::move(first), std::move(last));
963+
} else if constexpr(std::is_same_v<It, typename basic_common_type::iterator>) {
964+
constexpr size_type len = sizeof...(Other) + 1u;
965+
basic_common_type *cpools[len]{&assure<Type>(), &assure<Other>()...};
966+
967+
for(size_type pos{}; pos < len; ++pos) {
968+
if(cpools[pos]->data() == first.data()) {
969+
std::swap(cpools[pos], cpools[len - 1u]);
970+
}
963971

972+
count += cpools[pos]->remove(first, last);
973+
}
974+
} else {
964975
for(auto cpools = std::forward_as_tuple(assure<Type>(), assure<Other>()...); first != last; ++first) {
965976
count += std::apply([entt = *first](auto &...curr) { return (curr.remove(entt) + ... + 0u); }, cpools);
966977
}
967-
968-
return count;
969978
}
979+
980+
return count;
970981
}
971982

972983
/**
@@ -998,10 +1009,12 @@ class basic_registry {
9981009
*/
9991010
template<typename Type, typename... Other, typename It>
10001011
void erase(It first, It last) {
1001-
constexpr size_type len = sizeof...(Other) + 1u;
1002-
basic_common_type *cpools[len]{&assure<Type>(), &assure<Other>()...};
1012+
if constexpr(sizeof...(Other) == 0u) {
1013+
assure<Type>().erase(std::move(first), std::move(last));
1014+
} else if constexpr(std::is_same_v<It, typename basic_common_type::iterator>) {
1015+
constexpr size_type len = sizeof...(Other) + 1u;
1016+
basic_common_type *cpools[len]{&assure<Type>(), &assure<Other>()...};
10031017

1004-
if constexpr(std::is_same_v<It, typename basic_common_type::iterator>) {
10051018
for(size_type pos{}; pos < len; ++pos) {
10061019
if(cpools[pos]->data() == first.data()) {
10071020
std::swap(cpools[pos], cpools[len - 1u]);
@@ -1010,12 +1023,8 @@ class basic_registry {
10101023
cpools[pos]->erase(first, last);
10111024
}
10121025
} else {
1013-
for(; first != last; ++first) {
1014-
const auto entt = *first;
1015-
1016-
for(size_type pos{}; pos < len; ++pos) {
1017-
cpools[pos]->erase(entt);
1018-
}
1026+
for(auto cpools = std::forward_as_tuple(assure<Type>(), assure<Other>()...); first != last; ++first) {
1027+
std::apply([entt = *first](auto &...curr) { (curr.erase(entt), ...); }, cpools);
10191028
}
10201029
}
10211030
}

0 commit comments

Comments
 (0)