Clean up how group_accesses are setup for concurrent_table_arrays

This commit is contained in:
Christian Mazakas
2023-09-07 12:41:43 -07:00
parent c707bcb6d8
commit b9fe4ed789

View File

@@ -231,8 +231,8 @@ private:
insert_counter_type cnt{0}; insert_counter_type cnt{0};
}; };
template<typename GroupAccessPtr,std::size_t Size> template<std::size_t Size>
GroupAccessPtr dummy_group_accesses() group_access* dummy_group_accesses()
{ {
/* Default group_access array to provide to empty containers without /* Default group_access array to provide to empty containers without
* incurring dynamic allocation. Mutexes won't actually ever be used, * 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). * be incremented (insertions won't succeed as capacity()==0).
*/ */
using pointer_traits=boost::pointer_traits<GroupAccessPtr>; static group_access accesses[Size];
using group_access_type=typename pointer_traits::element_type;
static group_access_type accesses[Size]; return accesses;
return pointer_traits::pointer_to(*accesses);
} }
/* subclasses table_arrays to add an additional group_access array */ /* subclasses table_arrays to add an additional group_access array */
@@ -280,21 +277,43 @@ struct concurrent_table_arrays:table_arrays<Value,Group,SizePolicy,Allocator>
BOOST_CATCH_END 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}; set_group_access(
if(!arrays.elements()&&std::is_same<group_access*,group_access_pointer>::value){ al,arrays,std::is_same<group_access*,group_access_pointer>{});
arrays.group_accesses_= }
dummy_group_accesses<group_access_pointer,SizePolicy::min_size()>();
} static void set_group_access(
else{ group_access_allocator_type al,
arrays.group_accesses_= concurrent_table_arrays& arrays,
std::false_type /* fancy pointers */)
{
arrays.group_accesses_=
boost::allocator_allocate(al,arrays.groups_size_mask+1); boost::allocator_allocate(al,arrays.groups_size_mask+1);
for(std::size_t i=0;i<arrays.groups_size_mask+1;++i){ for(std::size_t i=0;i<arrays.groups_size_mask+1;++i){
::new (arrays.group_accesses()+i) group_access(); ::new (arrays.group_accesses()+i) group_access();
} }
}
static void set_group_access(
group_access_allocator_type al,
concurrent_table_arrays& arrays,
std::true_type /* optimize when elements() is null */)
{
if(!arrays.elements()){
arrays.group_accesses_=
dummy_group_accesses<SizePolicy::min_size()>();
} 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; return arrays;
} }