Set multiple components at once

This commit is contained in:
NukeBird 2025-02-15 01:47:12 +03:00
parent 672d27a6a3
commit 6861e87c61
2 changed files with 62 additions and 24 deletions

View file

@ -172,8 +172,7 @@ TEST_CASE("Attach multiple components to an entity and verify all are correctly
world w;
auto e = w.make_entity();
e.set(ChoosenOne{});
e.set(Name{"zecsy"});
e.set(ChoosenOne{}, Name{"zecsy"});
REQUIRE(e.has<ChoosenOne, Name>());
REQUIRE(w.has<ChoosenOne, Name>(e));

View file

@ -23,10 +23,6 @@ namespace zecsy
entity(class world* w, entity_id id);
entity() = default;
entity(const entity &) = default;
entity(entity &&) = default;
entity &operator=(const entity &) = default;
entity &operator=(entity &&) = default;
operator entity_id() const;
bool is_alive() const;
@ -37,8 +33,11 @@ namespace zecsy
template<typename T>
T& get();
template<typename T>
void set(const T& comp = T{});
template<typename... T>
void set();
template<typename... T>
void set(const T&... comps);
template<typename T>
void remove();
@ -63,7 +62,19 @@ namespace zecsy
T& get(entity_id e);
template<typename T>
void set(entity_id e, const T& comp = T{});
void set(entity_id e);
template<typename T>
void set(entity_id e, const T& comp);
template<typename First, typename Second, typename... Rest>
requires(sizeof...(Rest) >= 0)
void set(entity_id e);
template<typename First, typename Second, typename... Rest>
requires(sizeof...(Rest) >= 0)
void set(entity_id e, const First& comp0, const Second& comp1,
const Rest&... rest_comps);
template<typename T>
void remove(entity_id e);
@ -90,12 +101,6 @@ namespace zecsy
class world final
{
public:
world() = default;
world(const world &) = default;
world(world &&) = default;
world &operator=(const world &) = default;
world &operator=(world &&) = default;
entity make_entity();
void destroy_entity(entity_id e);
bool is_alive(entity_id e) const;
@ -106,8 +111,11 @@ namespace zecsy
template<typename T>
T& get(entity_id e);
template<typename T>
void set(entity_id e, const T& comp = T{});
template<typename... T>
void set(entity_id e);
template<typename... T>
void set(entity_id e, const T&... comps);
template<typename T>
void remove(entity_id e);
@ -201,6 +209,12 @@ namespace zecsy
return w->get<T>(id);
}
template<typename... T>
inline void entity::set()
{
(set(T{}), ...);
}
template<typename T>
inline void component_storage::set(entity_id e, const T& comp)
{
@ -232,16 +246,22 @@ namespace zecsy
entity_dict[typeid(T)][e] = index;
}
template<typename T>
inline void world::set(entity_id e, const T& comp)
template<typename... T>
inline void world::set(entity_id e)
{
storage.set(e, comp);
storage.set<T...>(e);
}
template<typename T>
inline void entity::set(const T& comp)
template<typename... T>
inline void world::set(entity_id e, const T&... comps)
{
w->set(id, comp);
storage.set(e, comps...);
}
template<typename... T>
inline void entity::set(const T&... comps)
{
w->set(id, comps...);
}
template<typename T>
@ -281,4 +301,23 @@ namespace zecsy
{
return has<First>(e) && has<Second>(e) && (has<Rest>(e) && ...);
}
template<typename First, typename Second, typename... Rest>
requires(sizeof...(Rest) >= 0)
inline void component_storage::set(entity_id e)
{
set(e, First{});
set(e, Second{});
(set(e, Rest{}), ...);
}
template<typename First, typename Second, typename... Rest>
requires(sizeof...(Rest) >= 0)
inline void component_storage::set(entity_id e, const First& comp0, const Second& comp1,
const Rest&... rest_comps)
{
set(e, comp0);
set(e, comp1);
(set(e, rest_comps), ...);
}
};