From 630ab2aae4ab4377f858d80302a3c0bbd26b8f79 Mon Sep 17 00:00:00 2001 From: Glen Fernandes Date: Sun, 8 Jul 2018 10:52:35 -0400 Subject: [PATCH] Workaround MSVC10 and MSVC11 for exchange --- include/boost/core/exchange.hpp | 52 +++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 18 deletions(-) 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 */