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};
};
template<typename GroupAccessPtr,std::size_t Size>
GroupAccessPtr dummy_group_accesses()
template<std::size_t Size>
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<GroupAccessPtr>;
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<Value,Group,SizePolicy,Allocator>
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<group_access*,group_access_pointer>::value){
arrays.group_accesses_=
dummy_group_accesses<group_access_pointer,SizePolicy::min_size()>();
}
else{
arrays.group_accesses_=
set_group_access(
al,arrays,std::is_same<group_access*,group_access_pointer>{});
}
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<arrays.groups_size_mask+1;++i){
::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;
}