mirror of
https://github.com/boostorg/unordered.git
synced 2025-07-31 03:47:16 +02:00
added concurrent_flat_map(unordered_flat_map&&)
This commit is contained in:
committed by
Christian Mazakas
parent
d4adcd9b71
commit
ac1a236de6
@ -227,6 +227,13 @@ namespace boost {
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
concurrent_flat_map(
|
||||||
|
unordered_flat_map<Key, T, Hash, Pred, Allocator>&& other)
|
||||||
|
: table_(std::move(other.table_))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
~concurrent_flat_map() = default;
|
~concurrent_flat_map() = default;
|
||||||
|
|
||||||
concurrent_flat_map& operator=(concurrent_flat_map const& rhs)
|
concurrent_flat_map& operator=(concurrent_flat_map const& rhs)
|
||||||
|
@ -252,7 +252,21 @@ struct concurrent_table_arrays:table_arrays<Value,Group,SizePolicy>
|
|||||||
template<typename Allocator>
|
template<typename Allocator>
|
||||||
static concurrent_table_arrays new_(Allocator& al,std::size_t n)
|
static concurrent_table_arrays new_(Allocator& al,std::size_t n)
|
||||||
{
|
{
|
||||||
concurrent_table_arrays arrays{super::new_(al,n),nullptr};
|
super x{super::new_(al,n)};
|
||||||
|
BOOST_TRY{
|
||||||
|
return new_group_access(al,x);
|
||||||
|
}
|
||||||
|
BOOST_CATCH(...){
|
||||||
|
super::delete_(al,x);
|
||||||
|
BOOST_RETHROW
|
||||||
|
}
|
||||||
|
BOOST_CATCH_END
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Allocator>
|
||||||
|
static concurrent_table_arrays new_group_access(Allocator& al,const super& x)
|
||||||
|
{
|
||||||
|
concurrent_table_arrays arrays{x,nullptr};
|
||||||
if(!arrays.elements){
|
if(!arrays.elements){
|
||||||
arrays.group_accesses=dummy_group_accesses<SizePolicy::min_size()>();
|
arrays.group_accesses=dummy_group_accesses<SizePolicy::min_size()>();
|
||||||
}
|
}
|
||||||
@ -261,20 +275,13 @@ struct concurrent_table_arrays:table_arrays<Value,Group,SizePolicy>
|
|||||||
typename boost::allocator_rebind<Allocator,group_access>::type;
|
typename boost::allocator_rebind<Allocator,group_access>::type;
|
||||||
using access_traits=boost::allocator_traits<access_alloc>;
|
using access_traits=boost::allocator_traits<access_alloc>;
|
||||||
|
|
||||||
BOOST_TRY{
|
auto aal=access_alloc(al);
|
||||||
auto aal=access_alloc(al);
|
arrays.group_accesses=boost::to_address(
|
||||||
arrays.group_accesses=boost::to_address(
|
access_traits::allocate(aal,arrays.groups_size_mask+1));
|
||||||
access_traits::allocate(aal,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();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
BOOST_CATCH(...){
|
|
||||||
super::delete_(al,arrays);
|
|
||||||
BOOST_RETHROW
|
|
||||||
}
|
|
||||||
BOOST_CATCH_END
|
|
||||||
}
|
}
|
||||||
return arrays;
|
return arrays;
|
||||||
}
|
}
|
||||||
@ -421,6 +428,8 @@ class concurrent_table:
|
|||||||
using group_type=typename super::group_type;
|
using group_type=typename super::group_type;
|
||||||
using super::N;
|
using super::N;
|
||||||
using prober=typename super::prober;
|
using prober=typename super::prober;
|
||||||
|
using arrays_type=typename super::arrays_type;
|
||||||
|
using size_ctrl_type=typename super::size_ctrl_type;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
using key_type=typename super::key_type;
|
using key_type=typename super::key_type;
|
||||||
@ -455,6 +464,21 @@ public:
|
|||||||
concurrent_table(x,al_,x.exclusive_access()){}
|
concurrent_table(x,al_,x.exclusive_access()){}
|
||||||
concurrent_table(concurrent_table&& x,const Allocator& al_):
|
concurrent_table(concurrent_table&& x,const Allocator& al_):
|
||||||
concurrent_table(std::move(x),al_,x.exclusive_access()){}
|
concurrent_table(std::move(x),al_,x.exclusive_access()){}
|
||||||
|
|
||||||
|
concurrent_table(table<TypePolicy,Hash,Pred,Allocator>&& x):
|
||||||
|
super{
|
||||||
|
std::move(x.h()),std::move(x.pred()),std::move(x.al()),
|
||||||
|
arrays_type(arrays_type::new_group_access(
|
||||||
|
x.al(),
|
||||||
|
typename arrays_type::super{
|
||||||
|
x.arrays.groups_size_index,x.arrays.groups_size_mask,
|
||||||
|
reinterpret_cast<group_type*>(x.arrays.groups),
|
||||||
|
reinterpret_cast<value_type*>(x.arrays.elements)})),
|
||||||
|
size_ctrl_type{x.size_ctrl.ml,x.size_ctrl.size}}
|
||||||
|
{
|
||||||
|
x.empty_initialize();
|
||||||
|
}
|
||||||
|
|
||||||
~concurrent_table()=default;
|
~concurrent_table()=default;
|
||||||
|
|
||||||
concurrent_table& operator=(const concurrent_table& x)
|
concurrent_table& operator=(const concurrent_table& x)
|
||||||
|
@ -37,6 +37,10 @@ namespace boost {
|
|||||||
template <class Key, class T, class Hash, class KeyEqual, class Allocator>
|
template <class Key, class T, class Hash, class KeyEqual, class Allocator>
|
||||||
class unordered_flat_map
|
class unordered_flat_map
|
||||||
{
|
{
|
||||||
|
template <class Key2, class T2, class Hash2, class Pred2,
|
||||||
|
class Allocator2>
|
||||||
|
friend class concurrent_flat_map;
|
||||||
|
|
||||||
using map_types = detail::foa::flat_map_types<Key, T>;
|
using map_types = detail::foa::flat_map_types<Key, T>;
|
||||||
|
|
||||||
using table_type = detail::foa::table<map_types, Hash, KeyEqual,
|
using table_type = detail::foa::table<map_types, Hash, KeyEqual,
|
||||||
|
Reference in New Issue
Block a user