From 6861e87c61b21acafd74aebe893f41da318e439c Mon Sep 17 00:00:00 2001 From: NukeBird Date: Sat, 15 Feb 2025 01:47:12 +0300 Subject: [PATCH] Set multiple components at once --- tests/zecsy.cpp | 3 +- zecsy.hpp | 83 ++++++++++++++++++++++++++++++++++++------------- 2 files changed, 62 insertions(+), 24 deletions(-) diff --git a/tests/zecsy.cpp b/tests/zecsy.cpp index 9d2ef9d..89e9d89 100644 --- a/tests/zecsy.cpp +++ b/tests/zecsy.cpp @@ -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()); REQUIRE(w.has(e)); diff --git a/zecsy.hpp b/zecsy.hpp index e222d32..3423ad4 100644 --- a/zecsy.hpp +++ b/zecsy.hpp @@ -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 T& get(); - template - void set(const T& comp = T{}); + template + void set(); + + template + void set(const T&... comps); template void remove(); @@ -63,8 +62,20 @@ namespace zecsy T& get(entity_id e); template - void set(entity_id e, const T& comp = T{}); + void set(entity_id e); + + template + void set(entity_id e, const T& comp); + + template + requires(sizeof...(Rest) >= 0) + void set(entity_id e); + template + requires(sizeof...(Rest) >= 0) + void set(entity_id e, const First& comp0, const Second& comp1, + const Rest&... rest_comps); + template void remove(entity_id e); private: @@ -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 T& get(entity_id e); - template - void set(entity_id e, const T& comp = T{}); + template + void set(entity_id e); + + template + void set(entity_id e, const T&... comps); template void remove(entity_id e); @@ -201,6 +209,12 @@ namespace zecsy return w->get(id); } + template + inline void entity::set() + { + (set(T{}), ...); + } + template inline void component_storage::set(entity_id e, const T& comp) { @@ -231,17 +245,23 @@ namespace zecsy entity_dict[typeid(T)][e] = index; } - - template - inline void world::set(entity_id e, const T& comp) + + template + inline void world::set(entity_id e) { - storage.set(e, comp); + storage.set(e); } - template - inline void entity::set(const T& comp) + template + inline void world::set(entity_id e, const T&... comps) { - w->set(id, comp); + storage.set(e, comps...); + } + + template + inline void entity::set(const T&... comps) + { + w->set(id, comps...); } template @@ -281,4 +301,23 @@ namespace zecsy { return has(e) && has(e) && (has(e) && ...); } + + template + requires(sizeof...(Rest) >= 0) + inline void component_storage::set(entity_id e) + { + set(e, First{}); + set(e, Second{}); + (set(e, Rest{}), ...); + } + + template + 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), ...); + } };