diff --git a/include/boost/unordered/detail/buckets.hpp b/include/boost/unordered/detail/buckets.hpp index d44a9e98..4689b322 100644 --- a/include/boost/unordered/detail/buckets.hpp +++ b/include/boost/unordered/detail/buckets.hpp @@ -424,7 +424,7 @@ namespace boost { namespace unordered { namespace detail { //////////////////////////////////////////////////////////////////////////// // Node Constructors -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template inline void construct_impl(T*, void* address, Args&&... args) @@ -495,7 +495,7 @@ namespace boost { namespace unordered { namespace detail { ~node_constructor(); void construct_preamble(); -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template void construct(Args&&... args) { diff --git a/include/boost/unordered/detail/equivalent.hpp b/include/boost/unordered/detail/equivalent.hpp index 78ad2cc5..8c19ad99 100644 --- a/include/boost/unordered/detail/equivalent.hpp +++ b/include/boost/unordered/detail/equivalent.hpp @@ -200,7 +200,7 @@ namespace boost { namespace unordered { namespace detail { this->find_node(bucket_index, hash, k)); } -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template node_ptr emplace(Args&&... args) diff --git a/include/boost/unordered/detail/extract_key.hpp b/include/boost/unordered/detail/extract_key.hpp index 97c4f4d0..6ace2fb7 100644 --- a/include/boost/unordered/detail/extract_key.hpp +++ b/include/boost/unordered/detail/extract_key.hpp @@ -43,7 +43,7 @@ namespace detail { return no_key(); } -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template static no_key extract(Args const&...) { @@ -99,7 +99,7 @@ namespace detail { return v.first; } -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template static key_type const& extract(key_type const& k, Arg1 const&, Args const&...) diff --git a/include/boost/unordered/detail/unique.hpp b/include/boost/unordered/detail/unique.hpp index 894406cf..e115cdd3 100644 --- a/include/boost/unordered/detail/unique.hpp +++ b/include/boost/unordered/detail/unique.hpp @@ -186,7 +186,7 @@ namespace boost { namespace unordered { namespace detail { } -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template emplace_return emplace(Args&&... args) diff --git a/include/boost/unordered/detail/util.hpp b/include/boost/unordered/detail/util.hpp index f1ff6684..ff5460fa 100644 --- a/include/boost/unordered/detail/util.hpp +++ b/include/boost/unordered/detail/util.hpp @@ -41,9 +41,20 @@ #if !defined(BOOST_NO_RVALUE_REFERENCES) && \ !defined(BOOST_NO_VARIADIC_TEMPLATES) # if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION) - // STLport doesn't have std::forward. -# else -# define BOOST_UNORDERED_STD_FORWARD +# elif defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER) +# elif defined(_LIBCPP_VERSION) +# define BOOST_UNORDERED_STD_FORWARD_MOVE +# elif defined(__GLIBCPP__) || defined(__GLIBCXX__) +# if defined(__GLIBCXX__) && __GLIBCXX__ >= 20090804 +# define BOOST_UNORDERED_STD_FORWARD_MOVE +# endif +# elif defined(__STL_CONFIG_H) +# elif defined(__MSL_CPP__) +# elif defined(__IBMCPP__) +# elif defined(MSIPL_COMPILE_H) +# elif (defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER) + // Visual C++. A version check would be a good idea. +# define BOOST_UNORDERED_STD_FORWARD_MOVE # endif #endif @@ -51,7 +62,7 @@ #define BOOST_UNORDERED_EMPLACE_LIMIT 10 #endif -#if !defined(BOOST_UNORDERED_STD_FORWARD) +#if !defined(BOOST_UNORDERED_STD_FORWARD_MOVE) #include #include diff --git a/include/boost/unordered/unordered_map.hpp b/include/boost/unordered/unordered_map.hpp index b0bace5f..b7e09b89 100644 --- a/include/boost/unordered/unordered_map.hpp +++ b/include/boost/unordered/unordered_map.hpp @@ -216,7 +216,7 @@ namespace unordered // modifiers -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template std::pair emplace(Args&&...); template @@ -563,7 +563,7 @@ namespace unordered // modifiers -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template iterator emplace(Args&&...); template @@ -840,7 +840,7 @@ namespace unordered // modifiers -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template template std::pair::iterator, bool> @@ -1279,7 +1279,7 @@ namespace unordered // modifiers -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template template diff --git a/include/boost/unordered/unordered_set.hpp b/include/boost/unordered/unordered_set.hpp index de692749..e70e7e37 100644 --- a/include/boost/unordered/unordered_set.hpp +++ b/include/boost/unordered/unordered_set.hpp @@ -213,7 +213,7 @@ namespace unordered // modifiers -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template std::pair emplace(Args&&...); template @@ -540,7 +540,7 @@ namespace unordered // modifiers -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template iterator emplace(Args&&...); template @@ -805,7 +805,7 @@ namespace unordered // modifiers -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template template std::pair::iterator, bool> @@ -1190,7 +1190,7 @@ namespace unordered // modifiers -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template template diff --git a/test/objects/exception.hpp b/test/objects/exception.hpp index 22119e85..d3d6f133 100644 --- a/test/objects/exception.hpp +++ b/test/objects/exception.hpp @@ -347,7 +347,7 @@ namespace exception detail::tracker.track_construct((void*) p, sizeof(T), tag_); } -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template void construct(pointer p, Args&&... args) { UNORDERED_SCOPE(allocator::construct(pointer, Args&&...)) { UNORDERED_EPOINT("Mock allocator construct function."); diff --git a/test/objects/minimal.hpp b/test/objects/minimal.hpp index 1cd8a2d3..be740f55 100644 --- a/test/objects/minimal.hpp +++ b/test/objects/minimal.hpp @@ -280,7 +280,7 @@ namespace minimal void construct(pointer p, T const& t) { new((void*)p.ptr_) T(t); } -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template void construct(pointer p, Args&&... args) { new((void*)p.ptr_) T(std::forward(args)...); } diff --git a/test/objects/test.hpp b/test/objects/test.hpp index 44a241d2..ec1cff5c 100644 --- a/test/objects/test.hpp +++ b/test/objects/test.hpp @@ -273,7 +273,7 @@ namespace test new(p) T(t); } -#if defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template void construct(pointer p, Args&&... args) { detail::tracker.track_construct((void*) p, sizeof(T), tag_); new(p) T(std::forward(args)...); diff --git a/test/unordered/unnecessary_copy_tests.cpp b/test/unordered/unnecessary_copy_tests.cpp index b67c320d..73da7d50 100644 --- a/test/unordered/unnecessary_copy_tests.cpp +++ b/test/unordered/unnecessary_copy_tests.cpp @@ -143,7 +143,7 @@ namespace unnecessary_copy_tests reset(); T x; x.emplace(source()); -#if !defined(BOOST_NO_RVALUE_REFERENCES) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) COPY_COUNT(1); #else COPY_COUNT(2); @@ -155,7 +155,7 @@ namespace unnecessary_copy_tests UNORDERED_TEST(unnecessary_copy_emplace_rvalue_test, ((set)(multiset)(map)(multimap))) -#if !defined(BOOST_NO_RVALUE_REFERENCES) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) template void unnecessary_copy_emplace_move_test(T*) { @@ -193,7 +193,7 @@ namespace unnecessary_copy_tests BOOST_DEDUCED_TYPENAME T::value_type a; COPY_COUNT(1); MOVE_COUNT(0); x.emplace(boost::move(a)); -#if !defined(BOOST_NO_RVALUE_REFERENCES) +#if defined(BOOST_NO_RVALUE_REFERENCES) COPY_COUNT(1); MOVE_COUNT(1); #else COPY_COUNT(2); MOVE_COUNT(0); @@ -219,7 +219,7 @@ namespace unnecessary_copy_tests // the existing element. reset(); x.emplace(); -#if !defined(BOOST_UNORDERED_STD_FORWARD) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) // TODO: I think that in this case the move could be delayed until // after checking for a collision, giving MOVE_COUNT(0). COPY_COUNT(1); MOVE_COUNT(1); @@ -243,7 +243,7 @@ namespace unnecessary_copy_tests x.emplace(source()); COPY_COUNT(1); MOVE_COUNT(0); -#if !defined(BOOST_NO_RVALUE_REFERENCES) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) // No move should take place. reset(); x.emplace(std::move(a)); @@ -315,7 +315,7 @@ namespace unnecessary_copy_tests //x.emplace(a_ref); //COPY_COUNT(0); MOVE_COUNT(0); -#if !defined(BOOST_NO_RVALUE_REFERENCES) +#if defined(BOOST_UNORDERED_STD_FORWARD_MOVE) // No move should take place. // (since a is already in the container) reset();