From d70fcb8c25e680d9fc56ccc6722f0f6bf22ecc2b Mon Sep 17 00:00:00 2001 From: Daniel James Date: Fri, 6 Jan 2012 08:35:51 +0000 Subject: [PATCH] Unordered: Make using Boost.Move optional. [SVN r76330] --- include/boost/unordered/unordered_map.hpp | 51 ++++++++++++++++++++++- include/boost/unordered/unordered_set.hpp | 50 ++++++++++++++++++++++ test/unordered/move_tests.cpp | 39 +++++++++++++---- 3 files changed, 131 insertions(+), 9 deletions(-) diff --git a/include/boost/unordered/unordered_map.hpp b/include/boost/unordered/unordered_map.hpp index 6e44ed6b..c001533f 100644 --- a/include/boost/unordered/unordered_map.hpp +++ b/include/boost/unordered/unordered_map.hpp @@ -41,7 +41,9 @@ namespace unordered template class unordered_map { +#if defined(BOOST_UNORDERED_USE_MOVE) BOOST_COPYABLE_AND_MOVABLE(unordered_map) +#endif public: @@ -115,10 +117,17 @@ namespace unordered unordered_map(unordered_map const&, allocator_type const&); +#if defined(BOOST_UNORDERED_USE_MOVE) unordered_map(BOOST_RV_REF(unordered_map) other) : table_(other.table_, boost::unordered::detail::move_tag()) { } +#elif !defined(BOOST_NO_RVALUE_REFERENCES) + unordered_map(unordered_map&& other) + : table_(other.table_, boost::unordered::detail::move_tag()) + { + } +#endif #if !defined(BOOST_NO_RVALUE_REFERENCES) unordered_map(unordered_map&&, allocator_type const&); @@ -139,6 +148,7 @@ namespace unordered // Assign +#if defined(BOOST_UNORDERED_USE_MOVE) unordered_map& operator=(BOOST_COPY_ASSIGN_REF(unordered_map) x) { table_.assign(x.table_); @@ -150,6 +160,21 @@ namespace unordered table_.move_assign(x.table_); return *this; } +#else + unordered_map& operator=(unordered_map const& x) + { + table_.assign(x.table_); + return *this; + } + +#if !defined(BOOST_NO_RVALUE_REFERENCES) + unordered_map& operator=(unordered_map&& x) + { + table_.move_assign(x.table_); + return *this; + } +#endif +#endif #if !defined(BOOST_NO_0X_HDR_INITIALIZER_LIST) unordered_map& operator=(std::initializer_list); @@ -501,8 +526,9 @@ namespace unordered template class unordered_multimap { +#if defined(BOOST_UNORDERED_USE_MOVE) BOOST_COPYABLE_AND_MOVABLE(unordered_multimap) - +#endif public: typedef K key_type; @@ -575,10 +601,17 @@ namespace unordered unordered_multimap(unordered_multimap const&, allocator_type const&); +#if defined(BOOST_UNORDERED_USE_MOVE) unordered_multimap(BOOST_RV_REF(unordered_multimap) other) : table_(other.table_, boost::unordered::detail::move_tag()) { } +#elif !defined(BOOST_NO_RVALUE_REFERENCES) + unordered_multimap(unordered_multimap&& other) + : table_(other.table_, boost::unordered::detail::move_tag()) + { + } +#endif #if !defined(BOOST_NO_RVALUE_REFERENCES) unordered_multimap(unordered_multimap&&, allocator_type const&); @@ -599,6 +632,7 @@ namespace unordered // Assign +#if defined(BOOST_UNORDERED_USE_MOVE) unordered_multimap& operator=( BOOST_COPY_ASSIGN_REF(unordered_multimap) x) { @@ -611,6 +645,21 @@ namespace unordered table_.move_assign(x.table_); return *this; } +#else + unordered_multimap& operator=(unordered_multimap const& x) + { + table_.assign(x.table_); + return *this; + } + +#if !defined(BOOST_NO_RVALUE_REFERENCES) + unordered_multimap& operator=(unordered_multimap&& x) + { + table_.move_assign(x.table_); + return *this; + } +#endif +#endif #if !defined(BOOST_NO_0X_HDR_INITIALIZER_LIST) unordered_multimap& operator=(std::initializer_list); diff --git a/include/boost/unordered/unordered_set.hpp b/include/boost/unordered/unordered_set.hpp index f23ea74f..a0da2093 100644 --- a/include/boost/unordered/unordered_set.hpp +++ b/include/boost/unordered/unordered_set.hpp @@ -41,7 +41,9 @@ namespace unordered template class unordered_set { +#if defined(BOOST_UNORDERED_USE_MOVE) BOOST_COPYABLE_AND_MOVABLE(unordered_set) +#endif public: typedef T key_type; @@ -113,10 +115,17 @@ namespace unordered unordered_set(unordered_set const&, allocator_type const&); +#if defined(BOOST_UNORDERED_USE_MOVE) unordered_set(BOOST_RV_REF(unordered_set) other) : table_(other.table_, boost::unordered::detail::move_tag()) { } +#elif !defined(BOOST_NO_RVALUE_REFERENCES) + unordered_set(unordered_set&& other) + : table_(other.table_, boost::unordered::detail::move_tag()) + { + } +#endif #if !defined(BOOST_NO_RVALUE_REFERENCES) unordered_set(unordered_set&&, allocator_type const&); @@ -137,6 +146,7 @@ namespace unordered // Assign +#if defined(BOOST_UNORDERED_USE_MOVE) unordered_set& operator=(BOOST_COPY_ASSIGN_REF(unordered_set) x) { table_.assign(x.table_); @@ -148,6 +158,21 @@ namespace unordered table_.move_assign(x.table_); return *this; } +#else + unordered_set& operator=(unordered_set const& x) + { + table_.assign(x.table_); + return *this; + } + +#if !defined(BOOST_NO_RVALUE_REFERENCES) + unordered_set& operator=(unordered_set&& x) + { + table_.move_assign(x.table_); + return *this; + } +#endif +#endif #if !defined(BOOST_NO_0X_HDR_INITIALIZER_LIST) unordered_set& operator=(std::initializer_list); @@ -486,7 +511,9 @@ namespace unordered template class unordered_multiset { +#if defined(BOOST_UNORDERED_USE_MOVE) BOOST_COPYABLE_AND_MOVABLE(unordered_multiset) +#endif public: typedef T key_type; @@ -558,10 +585,17 @@ namespace unordered unordered_multiset(unordered_multiset const&, allocator_type const&); +#if defined(BOOST_UNORDERED_USE_MOVE) unordered_multiset(BOOST_RV_REF(unordered_multiset) other) : table_(other.table_, boost::unordered::detail::move_tag()) { } +#elif !defined(BOOST_NO_RVALUE_REFERENCES) + unordered_multiset(unordered_multiset&& other) + : table_(other.table_, boost::unordered::detail::move_tag()) + { + } +#endif #if !defined(BOOST_NO_RVALUE_REFERENCES) unordered_multiset(unordered_multiset&&, allocator_type const&); @@ -582,6 +616,7 @@ namespace unordered // Assign +#if defined(BOOST_UNORDERED_USE_MOVE) unordered_multiset& operator=( BOOST_COPY_ASSIGN_REF(unordered_multiset) x) { @@ -594,6 +629,21 @@ namespace unordered table_.move_assign(x.table_); return *this; } +#else + unordered_multiset& operator=(unordered_multiset const& x) + { + table_.assign(x.table_); + return *this; + } + +#if !defined(BOOST_NO_RVALUE_REFERENCES) + unordered_multiset& operator=(unordered_multiset&& x) + { + table_.move_assign(x.table_); + return *this; + } +#endif +#endif #if !defined(BOOST_NO_0X_HDR_INITIALIZER_LIST) unordered_multiset& operator=(std::initializer_list); diff --git a/test/unordered/move_tests.cpp b/test/unordered/move_tests.cpp index 4ecbc6e4..ced30486 100644 --- a/test/unordered/move_tests.cpp +++ b/test/unordered/move_tests.cpp @@ -22,6 +22,11 @@ namespace move_tests { test::seed_t seed(98624); +#if defined(BOOST_UNORDERED_USE_MOVE) || !defined(BOOST_NO_RVALUE_REFERENCES) +#define BOOST_UNORDERED_TEST_MOVING 1 +#else +#define BOOST_UNORDERED_TEST_MOVING 0 +#endif template T empty(T*) { @@ -95,7 +100,7 @@ namespace move_tests test::object_count count; T y; y = create(v, count); -#if defined(BOOST_HAS_NRVO) +#if BOOST_UNORDERED_TEST_MOVING && defined(BOOST_HAS_NRVO) BOOST_TEST(count == test::global_object_count); #endif test::check_container(y, v); @@ -195,7 +200,10 @@ namespace move_tests BOOST_TEST(y.max_load_factor() == 2.0); #if defined(BOOST_HAS_NRVO) - if (allocator_type::is_propagate_on_move) { + if (BOOST_UNORDERED_TEST_MOVING ? + (bool) allocator_type::is_propagate_on_move : + (bool) allocator_type::is_propagate_on_assign) + { BOOST_TEST(test::equivalent(y.get_allocator(), al2)); } else { @@ -210,7 +218,9 @@ namespace move_tests T y(0, hf, eq, al1); y = create(v, count, hf, eq, al2, 0.5); #if defined(BOOST_HAS_NRVO) - if (allocator_type::is_propagate_on_move) { + if (BOOST_UNORDERED_TEST_MOVING && + allocator_type::is_propagate_on_move) + { BOOST_TEST(count == test::global_object_count); } #endif @@ -219,7 +229,10 @@ namespace move_tests BOOST_TEST(y.max_load_factor() == 0.5); #if defined(BOOST_HAS_NRVO) - if (allocator_type::is_propagate_on_move) { + if (BOOST_UNORDERED_TEST_MOVING ? + (bool) allocator_type::is_propagate_on_move : + (bool) allocator_type::is_propagate_on_assign) + { BOOST_TEST(test::equivalent(y.get_allocator(), al2)); } else { @@ -240,14 +253,19 @@ namespace move_tests test::object_count count = test::global_object_count; y = boost::move(x); - if (allocator_type::is_propagate_on_move) { + if (BOOST_UNORDERED_TEST_MOVING && + allocator_type::is_propagate_on_move) + { BOOST_TEST(count == test::global_object_count); } test::check_container(y, v); test::check_equivalent_keys(y); BOOST_TEST(y.max_load_factor() == 0.25); - if (allocator_type::is_propagate_on_move) { + if (BOOST_UNORDERED_TEST_MOVING ? + (bool) allocator_type::is_propagate_on_move : + (bool) allocator_type::is_propagate_on_assign) + { BOOST_TEST(test::equivalent(y.get_allocator(), al2)); } else { @@ -272,7 +290,9 @@ namespace move_tests test::object_count count2 = test::global_object_count; - if (allocator_type::is_propagate_on_move) { + if (BOOST_UNORDERED_TEST_MOVING && + allocator_type::is_propagate_on_move) + { BOOST_TEST(count1.instances == test::global_object_count.instances); BOOST_TEST(count2.constructions == @@ -283,7 +303,10 @@ namespace move_tests test::check_equivalent_keys(y); BOOST_TEST(y.max_load_factor() == 0.5); - if (allocator_type::is_propagate_on_move) { + if (BOOST_UNORDERED_TEST_MOVING ? + (bool) allocator_type::is_propagate_on_move : + (bool) allocator_type::is_propagate_on_assign) + { BOOST_TEST(test::equivalent(y.get_allocator(), al2)); } else {