mirror of
https://github.com/BlackMATov/ecs.hpp.git
synced 2025-12-16 14:11:14 +07:00
join process optimization
This commit is contained in:
162
ecs.hpp
162
ecs.hpp
@@ -665,19 +665,43 @@ namespace ecs_hpp
|
|||||||
template < typename T >
|
template < typename T >
|
||||||
const T* find_component_impl_(const entity& ent) const noexcept;
|
const T* find_component_impl_(const entity& ent) const noexcept;
|
||||||
|
|
||||||
template < typename... Ts, typename F >
|
template < typename T, typename... Ts, typename F, std::size_t I, std::size_t... Is >
|
||||||
void for_joined_components_impl_(F&& f);
|
void for_joined_components_impl_(F&& f, std::index_sequence<I, Is...> iseq);
|
||||||
template < typename T, typename... Ts, typename F, typename... Cs >
|
|
||||||
void for_joined_components_impl_(const entity& e, F&& f, Cs&&... cs);
|
template < typename T, typename... Ts, typename F, std::size_t I, std::size_t... Is >
|
||||||
template < typename F, typename... Cs >
|
void for_joined_components_impl_(F&& f, std::index_sequence<I, Is...> iseq) const;
|
||||||
void for_joined_components_impl_(const entity& e, F&& f, Cs&&... cs);
|
|
||||||
|
template < typename T
|
||||||
|
, typename... Ts
|
||||||
|
, typename F
|
||||||
|
, typename S
|
||||||
|
, typename... Ss
|
||||||
|
, typename... Cs >
|
||||||
|
void for_joined_components_impl_(
|
||||||
|
const entity& e,
|
||||||
|
const F& f,
|
||||||
|
detail::component_storage<S>* s,
|
||||||
|
detail::component_storage<Ss>*... ss,
|
||||||
|
Cs&... cs);
|
||||||
|
|
||||||
|
template < typename T
|
||||||
|
, typename... Ts
|
||||||
|
, typename F
|
||||||
|
, typename S
|
||||||
|
, typename... Ss
|
||||||
|
, typename... Cs >
|
||||||
|
void for_joined_components_impl_(
|
||||||
|
const entity& e,
|
||||||
|
const F& f,
|
||||||
|
const detail::component_storage<S>* s,
|
||||||
|
const detail::component_storage<Ss>*... ss,
|
||||||
|
const Cs&... cs) const;
|
||||||
|
|
||||||
template < typename... Ts, typename F >
|
|
||||||
void for_joined_components_impl_(F&& f) const;
|
|
||||||
template < typename T, typename... Ts, typename F, typename... Cs >
|
|
||||||
void for_joined_components_impl_(const entity& e, F&& f, Cs&&... cs) const;
|
|
||||||
template < typename F, typename... Cs >
|
template < typename F, typename... Cs >
|
||||||
void for_joined_components_impl_(const entity& e, F&& f, Cs&&... cs) const;
|
void for_joined_components_impl_(const entity& e, const F& f, Cs&... cs);
|
||||||
|
|
||||||
|
template < typename F, typename... Cs >
|
||||||
|
void for_joined_components_impl_(const entity& e, const F& f, const Cs&... cs) const;
|
||||||
private:
|
private:
|
||||||
entity_id last_entity_id_{0u};
|
entity_id last_entity_id_{0u};
|
||||||
std::vector<entity_id> free_entity_ids_;
|
std::vector<entity_id> free_entity_ids_;
|
||||||
@@ -931,12 +955,16 @@ namespace ecs_hpp
|
|||||||
|
|
||||||
template < typename... Ts, typename F >
|
template < typename... Ts, typename F >
|
||||||
void registry::for_joined_components(F&& f) {
|
void registry::for_joined_components(F&& f) {
|
||||||
for_joined_components_impl_<Ts...>(std::forward<F>(f));
|
for_joined_components_impl_<Ts...>(
|
||||||
|
std::forward<F>(f),
|
||||||
|
std::make_index_sequence<sizeof...(Ts)>());
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename... Ts, typename F >
|
template < typename... Ts, typename F >
|
||||||
void registry::for_joined_components(F&& f) const {
|
void registry::for_joined_components(F&& f) const {
|
||||||
for_joined_components_impl_<Ts...>(std::forward<F>(f));
|
for_joined_components_impl_<Ts...>(
|
||||||
|
std::forward<F>(f),
|
||||||
|
std::make_index_sequence<sizeof...(Ts)>());
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename T, typename... Args >
|
template < typename T, typename... Args >
|
||||||
@@ -1016,51 +1044,93 @@ namespace ecs_hpp
|
|||||||
: nullptr;
|
: nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename... Ts, typename F >
|
template < typename T, typename... Ts, typename F, std::size_t I, std::size_t... Is >
|
||||||
void registry::for_joined_components_impl_(F&& f) {
|
void registry::for_joined_components_impl_(F&& f, std::index_sequence<I, Is...> iseq) {
|
||||||
for ( const auto id : entity_ids_ ) {
|
(void)iseq;
|
||||||
for_joined_components_impl_<Ts...>(entity(*this, id), std::forward<F>(f));
|
for_each_component<T>([
|
||||||
}
|
this,
|
||||||
|
f = std::forward<F>(f),
|
||||||
|
storages = std::make_tuple(find_storage_<Ts>()...)
|
||||||
|
](const entity& e, T& t) mutable {
|
||||||
|
for_joined_components_impl_<Ts...>(
|
||||||
|
e,
|
||||||
|
f,
|
||||||
|
std::get<Is - 1>(storages)...,
|
||||||
|
t);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename T, typename... Ts, typename F, typename... Cs >
|
template < typename T, typename... Ts, typename F, std::size_t I, std::size_t... Is >
|
||||||
void registry::for_joined_components_impl_(const entity& e, F&& f, Cs&&... cs) {
|
void registry::for_joined_components_impl_(F&& f, std::index_sequence<I, Is...> iseq) const {
|
||||||
T* c = find_component_impl_<T>(e);
|
(void)iseq;
|
||||||
|
for_each_component<T>([
|
||||||
|
this,
|
||||||
|
f = std::forward<F>(f),
|
||||||
|
storages = std::make_tuple(find_storage_<Ts>()...)
|
||||||
|
](const entity& e, const T& t) mutable {
|
||||||
|
for_joined_components_impl_<Ts...>(
|
||||||
|
e,
|
||||||
|
f,
|
||||||
|
std::get<Is - 1>(storages)...,
|
||||||
|
t);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename T
|
||||||
|
, typename... Ts
|
||||||
|
, typename F
|
||||||
|
, typename S
|
||||||
|
, typename... Ss
|
||||||
|
, typename... Cs >
|
||||||
|
void registry::for_joined_components_impl_(
|
||||||
|
const entity& e,
|
||||||
|
const F& f,
|
||||||
|
detail::component_storage<S>* s,
|
||||||
|
detail::component_storage<Ss>*... ss,
|
||||||
|
Cs&... cs)
|
||||||
|
{
|
||||||
|
T* c = s->find(e.id());
|
||||||
if ( c ) {
|
if ( c ) {
|
||||||
for_joined_components_impl_<Ts...>(
|
for_joined_components_impl_<Ts...>(
|
||||||
e,
|
e,
|
||||||
std::forward<F>(f),
|
f,
|
||||||
std::forward<Cs>(cs)...,
|
std::forward<Ss>(ss)...,
|
||||||
|
cs...,
|
||||||
|
*c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template < typename T
|
||||||
|
, typename... Ts
|
||||||
|
, typename F
|
||||||
|
, typename S
|
||||||
|
, typename... Ss
|
||||||
|
, typename... Cs >
|
||||||
|
void registry::for_joined_components_impl_(
|
||||||
|
const entity& e,
|
||||||
|
const F& f,
|
||||||
|
const detail::component_storage<S>* s,
|
||||||
|
const detail::component_storage<Ss>*... ss,
|
||||||
|
const Cs&... cs) const
|
||||||
|
{
|
||||||
|
const T* c = s->find(e.id());
|
||||||
|
if ( c ) {
|
||||||
|
for_joined_components_impl_<Ts...>(
|
||||||
|
e,
|
||||||
|
f,
|
||||||
|
std::forward<Ss>(ss)...,
|
||||||
|
cs...,
|
||||||
*c);
|
*c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename F, typename... Cs >
|
template < typename F, typename... Cs >
|
||||||
void registry::for_joined_components_impl_(const entity& e, F&& f, Cs&&... cs) {
|
void registry::for_joined_components_impl_(const entity& e, const F& f, Cs&... cs) {
|
||||||
f(e, std::forward<Cs>(cs)...);
|
f(e, cs...);
|
||||||
}
|
|
||||||
|
|
||||||
template < typename... Ts, typename F >
|
|
||||||
void registry::for_joined_components_impl_(F&& f) const {
|
|
||||||
for ( const auto id : entity_ids_ ) {
|
|
||||||
for_joined_components_impl_<Ts...>(entity(const_cast<registry&>(*this), id), std::forward<F>(f));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template < typename T, typename... Ts, typename F, typename... Cs >
|
|
||||||
void registry::for_joined_components_impl_(const entity& e, F&& f, Cs&&... cs) const {
|
|
||||||
const T* c = find_component_impl_<T>(e);
|
|
||||||
if ( c ) {
|
|
||||||
for_joined_components_impl_<Ts...>(
|
|
||||||
e,
|
|
||||||
std::forward<F>(f),
|
|
||||||
std::forward<Cs>(cs)...,
|
|
||||||
*c);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template < typename F, typename... Cs >
|
template < typename F, typename... Cs >
|
||||||
void registry::for_joined_components_impl_(const entity& e, F&& f, Cs&&... cs) const {
|
void registry::for_joined_components_impl_(const entity& e, const F& f, const Cs&... cs) const {
|
||||||
f(e, std::forward<Cs>(cs)...);
|
f(e, cs...);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -530,7 +530,7 @@ TEST_CASE("registry") {
|
|||||||
public:
|
public:
|
||||||
void process(ecs::registry& owner) override {
|
void process(ecs::registry& owner) override {
|
||||||
owner.for_joined_components<position_c, velocity_c>([](
|
owner.for_joined_components<position_c, velocity_c>([](
|
||||||
ecs::entity e, position_c& p, const velocity_c& v)
|
ecs::entity, position_c& p, const velocity_c& v)
|
||||||
{
|
{
|
||||||
p.x += v.x;
|
p.x += v.x;
|
||||||
p.y += v.y;
|
p.y += v.y;
|
||||||
|
|||||||
Reference in New Issue
Block a user