view: candidate selection happens on construction only
This commit is contained in:
@@ -74,6 +74,7 @@ class basic_view<Entity, exclude_t<Exclude...>, Component...> final {
|
||||
template<typename Comp>
|
||||
using component_iterator = decltype(std::declval<pool_type<Comp>>().begin());
|
||||
|
||||
using return_type = type_list_cat_t<std::conditional_t<is_eto_eligible_v<Component>, type_list<>, type_list<Component>>...>;
|
||||
using unchecked_type = std::array<const basic_sparse_set<Entity> *, (sizeof...(Component) - 1)>;
|
||||
using filter_type = std::array<const basic_sparse_set<Entity> *, sizeof...(Exclude)>;
|
||||
|
||||
@@ -506,8 +507,7 @@ public:
|
||||
*/
|
||||
template<typename Func>
|
||||
void each(Func func) const {
|
||||
view = candidate();
|
||||
((std::get<pool_type<Component> *>(pools) == view ? each<Component>(std::move(func)) : void()), ...);
|
||||
((std::get<pool_type<Component> *>(pools) == view ? traverse<Component>(std::move(func), return_type{}) : void()), ...);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -528,7 +528,8 @@ public:
|
||||
*/
|
||||
template<typename Comp, typename Func>
|
||||
void each(Func func) const {
|
||||
traverse<Comp>(std::move(func), (std::conditional_t<is_eto_eligible_v<Component>, type_list<>, type_list<Component>>{} + ...));
|
||||
view = std::get<pool_type<Comp> *>(pools);
|
||||
traverse<Comp>(std::move(func), return_type{});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -545,7 +546,6 @@ public:
|
||||
* @return An iterable object to use to _visit_ the view.
|
||||
*/
|
||||
[[nodiscard]] auto each() const ENTT_NOEXCEPT {
|
||||
view = candidate();
|
||||
return iterable_view{begin(), end(), pools};
|
||||
}
|
||||
|
||||
@@ -565,10 +565,8 @@ public:
|
||||
*/
|
||||
template<typename Comp>
|
||||
[[nodiscard]] auto each() const ENTT_NOEXCEPT {
|
||||
const basic_sparse_set<entity_type> *cpool = std::get<pool_type<Comp> *>(pools);
|
||||
iterator first{cpool->begin(), cpool->end(), cpool->begin(), unchecked(cpool), filter};
|
||||
iterator last{cpool->begin(), cpool->end(), cpool->end(), unchecked(cpool), filter};
|
||||
return iterable_view{std::move(first), std::move(last), pools};
|
||||
view = std::get<pool_type<Comp> *>(pools);
|
||||
return each();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -605,9 +603,7 @@ public:
|
||||
*/
|
||||
template<typename Func>
|
||||
void chunked(Func func) const {
|
||||
using non_empty_type = type_list_cat_t<std::conditional_t<is_eto_eligible_v<Component>, type_list<>, type_list<Component>>...>;
|
||||
view = candidate();
|
||||
iterate(std::move(func), non_empty_type{});
|
||||
iterate(std::move(func), return_type{});
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
Reference in New Issue
Block a user