From 60c476a291f1f3cd34515267b79c71371a1e1dab Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Sun, 1 Sep 2019 13:01:47 +0700 Subject: [PATCH] little insert optimization --- headers/ecs.hpp/ecs.hpp | 83 ++++++++++++++++++----------------------- untests/ecs_tests.cpp | 26 ++++++------- 2 files changed, 50 insertions(+), 59 deletions(-) diff --git a/headers/ecs.hpp/ecs.hpp b/headers/ecs.hpp/ecs.hpp index e37a373..d8b6555 100644 --- a/headers/ecs.hpp/ecs.hpp +++ b/headers/ecs.hpp/ecs.hpp @@ -105,6 +105,7 @@ namespace ecs_hpp std::tuple&& t, std::index_sequence iseq) { + (void)t; (void)iseq; return std::make_tuple(std::move(std::get(t))...); } @@ -114,6 +115,7 @@ namespace ecs_hpp const std::tuple& t, std::index_sequence iseq) { + (void)t; (void)iseq; return std::make_tuple(std::get(t)...); } @@ -312,14 +314,14 @@ namespace ecs_hpp incremental_locker& operator=(const incremental_locker&) = delete; static bool is_locked() noexcept { - return lock_count_; + return !!lock_count_; } private: static std::size_t lock_count_; }; template < typename Tag > - std::size_t incremental_locker::lock_count_{0u}; + std::size_t incremental_locker::lock_count_ = 0u; } } @@ -402,11 +404,6 @@ namespace ecs_hpp return true; } - template < typename... Args > - bool emplace(Args&&... args) { - return insert(T(std::forward(args)...)); - } - bool unordered_erase(const T& v) noexcept { if ( !has(v) ) { return false; @@ -543,27 +540,14 @@ namespace ecs_hpp } template < typename UK, typename UT > - bool insert(UK&& k, UT&& v) { - if ( keys_.has(k) ) { - return false; + std::pair insert(UK&& k, UT&& v) { + if ( T* value = find(k) ) { + return std::make_pair(value, false); } values_.push_back(std::forward(v)); try { - return keys_.insert(std::forward(k)); - } catch (...) { - values_.pop_back(); - throw; - } - } - - template < typename UK, typename... Args > - bool emplace(UK&& k, Args&&... args) { - if ( keys_.has(k) ) { - return false; - } - values_.emplace_back(std::forward(args)...); - try { - return keys_.insert(std::forward(k)); + keys_.insert(std::forward(k)); + return std::make_pair(&values_.back(), true); } catch (...) { values_.pop_back(); throw; @@ -571,13 +555,18 @@ namespace ecs_hpp } template < typename UK, typename UT > - bool insert_or_assign(UK&& k, UT&& v) { - if ( keys_.has(k) ) { - get(k) = std::forward(v); - return false; - } else { - insert(std::forward(k), std::forward(v)); - return true; + std::pair insert_or_assign(UK&& k, UT&& v) { + if ( T* value = find(k) ) { + *value = std::forward(v); + return std::make_pair(value, false); + } + values_.push_back(std::forward(v)); + try { + keys_.insert(std::forward(k)); + return std::make_pair(&values_.back(), true); + } catch (...) { + values_.pop_back(); + throw; } } @@ -699,22 +688,21 @@ namespace ecs_hpp template < typename... Args > T& assign(entity_id id, Args&&... args) { - if ( components_.has(id) ) { - return components_.get(id) = T(std::forward(args)...); + if ( T* value = components_.find(id) ) { + *value = T(std::forward(args)...); + return *value; } assert(!components_locker::is_locked()); - components_.emplace(id, std::forward(args)...); - return components_.get(id); + return *components_.insert(id, T(std::forward(args)...)).first; } template < typename... Args > T& ensure(entity_id id, Args&&... args) { - if ( components_.has(id) ) { - return components_.get(id); + if ( T* value = components_.find(id) ) { + return *value; } assert(!components_locker::is_locked()); - components_.emplace(id, std::forward(args)...); - return components_.get(id); + return *components_.insert(id, T(std::forward(args)...)).first; } bool exists(entity_id id) const noexcept { @@ -793,7 +781,7 @@ namespace ecs_hpp return empty_value_; } assert(!components_locker::is_locked()); - components_.emplace(id); + components_.insert(id); return empty_value_; } @@ -803,7 +791,7 @@ namespace ecs_hpp return empty_value_; } assert(!components_locker::is_locked()); - components_.emplace(id); + components_.insert(id); return empty_value_; } @@ -2358,24 +2346,28 @@ namespace ecs_hpp template < typename... Ts > std::tuple registry::get_components(const uentity& ent) { + (void)ent; assert(valid_entity(ent)); return std::make_tuple(std::ref(get_component(ent))...); } template < typename... Ts > std::tuple registry::get_components(const const_uentity& ent) const { + (void)ent; assert(valid_entity(ent)); return std::make_tuple(std::cref(get_component(ent))...); } template < typename... Ts > std::tuple registry::find_components(const uentity& ent) noexcept { + (void)ent; assert(valid_entity(ent)); return std::make_tuple(find_component(ent)...); } template < typename... Ts > std::tuple registry::find_components(const const_uentity& ent) const noexcept { + (void)ent; assert(valid_entity(ent)); return std::make_tuple(find_component(ent)...); } @@ -2460,10 +2452,9 @@ namespace ecs_hpp [](priority_t pr, const auto& r){ return pr < r.first; }); - systems_.emplace( + systems_.insert( iter, - priority, - std::make_unique(std::forward(args)...)); + std::make_pair(priority, std::make_unique(std::forward(args)...))); } inline void registry::process_all_systems() { @@ -2540,7 +2531,7 @@ namespace ecs_hpp return *storage; } const auto family = detail::type_family::id(); - storages_.emplace( + storages_.insert( family, std::make_unique>(*this)); return *static_cast*>( diff --git a/untests/ecs_tests.cpp b/untests/ecs_tests.cpp index f30866f..321fa83 100644 --- a/untests/ecs_tests.cpp +++ b/untests/ecs_tests.cpp @@ -177,7 +177,7 @@ TEST_CASE("detail") { REQUIRE(s.insert(position_c(1,2))); REQUIRE_FALSE(s.insert(position_c(1,2))); REQUIRE(s.has(position_c(1,2))); - REQUIRE(s.emplace(3,4)); + REQUIRE(s.insert(position_c(3,4))); REQUIRE(s.has(position_c(3,4))); REQUIRE(s.get_dense_index(position_c(1,2)) == 0); REQUIRE(s.get_dense_index(position_c(3,4)) == 1); @@ -209,16 +209,16 @@ TEST_CASE("detail") { { obj_t o{21u}; - REQUIRE(m.insert(21u, o)); - REQUIRE(m.insert(42u, obj_t{42u})); - REQUIRE(m.emplace(84u, 84u)); + REQUIRE(m.insert(21u, o).second); + REQUIRE(m.insert(42u, obj_t{42u}).second); + REQUIRE(m.insert(84u, obj_t(84u)).second); } { obj_t o{21u}; - REQUIRE_FALSE(m.insert(21u, o)); - REQUIRE_FALSE(m.insert(42u, obj_t{42u})); - REQUIRE_FALSE(m.emplace(84u, 84u)); + REQUIRE_FALSE(m.insert(21u, o).second); + REQUIRE_FALSE(m.insert(42u, obj_t{42u}).second); + REQUIRE_FALSE(m.insert(84u, obj_t(84u)).second); } REQUIRE_FALSE(m.empty()); @@ -270,10 +270,10 @@ TEST_CASE("detail") { }; sparse_map s{position_c_indexer()}; - REQUIRE(s.insert(position_c(1,2), obj_t{1})); - REQUIRE_FALSE(s.insert(position_c(1,2), obj_t{1})); + REQUIRE(s.insert(position_c(1,2), obj_t{1}).second); + REQUIRE_FALSE(s.insert(position_c(1,2), obj_t{1}).second); REQUIRE(s.has(position_c(1,2))); - REQUIRE(s.emplace(position_c(3,4), obj_t{3})); + REQUIRE(s.insert(position_c(3,4), obj_t{3}).second); REQUIRE(s.has(position_c(3,4))); REQUIRE(s.get(position_c(1,2)).x == 1); REQUIRE(s.get(position_c(3,4)).x == 3); @@ -291,14 +291,14 @@ TEST_CASE("detail") { }; sparse_map m; - REQUIRE(m.insert_or_assign(42, obj_t(42))); + REQUIRE(m.insert_or_assign(42, obj_t(42)).second); REQUIRE(m.has(42)); REQUIRE(m.get(42).x == 42); - REQUIRE_FALSE(m.insert_or_assign(42, obj_t(21))); + REQUIRE_FALSE(m.insert_or_assign(42, obj_t(21)).second); REQUIRE(m.has(42)); REQUIRE(m.get(42).x == 21); REQUIRE(m.size() == 1); - REQUIRE(m.insert_or_assign(84, obj_t(84))); + REQUIRE(m.insert_or_assign(84, obj_t(84)).second); REQUIRE(m.has(84)); REQUIRE(m.get(84).x == 84); REQUIRE(m.size() == 2);