diff --git a/include/boost/unordered/concurrent_flat_map.hpp b/include/boost/unordered/concurrent_flat_map.hpp index a5b968c8..6e2eef98 100644 --- a/include/boost/unordered/concurrent_flat_map.hpp +++ b/include/boost/unordered/concurrent_flat_map.hpp @@ -227,6 +227,13 @@ namespace boost { { } + + concurrent_flat_map( + unordered_flat_map&& other) + : table_(std::move(other.table_)) + { + } + ~concurrent_flat_map() = default; concurrent_flat_map& operator=(concurrent_flat_map const& rhs) diff --git a/include/boost/unordered/detail/foa/concurrent_table.hpp b/include/boost/unordered/detail/foa/concurrent_table.hpp index afe9cdae..5fcb6ace 100644 --- a/include/boost/unordered/detail/foa/concurrent_table.hpp +++ b/include/boost/unordered/detail/foa/concurrent_table.hpp @@ -252,7 +252,21 @@ struct concurrent_table_arrays:table_arrays template 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 + static concurrent_table_arrays new_group_access(Allocator& al,const super& x) + { + concurrent_table_arrays arrays{x,nullptr}; if(!arrays.elements){ arrays.group_accesses=dummy_group_accesses(); } @@ -261,20 +275,13 @@ struct concurrent_table_arrays:table_arrays typename boost::allocator_rebind::type; using access_traits=boost::allocator_traits; - BOOST_TRY{ - auto aal=access_alloc(al); - arrays.group_accesses=boost::to_address( - access_traits::allocate(aal,arrays.groups_size_mask+1)); + auto aal=access_alloc(al); + arrays.group_accesses=boost::to_address( + access_traits::allocate(aal,arrays.groups_size_mask+1)); - for(std::size_t i=0;i&& 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(x.arrays.groups), + reinterpret_cast(x.arrays.elements)})), + size_ctrl_type{x.size_ctrl.ml,x.size_ctrl.size}} + { + x.empty_initialize(); + } + ~concurrent_table()=default; concurrent_table& operator=(const concurrent_table& x) diff --git a/include/boost/unordered/unordered_flat_map.hpp b/include/boost/unordered/unordered_flat_map.hpp index 66ce6faf..1f7984ec 100644 --- a/include/boost/unordered/unordered_flat_map.hpp +++ b/include/boost/unordered/unordered_flat_map.hpp @@ -37,6 +37,10 @@ namespace boost { template class unordered_flat_map { + template + friend class concurrent_flat_map; + using map_types = detail::foa::flat_map_types; using table_type = detail::foa::table