diff --git a/include/boost/core/exchange.hpp b/include/boost/core/exchange.hpp index c31f2af..89d95fe 100644 --- a/include/boost/core/exchange.hpp +++ b/include/boost/core/exchange.hpp @@ -10,12 +10,45 @@ Distributed under the Boost Software License, Version 1.0. #include #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) +#include #include #endif namespace boost { +namespace detail { -#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) +template +struct exchange_type { + typedef T type; +}; + +} /* detail */ + +#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) +template +inline T exchange(T& t, const typename detail::exchange_type::type& u) +{ + T v = t; + t = u; + return v; +} +#elif BOOST_WORKAROUND(BOOST_MSVC, < 1800) +template +inline T exchange(T& t, const typename detail::exchange_type::type& u) +{ + T v = std::move(t); + t = u; + return v; +} + +template +inline T exchange(T& t, typename detail::exchange_type::type&& u) +{ + T v = std::move(t); + t = std::move(u); + return v; +} +#else template BOOST_CXX14_CONSTEXPR inline T exchange(T& t, U&& u) { @@ -23,23 +56,6 @@ BOOST_CXX14_CONSTEXPR inline T exchange(T& t, U&& u) t = std::forward(u); return v; } -#else -namespace detail { - -template -struct exchanger { - typedef T type; -}; - -} /* detail */ - -template -inline T exchange(T& t, const typename detail::exchanger::type& u) -{ - T v = t; - t = u; - return v; -} #endif } /* boost */