From 49fc08b93426a515f915a1e0e32f11d81d06eed3 Mon Sep 17 00:00:00 2001 From: joaquintides Date: Tue, 25 Oct 2022 19:48:19 +0200 Subject: [PATCH] refactored emplace_impl to improve inlining --- include/boost/unordered/detail/foa.hpp | 47 ++++++++++++++++---------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/include/boost/unordered/detail/foa.hpp b/include/boost/unordered/detail/foa.hpp index df9dba2b..142dda06 100644 --- a/include/boost/unordered/detail/foa.hpp +++ b/include/boost/unordered/detail/foa.hpp @@ -1595,24 +1595,10 @@ private: }; } else{ - /* strong exception guarantee -> try insertion before rehash */ - auto new_arrays_=new_arrays( - std::size_t(std::ceil(static_cast(size_+1)/mlf))); - BOOST_TRY{ - it=nosize_unchecked_emplace_at( - new_arrays_,position_for(hash,new_arrays_), - hash,std::forward(args)...); - } - BOOST_CATCH(...){ - delete_arrays(new_arrays_); - BOOST_RETHROW - } - BOOST_CATCH_END - - /* new_arrays_ lifetime taken care of by unchecked_rehash */ - unchecked_rehash(new_arrays_); - ++size_; - return {it,true}; + return { + unchecked_emplace_with_rehash(hash,std::forward(args)...), + true + }; } } @@ -1621,6 +1607,31 @@ private: return size_policy::size(size_index_for(n))*N-1; } + template + BOOST_NOINLINE iterator + unchecked_emplace_with_rehash(std::size_t hash,Args&&... args) + { + /* strong exception guarantee -> try insertion before rehash */ + auto new_arrays_=new_arrays( + std::size_t(std::ceil(static_cast(size_+1)/mlf))); + iterator it; + BOOST_TRY{ + it=nosize_unchecked_emplace_at( + new_arrays_,position_for(hash,new_arrays_), + hash,std::forward(args)...); + } + BOOST_CATCH(...){ + delete_arrays(new_arrays_); + BOOST_RETHROW + } + BOOST_CATCH_END + + /* new_arrays_ lifetime taken care of by unchecked_rehash */ + unchecked_rehash(new_arrays_); + ++size_; + return it; + } + BOOST_NOINLINE void unchecked_rehash(std::size_t n) { auto new_arrays_=new_arrays(n);