From 5114b1d3156143748019e1930c7be836b3763de2 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Thu, 27 Dec 2018 11:12:48 +0700 Subject: [PATCH] storage holder to sparse_map --- ecs.hpp | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/ecs.hpp b/ecs.hpp index 6cf8e05..5f06862 100644 --- a/ecs.hpp +++ b/ecs.hpp @@ -22,8 +22,6 @@ #include #include #include -#include -#include // ----------------------------------------------------------------------------- // @@ -686,7 +684,7 @@ namespace ecs_hpp detail::sparse_set entity_ids_; using storage_uptr = std::unique_ptr; - std::unordered_map storages_; + detail::sparse_map storages_; using system_uptr = std::unique_ptr; std::vector systems_; @@ -972,21 +970,19 @@ namespace ecs_hpp template < typename T > detail::component_storage* registry::find_storage_() noexcept { const auto family = detail::type_family::id(); - const auto iter = storages_.find(family); - if ( iter != storages_.end() ) { - return static_cast*>(iter->second.get()); - } - return nullptr; + using raw_storage_ptr = detail::component_storage*; + return storages_.has(family) + ? static_cast(storages_.get_value(family).get()) + : nullptr; } template < typename T > const detail::component_storage* registry::find_storage_() const noexcept { const auto family = detail::type_family::id(); - const auto iter = storages_.find(family); - if ( iter != storages_.end() ) { - return static_cast*>(iter->second.get()); - } - return nullptr; + using raw_storage_ptr = const detail::component_storage*; + return storages_.has(family) + ? static_cast(storages_.get_value(family).get()) + : nullptr; } template < typename T > @@ -996,12 +992,11 @@ namespace ecs_hpp return *storage; } const auto family = detail::type_family::id(); - const auto emplace_r = storages_.emplace(std::make_pair( + storages_.emplace( family, - std::make_unique>(*this))); - assert(emplace_r.second && "unexpected internal error"); + std::make_unique>(*this)); return *static_cast*>( - emplace_r.first->second.get()); + storages_.get_value(family).get()); } inline bool registry::is_entity_alive_impl_(const entity& ent) const noexcept { @@ -1013,8 +1008,8 @@ namespace ecs_hpp return 0u; } std::size_t removed_components = 0u; - for ( auto& storage_p : storages_ ) { - if ( storage_p.second->remove(ent.id()) ) { + for ( const auto id : storages_ ) { + if ( storages_.get_value(id)->remove(ent.id()) ) { ++removed_components; } }