From 2913f5bbbe79c05260fcb585edf54a38b9959342 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Fri, 22 Feb 2019 15:47:07 +0100 Subject: [PATCH] registry: refactoring --- src/entt/entity/registry.hpp | 155 ++++++++++++++++------------------- 1 file changed, 72 insertions(+), 83 deletions(-) diff --git a/src/entt/entity/registry.hpp b/src/entt/entity/registry.hpp index 142403cd4..35c254c13 100644 --- a/src/entt/entity/registry.hpp +++ b/src/entt/entity/registry.hpp @@ -95,14 +95,14 @@ class registry { void induce_if(registry ®, const Entity entity) { if(reg.has(entity) && (0 + ... + reg.has(entity)) == Accepted) { const auto curr = this->owned++; - auto pools = std::make_tuple(®.pool()...); + auto pools = std::make_tuple(std::get<1>(reg.pool())...); (std::swap(std::get *>(pools)->get(entity), std::get *>(pools)->raw()[curr]), ...); (std::get *>(pools)->swap(std::get *>(pools)->sparse_set::get(entity), curr), ...); } } void discard_if(registry ®, const Entity entity) { - auto pools = std::make_tuple(®.pool()...); + auto pools = std::make_tuple(std::get<1>(reg.pool())...); if(std::get<0>(pools)->has(entity) && std::get<0>(pools)->sparse_set::get(entity) < this->owned) { const auto curr = --this->owned; @@ -136,37 +136,33 @@ class registry { std::size_t extent; }; - inline auto get_pool_data(ENTT_ID_TYPE ctype) const ENTT_NOEXCEPT { - return std::find_if(pools.begin(), pools.end(), [ctype](const auto &pdata) { - return pdata.pool && pdata.runtime_type == ctype; - }); - } - template - inline const auto & pool() const ENTT_NOEXCEPT { + inline auto pool() const ENTT_NOEXCEPT { + const auto ctype = type(); + if constexpr(is_shared_v) { - const auto it = get_pool_data(type()); + const auto it = std::find_if(pools.begin(), pools.end(), [ctype](const auto &pdata) { + return pdata.pool && pdata.runtime_type == ctype; + }); + assert(it != pools.cend() && it->pool); - return static_cast> &>(*it->pool); + return std::make_tuple(&*it, static_cast> *>(it->pool.get())); } else { - const auto ctype = type(); assert(ctype < pools.size() && pools[ctype].pool && pools[ctype].runtime_type == ctype); - return static_cast> &>(*pools[ctype].pool); + return std::make_tuple(&pools[ctype], static_cast> *>(pools[ctype].pool.get())); } } template - inline auto & pool() ENTT_NOEXCEPT { - return const_cast> &>(std::as_const(*this).template pool()); - } - - template - auto & assure() const { + auto assure() const { const auto ctype = type(); pool_data *pdata = nullptr; if constexpr(is_shared_v) { - const auto it = get_pool_data(type()); + const auto it = std::find_if(pools.begin(), pools.end(), [ctype](const auto &pdata) { + return pdata.pool && pdata.runtime_type == ctype; + }); + pdata = (it == pools.cend() ? &pools.emplace_back() : &(*it)); } else { if(!(ctype < pools.size())) { @@ -187,12 +183,7 @@ class registry { pdata->runtime_type = ctype; } - return static_cast> &>(*pdata->pool); - } - - template - inline auto & assure() { - return const_cast> &>(std::as_const(*this).template assure()); + return std::make_tuple(pdata, static_cast> *>(pdata->pool.get())); } public: @@ -247,7 +238,7 @@ public: */ template size_type size() const ENTT_NOEXCEPT { - return assure().size(); + return std::get<1>(assure())->size(); } /** @@ -277,7 +268,7 @@ public: */ template void reserve(const size_type cap) { - assure().reserve(cap); + std::get<1>(assure())->reserve(cap); } /** @@ -299,7 +290,7 @@ public: */ template size_type capacity() const ENTT_NOEXCEPT { - return assure().capacity(); + return std::get<1>(assure())->capacity(); } /** @@ -319,7 +310,7 @@ public: */ template bool empty() const ENTT_NOEXCEPT { - return assure().empty(); + return std::get<1>(assure())->empty(); } /** @@ -350,7 +341,7 @@ public: */ template std::add_const_t * raw() const ENTT_NOEXCEPT { - return assure().raw(); + return std::get<1>(assure())->raw(); } /*! @copydoc raw */ @@ -375,7 +366,7 @@ public: */ template const entity_type * data() const ENTT_NOEXCEPT { - return assure().data(); + return std::get<1>(assure())->data(); } /** @@ -617,8 +608,9 @@ public: template Component & assign(const entity_type entity, Args &&... args) { assert(valid(entity)); - auto &component = assure().construct(entity, std::forward(args)...); - get_pool_data(type())->construction.publish(*this, entity); + auto [pdata, cpool] = assure(); + auto &component = cpool->construct(entity, std::forward(args)...); + pdata->construction.publish(*this, entity); return component; } @@ -638,8 +630,9 @@ public: template void remove(const entity_type entity) { assert(valid(entity)); - get_pool_data(type())->destruction.publish(*this, entity); - pool().destroy(entity); + auto [pdata, cpool] = pool(); + pdata->destruction.publish(*this, entity); + cpool->destroy(entity); } /** @@ -657,7 +650,7 @@ public: template bool has(const entity_type entity) const ENTT_NOEXCEPT { assert(valid(entity)); - return (assure().has(entity) && ...); + return (std::get<1>(assure())->has(entity) && ...); } /** @@ -679,7 +672,7 @@ public: assert(valid(entity)); if constexpr(sizeof...(Component) == 1) { - return (pool().get(entity), ...); + return (std::get<1>(pool())->get(entity), ...); } else { return std::tuple &...>{get(entity)...}; } @@ -721,12 +714,12 @@ public: template Component & get(const entity_type entity, Component &&component) ENTT_NOEXCEPT { assert(valid(entity)); - auto &cpool = assure(); - auto *comp = cpool.try_get(entity); + auto [pdata, cpool] = assure(); + auto *comp = cpool->try_get(entity); if(!comp) { - comp = &cpool.construct(entity, std::forward(component)); - get_pool_data(type())->construction.publish(*this, entity); + comp = &cpool->construct(entity, std::forward(component)); + pdata->construction.publish(*this, entity); } return *comp; @@ -749,7 +742,7 @@ public: assert(valid(entity)); if constexpr(sizeof...(Component) == 1) { - return (assure().try_get(entity), ...); + return (std::get<1>(assure())->try_get(entity), ...); } else { return std::tuple *...>{try_get(entity)...}; } @@ -787,7 +780,7 @@ public: */ template Component & replace(const entity_type entity, Args &&... args) { - return (pool().get(entity) = std::decay_t{std::forward(args)...}); + return (std::get<1>(pool())->get(entity) = std::decay_t{std::forward(args)...}); } /** @@ -818,14 +811,14 @@ public: */ template Component & assign_or_replace(const entity_type entity, Args &&... args) { - auto &cpool = assure(); - auto *comp = cpool.try_get(entity); + auto [pdata, cpool] = assure(); + auto *comp = cpool->try_get(entity); if(comp) { *comp = std::decay_t{std::forward(args)...}; } else { - comp = &cpool.construct(entity, std::forward(args)...); - get_pool_data(type())->construction.publish(*this, entity); + comp = &cpool->construct(entity, std::forward(args)...); + pdata->construction.publish(*this, entity); } return *comp; @@ -856,8 +849,7 @@ public: */ template sink_type construction() ENTT_NOEXCEPT { - assure(); - return get_pool_data(type())->construction.sink(); + return std::get<0>(assure())->construction.sink(); } /** @@ -885,8 +877,7 @@ public: */ template sink_type destruction() ENTT_NOEXCEPT { - assure(); - return get_pool_data(type())->destruction.sink(); + return std::get<0>(assure())->destruction.sink(); } /** @@ -940,8 +931,7 @@ public: template void sort(Compare compare, Sort sort = Sort{}, Args &&... args) { assert(!owned()); - auto &cpool = assure(); - cpool.sort(std::move(compare), std::move(sort), std::forward(args)...); + std::get<1>(assure())->sort(std::move(compare), std::move(sort), std::forward(args)...); } /** @@ -984,8 +974,7 @@ public: template void sort() { assert(!owned()); - auto &cpool = assure(); - cpool.respect(assure()); + std::get<1>(assure())->respect(*std::get<1>(assure())); } /** @@ -1005,11 +994,11 @@ public: template void reset(const entity_type entity) { assert(valid(entity)); - auto &cpool = assure(); + auto [pdata, cpool] = assure(); - if(cpool.has(entity)) { - get_pool_data(type())->destruction.publish(*this, entity); - cpool.destroy(entity); + if(cpool->has(entity)) { + pdata->destruction.publish(*this, entity); + cpool->destroy(entity); } } @@ -1023,16 +1012,17 @@ public: */ template void reset() { - auto &cpool = assure(); - auto &sigh = get_pool_data(type())->destruction; + auto [pdata, cpool] = assure(); - if(sigh.empty()) { + if(pdata->destruction.empty()) { // no group set, otherwise the signal wouldn't be empty - cpool.reset(); + cpool->reset(); } else { - for(const auto entity: static_cast &>(cpool)) { - sigh.publish(*this, entity); - cpool.destroy(entity); + const sparse_set &base = *cpool; + + for(const auto entity: base) { + pdata->destruction.publish(*this, entity); + cpool->destroy(entity); } } } @@ -1173,7 +1163,7 @@ public: */ template entt::view view() { - return { &assure()... }; + return { std::get<1>(assure())... }; } /*! @copydoc view */ @@ -1227,10 +1217,6 @@ public: static_assert(sizeof...(Owned) + sizeof...(Get) + sizeof...(Exclude) > 1); static_assert(sizeof...(Owned) + sizeof...(Get)); - (assure(), ...); - (assure(), ...); - (assure(), ...); - if constexpr(sizeof...(Owned) == 0) { auto it = std::find_if(outer_groups.begin(), outer_groups.end(), [](auto &&gdata) { return gdata.extent == sizeof...(Get) + sizeof...(Exclude) @@ -1248,14 +1234,14 @@ public: gdata.extent = sizeof...(Get) + sizeof...(Exclude); auto *curr = static_cast(gdata.data.get()); - decltype(get_pool_data({})) pdata; + pool_data *pdata; - ((pdata = get_pool_data(type()), + ((pdata = std::get<0>(assure()), pdata->destruction.sink().template connect<&group_type::destroy_if>(curr), pdata->construction.sink().template connect<&group_type::template construct_if<0>>(curr)), ...); - ((pdata = get_pool_data(type()), + ((pdata = std::get<0>(assure()), pdata->destruction.sink().template connect<&group_type::template construct_if<1>>(curr), pdata->construction.sink().template connect<&group_type::destroy_if>(curr)), ...); @@ -1268,7 +1254,7 @@ public: it = std::prev(outer_groups.end()); } - return { it->data.get(), &pool()..., &pool()... }; + return { it->data.get(), std::get<1>(pool())... }; } else { auto it = std::find_if(inner_groups.begin(), inner_groups.end(), [](auto &&gdata) { return gdata.extent == sizeof...(Owned) + sizeof...(Get) + sizeof...(Exclude) @@ -1289,17 +1275,17 @@ public: gdata.extent = sizeof...(Get) + sizeof...(Exclude) + sizeof...(Owned); auto *curr = static_cast(gdata.data.get()); - decltype(get_pool_data({})) pdata; + pool_data *pdata; - ((pdata = get_pool_data(type()), + ((pdata = std::get<0>(assure()), pdata->construction.sink().template connect<&group_type::template induce_if<0>>(curr), pdata->destruction.sink().template connect<&group_type::discard_if>(curr)), ...); - ((pdata = get_pool_data(type()), + ((pdata = std::get<0>(assure()), pdata->destruction.sink().template connect<&group_type::template induce_if<1>>(curr), pdata->construction.sink().template connect<&group_type::discard_if>(curr)), ...); - auto candidate = {(pdata = get_pool_data(type()), + auto candidate = {(pdata = std::get<0>(assure()), pdata->construction.sink().template connect<&group_type::template induce_if<0>>(curr), pdata->destruction.sink().template connect<&group_type::discard_if>(curr), pdata->pool.get())...}; @@ -1315,7 +1301,7 @@ public: it = std::prev(inner_groups.end()); } - return { &it->data->owned, &pool()..., &pool()... }; + return { &it->data->owned, std::get<1>(pool())..., std::get<1>(pool())... }; } } @@ -1364,8 +1350,11 @@ public: std::vector *> set(last - first); std::transform(first, last, set.begin(), [this](const component_type ctype) { - auto pdata = get_pool_data(ctype); - return pdata != pools.cend() && pdata->pool ? pdata->pool.get() : nullptr; + auto it = std::find_if(pools.begin(), pools.end(), [ctype](const auto &pdata) { + return pdata.pool && pdata.runtime_type == ctype; + }); + + return it != pools.cend() && it->pool ? it->pool.get() : nullptr; }); return { std::move(set) };