|
|
@@ -58,7 +58,7 @@ class basic_registry {
|
|
|
|
|
|
template<typename... Exclude, typename... Get, typename... Owned>
|
|
|
struct group_handler<exclude_t<Exclude...>, get_t<Get...>, Owned...> {
|
|
|
- static_assert(std::conjunction_v<std::is_same<Owned, std::decay_t<Owned>>..., std::is_same<Get, std::decay_t<Get>>..., std::is_same<Exclude, std::decay_t<Exclude>>...>, "One or more component types are invalid");
|
|
|
+ static_assert(std::conjunction_v<std::is_same<Owned, std::remove_const_t<Owned>>..., std::is_same<Get, std::remove_const_t<Get>>..., std::is_same<Exclude, std::remove_const_t<Exclude>>...>, "One or more component types are invalid");
|
|
|
std::conditional_t<sizeof...(Owned) == 0, basic_sparse_set<Entity>, std::size_t> current{};
|
|
|
|
|
|
template<typename Component>
|
|
|
@@ -105,6 +105,7 @@ class basic_registry {
|
|
|
|
|
|
template<typename Component>
|
|
|
[[nodiscard]] storage_type<Component> * assure() const {
|
|
|
+ static_assert(std::is_same_v<Component, std::decay_t<Component>>, "Non-decayed types not allowed");
|
|
|
const auto index = type_seq<Component>::value();
|
|
|
|
|
|
if(!(index < pools.size())) {
|
|
|
@@ -121,6 +122,7 @@ class basic_registry {
|
|
|
|
|
|
template<typename Component>
|
|
|
[[nodiscard]] const storage_type<Component> * pool_if_exists() const {
|
|
|
+ static_assert(std::is_same_v<Component, std::decay_t<Component>>, "Non-decayed types not allowed");
|
|
|
const auto index = type_seq<Component>::value();
|
|
|
return (!(index < pools.size()) || !pools[index].pool) ? nullptr : static_cast<const storage_type<Component> *>(pools[index].pool.get());
|
|
|
}
|
|
|
@@ -793,7 +795,7 @@ public:
|
|
|
ENTT_ASSERT(valid(entity));
|
|
|
|
|
|
if constexpr(sizeof...(Component) == 1) {
|
|
|
- const auto *cpool = pool_if_exists<Component...>();
|
|
|
+ const auto *cpool = pool_if_exists<std::remove_const_t<Component>...>();
|
|
|
ENTT_ASSERT(cpool);
|
|
|
return cpool->get(entity);
|
|
|
} else {
|
|
|
@@ -807,7 +809,7 @@ public:
|
|
|
ENTT_ASSERT(valid(entity));
|
|
|
|
|
|
if constexpr(sizeof...(Component) == 1) {
|
|
|
- return (static_cast<Component &>(assure<Component>()->get(entity)), ...);
|
|
|
+ return (static_cast<Component &>(assure<std::remove_const_t<Component>>()->get(entity)), ...);
|
|
|
} else {
|
|
|
return std::forward_as_tuple(get<Component>(entity)...);
|
|
|
}
|
|
|
@@ -860,7 +862,7 @@ public:
|
|
|
ENTT_ASSERT(valid(entity));
|
|
|
|
|
|
if constexpr(sizeof...(Component) == 1) {
|
|
|
- const auto *cpool = pool_if_exists<Component...>();
|
|
|
+ const auto *cpool = pool_if_exists<std::remove_const_t<Component>...>();
|
|
|
return (cpool && cpool->contains(entity)) ? &cpool->get(entity) : nullptr;
|
|
|
} else {
|
|
|
return std::make_tuple(try_get<Component>(entity)...);
|
|
|
@@ -1076,14 +1078,14 @@ public:
|
|
|
[[nodiscard]] basic_view<Entity, exclude_t<Exclude...>, Component...> view(exclude_t<Exclude...> = {}) const {
|
|
|
static_assert(sizeof...(Component) > 0, "Exclusion-only views are not supported");
|
|
|
static_assert((std::is_const_v<Component> && ...), "Invalid non-const type");
|
|
|
- return { *assure<std::decay_t<Component>>()..., *assure<Exclude>()... };
|
|
|
+ return { *assure<std::remove_const_t<Component>>()..., *assure<Exclude>()... };
|
|
|
}
|
|
|
|
|
|
/*! @copydoc view */
|
|
|
template<typename... Component, typename... Exclude>
|
|
|
[[nodiscard]] basic_view<Entity, exclude_t<Exclude...>, Component...> view(exclude_t<Exclude...> = {}) {
|
|
|
static_assert(sizeof...(Component) > 0, "Exclusion-only views are not supported");
|
|
|
- return { *assure<std::decay_t<Component>>()..., *assure<Exclude>()... };
|
|
|
+ return { *assure<std::remove_const_t<Component>>()..., *assure<Exclude>()... };
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -1164,16 +1166,16 @@ public:
|
|
|
static_assert(sizeof...(Owned) + sizeof...(Get) > 0, "Exclusion-only groups are not supported");
|
|
|
static_assert(sizeof...(Owned) + sizeof...(Get) + sizeof...(Exclude) > 1, "Single component groups are not allowed");
|
|
|
|
|
|
- using handler_type = group_handler<exclude_t<Exclude...>, get_t<std::decay_t<Get>...>, std::decay_t<Owned>...>;
|
|
|
+ using handler_type = group_handler<exclude_t<Exclude...>, get_t<std::remove_const_t<Get>...>, std::remove_const_t<Owned>...>;
|
|
|
|
|
|
- const auto cpools = std::make_tuple(assure<std::decay_t<Owned>>()..., assure<std::decay_t<Get>>()...);
|
|
|
+ const auto cpools = std::make_tuple(assure<std::remove_const_t<Owned>>()..., assure<std::remove_const_t<Get>>()...);
|
|
|
constexpr auto size = sizeof...(Owned) + sizeof...(Get) + sizeof...(Exclude);
|
|
|
handler_type *handler = nullptr;
|
|
|
|
|
|
if(auto it = std::find_if(groups.cbegin(), groups.cend(), [size](const auto &gdata) {
|
|
|
return gdata.size == size
|
|
|
- && (gdata.owned(type_hash<std::decay_t<Owned>>::value()) && ...)
|
|
|
- && (gdata.get(type_hash<std::decay_t<Get>>::value()) && ...)
|
|
|
+ && (gdata.owned(type_hash<std::remove_const_t<Owned>>::value()) && ...)
|
|
|
+ && (gdata.get(type_hash<std::remove_const_t<Get>>::value()) && ...)
|
|
|
&& (gdata.exclude(type_hash<Exclude>::value()) && ...);
|
|
|
}); it != groups.cend())
|
|
|
{
|
|
|
@@ -1184,8 +1186,8 @@ public:
|
|
|
group_data candidate = {
|
|
|
size,
|
|
|
{ new handler_type{}, [](void *instance) { delete static_cast<handler_type *>(instance); } },
|
|
|
- []([[maybe_unused]] const id_type ctype) ENTT_NOEXCEPT { return ((ctype == type_hash<std::decay_t<Owned>>::value()) || ...); },
|
|
|
- []([[maybe_unused]] const id_type ctype) ENTT_NOEXCEPT { return ((ctype == type_hash<std::decay_t<Get>>::value()) || ...); },
|
|
|
+ []([[maybe_unused]] const id_type ctype) ENTT_NOEXCEPT { return ((ctype == type_hash<std::remove_const_t<Owned>>::value()) || ...); },
|
|
|
+ []([[maybe_unused]] const id_type ctype) ENTT_NOEXCEPT { return ((ctype == type_hash<std::remove_const_t<Get>>::value()) || ...); },
|
|
|
[]([[maybe_unused]] const id_type ctype) ENTT_NOEXCEPT { return ((ctype == type_hash<Exclude>::value()) || ...); },
|
|
|
};
|
|
|
|
|
|
@@ -1198,17 +1200,17 @@ public:
|
|
|
groups.push_back(std::move(candidate));
|
|
|
} else {
|
|
|
ENTT_ASSERT(std::all_of(groups.cbegin(), groups.cend(), [size](const auto &gdata) {
|
|
|
- const auto overlapping = (0u + ... + gdata.owned(type_hash<std::decay_t<Owned>>::value()));
|
|
|
- const auto sz = overlapping + (0u + ... + gdata.get(type_hash<std::decay_t<Get>>::value())) + (0u + ... + gdata.exclude(type_hash<Exclude>::value()));
|
|
|
+ const auto overlapping = (0u + ... + gdata.owned(type_hash<std::remove_const_t<Owned>>::value()));
|
|
|
+ const auto sz = overlapping + (0u + ... + gdata.get(type_hash<std::remove_const_t<Get>>::value())) + (0u + ... + gdata.exclude(type_hash<Exclude>::value()));
|
|
|
return !overlapping || ((sz == size) || (sz == gdata.size));
|
|
|
}));
|
|
|
|
|
|
const auto next = std::find_if_not(groups.cbegin(), groups.cend(), [size](const auto &gdata) {
|
|
|
- return !(0u + ... + gdata.owned(type_hash<std::decay_t<Owned>>::value())) || (size > gdata.size);
|
|
|
+ return !(0u + ... + gdata.owned(type_hash<std::remove_const_t<Owned>>::value())) || (size > gdata.size);
|
|
|
});
|
|
|
|
|
|
const auto prev = std::find_if(std::make_reverse_iterator(next), groups.crend(), [](const auto &gdata) {
|
|
|
- return (0u + ... + gdata.owned(type_hash<std::decay_t<Owned>>::value()));
|
|
|
+ return (0u + ... + gdata.owned(type_hash<std::remove_const_t<Owned>>::value()));
|
|
|
});
|
|
|
|
|
|
maybe_valid_if = (next == groups.cend() ? maybe_valid_if : next->group.get());
|
|
|
@@ -1216,12 +1218,12 @@ public:
|
|
|
groups.insert(next, std::move(candidate));
|
|
|
}
|
|
|
|
|
|
- (on_construct<std::decay_t<Owned>>().before(maybe_valid_if).template connect<&handler_type::template maybe_valid_if<std::decay_t<Owned>>>(*handler), ...);
|
|
|
- (on_construct<std::decay_t<Get>>().before(maybe_valid_if).template connect<&handler_type::template maybe_valid_if<std::decay_t<Get>>>(*handler), ...);
|
|
|
+ (on_construct<std::remove_const_t<Owned>>().before(maybe_valid_if).template connect<&handler_type::template maybe_valid_if<std::remove_const_t<Owned>>>(*handler), ...);
|
|
|
+ (on_construct<std::remove_const_t<Get>>().before(maybe_valid_if).template connect<&handler_type::template maybe_valid_if<std::remove_const_t<Get>>>(*handler), ...);
|
|
|
(on_destroy<Exclude>().before(maybe_valid_if).template connect<&handler_type::template maybe_valid_if<Exclude>>(*handler), ...);
|
|
|
|
|
|
- (on_destroy<std::decay_t<Owned>>().before(discard_if).template connect<&handler_type::discard_if>(*handler), ...);
|
|
|
- (on_destroy<std::decay_t<Get>>().before(discard_if).template connect<&handler_type::discard_if>(*handler), ...);
|
|
|
+ (on_destroy<std::remove_const_t<Owned>>().before(discard_if).template connect<&handler_type::discard_if>(*handler), ...);
|
|
|
+ (on_destroy<std::remove_const_t<Get>>().before(discard_if).template connect<&handler_type::discard_if>(*handler), ...);
|
|
|
(on_construct<Exclude>().before(discard_if).template connect<&handler_type::discard_if>(*handler), ...);
|
|
|
|
|
|
if constexpr(sizeof...(Owned) == 0) {
|
|
|
@@ -1231,12 +1233,12 @@ public:
|
|
|
} else {
|
|
|
// we cannot iterate backwards because we want to leave behind valid entities in case of owned types
|
|
|
for(auto *first = std::get<0>(cpools)->data(), *last = first + std::get<0>(cpools)->size(); first != last; ++first) {
|
|
|
- handler->template maybe_valid_if<type_list_element_t<0, type_list<std::decay_t<Owned>...>>>(*this, *first);
|
|
|
+ handler->template maybe_valid_if<type_list_element_t<0, type_list<std::remove_const_t<Owned>...>>>(*this, *first);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return { handler->current, *std::get<storage_type<std::decay_t<Owned>> *>(cpools)..., *std::get<storage_type<std::decay_t<Get>> *>(cpools)... };
|
|
|
+ return { handler->current, *std::get<storage_type<std::remove_const_t<Owned>> *>(cpools)..., *std::get<storage_type<std::remove_const_t<Get>> *>(cpools)... };
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -1255,15 +1257,15 @@ public:
|
|
|
|
|
|
if(auto it = std::find_if(groups.cbegin(), groups.cend(), [](const auto &gdata) {
|
|
|
return gdata.size == (sizeof...(Owned) + sizeof...(Get) + sizeof...(Exclude))
|
|
|
- && (gdata.owned(type_hash<std::decay_t<Owned>>::value()) && ...)
|
|
|
- && (gdata.get(type_hash<std::decay_t<Get>>::value()) && ...)
|
|
|
+ && (gdata.owned(type_hash<std::remove_const_t<Owned>>::value()) && ...)
|
|
|
+ && (gdata.get(type_hash<std::remove_const_t<Get>>::value()) && ...)
|
|
|
&& (gdata.exclude(type_hash<Exclude>::value()) && ...);
|
|
|
}); it == groups.cend())
|
|
|
{
|
|
|
return {};
|
|
|
} else {
|
|
|
- using handler_type = group_handler<exclude_t<Exclude...>, get_t<std::decay_t<Get>...>, std::decay_t<Owned>...>;
|
|
|
- return { static_cast<handler_type *>(it->group.get())->current, *pool_if_exists<std::decay_t<Owned>>()... , *pool_if_exists<std::decay_t<Get>>()... };
|
|
|
+ using handler_type = group_handler<exclude_t<Exclude...>, get_t<std::remove_const_t<Get>...>, std::remove_const_t<Owned>...>;
|
|
|
+ return { static_cast<handler_type *>(it->group.get())->current, *pool_if_exists<std::remove_const_t<Owned>>()... , *pool_if_exists<std::remove_const_t<Get>>()... };
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1303,7 +1305,7 @@ public:
|
|
|
*/
|
|
|
template<typename... Component>
|
|
|
[[nodiscard]] bool sortable() const {
|
|
|
- return std::none_of(groups.cbegin(), groups.cend(), [](auto &&gdata) { return (gdata.owned(type_hash<std::decay_t<Component>>::value()) || ...); });
|
|
|
+ return std::none_of(groups.cbegin(), groups.cend(), [](auto &&gdata) { return (gdata.owned(type_hash<std::remove_const_t<Component>>::value()) || ...); });
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -1317,7 +1319,7 @@ public:
|
|
|
[[nodiscard]] bool sortable(const basic_group<Entity, exclude_t<Exclude...>, get_t<Get...>, Owned...> &) ENTT_NOEXCEPT {
|
|
|
constexpr auto size = sizeof...(Owned) + sizeof...(Get) + sizeof...(Exclude);
|
|
|
return std::find_if(groups.cbegin(), groups.cend(), [size](const auto &gdata) {
|
|
|
- return (0u + ... + gdata.owned(type_hash<std::decay_t<Owned>>::value())) && (size < gdata.size);
|
|
|
+ return (0u + ... + gdata.owned(type_hash<std::remove_const_t<Owned>>::value())) && (size < gdata.size);
|
|
|
}) == groups.cend();
|
|
|
}
|
|
|
|