From b9fe4ed789e158446888b80acb84bf2274fcc87a Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Thu, 7 Sep 2023 12:41:43 -0700 Subject: [PATCH] Clean up how group_accesses are setup for concurrent_table_arrays --- .../unordered/detail/foa/concurrent_table.hpp | 49 +++++++++++++------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/include/boost/unordered/detail/foa/concurrent_table.hpp b/include/boost/unordered/detail/foa/concurrent_table.hpp index 6a366266..f7881e8e 100644 --- a/include/boost/unordered/detail/foa/concurrent_table.hpp +++ b/include/boost/unordered/detail/foa/concurrent_table.hpp @@ -231,8 +231,8 @@ private: insert_counter_type cnt{0}; }; -template -GroupAccessPtr dummy_group_accesses() +template +group_access* dummy_group_accesses() { /* Default group_access array to provide to empty containers without * incurring dynamic allocation. Mutexes won't actually ever be used, @@ -240,12 +240,9 @@ GroupAccessPtr dummy_group_accesses() * be incremented (insertions won't succeed as capacity()==0). */ - using pointer_traits=boost::pointer_traits; - using group_access_type=typename pointer_traits::element_type; + static group_access accesses[Size]; - static group_access_type accesses[Size]; - - return pointer_traits::pointer_to(*accesses); + return accesses; } /* subclasses table_arrays to add an additional group_access array */ @@ -280,21 +277,43 @@ struct concurrent_table_arrays:table_arrays BOOST_CATCH_END } - static concurrent_table_arrays new_group_access(group_access_allocator_type al,const super& x) + static void set_group_access( + group_access_allocator_type al,concurrent_table_arrays& arrays) { - concurrent_table_arrays arrays{x,nullptr}; - if(!arrays.elements()&&std::is_same::value){ - arrays.group_accesses_= - dummy_group_accesses(); - } - else{ - arrays.group_accesses_= + set_group_access( + al,arrays,std::is_same{}); + } + + static void set_group_access( + group_access_allocator_type al, + concurrent_table_arrays& arrays, + std::false_type /* fancy pointers */) + { + arrays.group_accesses_= boost::allocator_allocate(al,arrays.groups_size_mask+1); for(std::size_t i=0;i(); + } else { + set_group_access(al,arrays,std::false_type{}); } + } + + static concurrent_table_arrays new_group_access(group_access_allocator_type al,const super& x) + { + concurrent_table_arrays arrays{x,nullptr}; + set_group_access(al,arrays); return arrays; }