From c43adc7df31ee45d7553bc6aefbb0fb1e978304c Mon Sep 17 00:00:00 2001 From: John Wellbelove Date: Sun, 4 Feb 2018 14:52:31 +0000 Subject: [PATCH] Improved performance of emplace for value_type parameters --- library.properties | 2 +- src/flat_map.h | 27 +++------------------------ src/flat_multimap.h | 13 +++---------- src/flat_multiset.h | 11 +---------- src/flat_set.h | 26 +------------------------- support/Release notes.txt | 4 ++++ 6 files changed, 13 insertions(+), 70 deletions(-) diff --git a/library.properties b/library.properties index 69ddf058..b2176433 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Embedded Template Library -version=10.16.0 +version=10.16.1 author= John Wellbelove maintainer=John Wellbelove sentence=A C++ template library tailored for embedded systems. diff --git a/src/flat_map.h b/src/flat_map.h index c257ec7d..e9b799cd 100644 --- a/src/flat_map.h +++ b/src/flat_map.h @@ -341,29 +341,7 @@ namespace etl //************************************************************************* std::pair emplace(const value_type& value) { - ETL_ASSERT(!full(), ETL_ERROR(flat_map_full)); - - // Create it. - value_type* pvalue = storage.allocate(); - ::new (pvalue) value_type(value); - - iterator i_element = lower_bound(value.first); - - std::pair result(i_element, false); - - // Doesn't already exist? - if ((i_element == end() || (i_element->first != value.first))) - { - ++construct_count; - result = refmap_t::insert_at(i_element, *pvalue); - } - else - { - pvalue->~value_type(); - storage.release(pvalue); - } - - return result; + return insert(value); } //************************************************************************* @@ -375,7 +353,8 @@ namespace etl // Create it. value_type* pvalue = storage.allocate(); - ::new (pvalue) value_type(key, value); + ::new ((void*)etl::addressof(pvalue->first)) key_type(key); + ::new ((void*)etl::addressof(pvalue->second)) mapped_type(value); iterator i_element = lower_bound(key); diff --git a/src/flat_multimap.h b/src/flat_multimap.h index b8fecd82..4ef7901e 100644 --- a/src/flat_multimap.h +++ b/src/flat_multimap.h @@ -294,15 +294,7 @@ namespace etl //************************************************************************* std::pair emplace(const value_type& value) { - ETL_ASSERT(!full(), ETL_ERROR(flat_multimap_full)); - - // Create it. - value_type* pvalue = storage.allocate(); - ::new (pvalue) value_type(value); - iterator i_element = lower_bound(value.first); - ++construct_count; - - return refmap_t::insert_at(i_element, *pvalue); + return insert(value); } //************************************************************************* @@ -314,7 +306,8 @@ namespace etl // Create it. value_type* pvalue = storage.allocate(); - ::new (pvalue) value_type(key, value); + ::new ((void*)etl::addressof(pvalue->first)) key_type(key); + ::new ((void*)etl::addressof(pvalue->second)) mapped_type(value); iterator i_element = lower_bound(key); ++construct_count; diff --git a/src/flat_multiset.h b/src/flat_multiset.h index 63d44b02..2ec645a1 100644 --- a/src/flat_multiset.h +++ b/src/flat_multiset.h @@ -271,16 +271,7 @@ namespace etl template std::pair emplace(parameter_t value) { - ETL_ASSERT(!full(), ETL_ERROR(flat_multiset_full)); - - // Create it. - value_type* pvalue = storage.allocate(); - ::new (pvalue) value_type(value); - - iterator i_element = lower_bound(*pvalue); - - ++construct_count; - return std::pair(refset_t::insert_at(i_element, *pvalue)); + return insert(value); } //************************************************************************* diff --git a/src/flat_set.h b/src/flat_set.h index 29d16801..49e8b12f 100644 --- a/src/flat_set.h +++ b/src/flat_set.h @@ -274,31 +274,7 @@ namespace etl //************************************************************************* std::pair emplace(parameter_t value) { - ETL_ASSERT(!full(), ETL_ERROR(flat_set_full)); - - std::pair result; - - // Create it. - value_type* pvalue = storage.allocate(); - ::new (pvalue) value_type(value); - - iterator i_element = lower_bound(*pvalue); - - // Doesn't already exist? - if ((i_element == end() || (*i_element != *pvalue))) - { - ++construct_count; - result = refset_t::insert_at(i_element, *pvalue); - } - else - { - // Destroy it. - pvalue->~value_type(); - storage.release(pvalue); - result = std::pair(end(), false); - } - - return result; + return insert(value); } //************************************************************************* diff --git a/support/Release notes.txt b/support/Release notes.txt index f1f865aa..5e1cd96c 100644 --- a/support/Release notes.txt +++ b/support/Release notes.txt @@ -1,3 +1,7 @@ +=============================================================================== +10.16.1 +Improved performance of emplace for value_type parameters. + =============================================================================== 10.16.0 Added emplace member functions to flat_map, flat_multimap, flat_set and flat_multiset