diff --git a/include/boost/unordered/unordered_node_map.hpp b/include/boost/unordered/unordered_node_map.hpp index cb3e995f..37af760d 100644 --- a/include/boost/unordered/unordered_node_map.hpp +++ b/include/boost/unordered/unordered_node_map.hpp @@ -67,6 +67,21 @@ namespace boost { x = nullptr; } + template + static void construct(A& al, storage_type* p, storage_type const& copy) + { + *p = boost::to_address(boost::allocator_allocate(al, 1)); + try { + boost::allocator_construct(al, *p, *copy); + } catch (...) { + boost::allocator_deallocate(al, + boost::pointer_traits< + typename boost::allocator_pointer::type>::pointer_to(**p), + 1); + throw; + } + } + template static void construct(A& al, storage_type* p, Args&&... args) { diff --git a/include/boost/unordered/unordered_node_set.hpp b/include/boost/unordered/unordered_node_set.hpp index 67edcd5a..685a2dd0 100644 --- a/include/boost/unordered/unordered_node_set.hpp +++ b/include/boost/unordered/unordered_node_set.hpp @@ -53,6 +53,21 @@ namespace boost { x = nullptr; } + template + static void construct(A& al, storage_type* p, storage_type const& copy) + { + *p = boost::to_address(boost::allocator_allocate(al, 1)); + try { + boost::allocator_construct(al, *p, *copy); + } catch (...) { + boost::allocator_deallocate(al, + boost::pointer_traits< + typename boost::allocator_pointer::type>::pointer_to(**p), + 1); + throw; + } + } + template static void construct(A& al, storage_type* p, Args&&... args) { diff --git a/test/unordered/assign_tests.cpp b/test/unordered/assign_tests.cpp index b000e42f..daf2497d 100644 --- a/test/unordered/assign_tests.cpp +++ b/test/unordered/assign_tests.cpp @@ -209,40 +209,75 @@ namespace assign_tests { #ifdef BOOST_UNORDERED_FOA_TESTS boost::unordered_flat_map >* test_map_std_alloc; + boost::unordered_node_map >* test_node_map_std_alloc; boost::unordered_flat_set >* test_set; + boost::unordered_node_set >* test_node_set; boost::unordered_flat_map >* test_map; + boost::unordered_node_map >* test_node_map; boost::unordered_flat_set >* test_set_prop_assign; + boost::unordered_node_set >* + test_node_set_prop_assign; boost::unordered_flat_map >* test_map_prop_assign; + boost::unordered_node_map >* + test_node_map_prop_assign; boost::unordered_flat_set >* test_set_no_prop_assign; + boost::unordered_node_set >* + test_node_set_no_prop_assign; boost::unordered_flat_map >* test_map_no_prop_assign; + boost::unordered_node_map >* + test_node_map_no_prop_assign; UNORDERED_AUTO_TEST (check_traits) { BOOST_TEST(!is_propagate(test_set)); BOOST_TEST(is_propagate(test_set_prop_assign)); BOOST_TEST(!is_propagate(test_set_no_prop_assign)); + + BOOST_TEST(!is_propagate(test_node_set)); + BOOST_TEST(is_propagate(test_node_set_prop_assign)); + BOOST_TEST(!is_propagate(test_node_set_no_prop_assign)); } UNORDERED_TEST(assign_tests1, - ((test_map_std_alloc)(test_set)(test_map)(test_set_prop_assign)(test_map_prop_assign)(test_set_no_prop_assign)(test_map_no_prop_assign))( + ((test_map_std_alloc)(test_node_map_std_alloc) + (test_set)(test_node_set) + (test_map)(test_node_map) + (test_set_prop_assign)(test_node_set_prop_assign) + (test_map_prop_assign)(test_node_map_prop_assign) + (test_set_no_prop_assign)(test_node_set_no_prop_assign) + (test_map_no_prop_assign)(test_node_map_no_prop_assign))( (default_generator)(generate_collisions)(limited_range))) UNORDERED_TEST(assign_tests2, - ((test_set)(test_map)(test_set_prop_assign)(test_map_prop_assign)(test_set_no_prop_assign)(test_map_no_prop_assign))( + ((test_set)(test_node_set) + (test_map)(test_node_map) + (test_set_prop_assign)(test_node_set_prop_assign) + (test_map_prop_assign)(test_node_map_prop_assign) + (test_set_no_prop_assign)(test_node_set_no_prop_assign) + (test_map_no_prop_assign)(test_node_map_no_prop_assign))( (default_generator)(generate_collisions)(limited_range))) #else boost::unordered_map