summaryrefslogtreecommitdiff
path: root/boost/core/exchange.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/core/exchange.hpp')
-rw-r--r--boost/core/exchange.hpp49
1 files changed, 49 insertions, 0 deletions
diff --git a/boost/core/exchange.hpp b/boost/core/exchange.hpp
new file mode 100644
index 0000000000..bc8a9fcd70
--- /dev/null
+++ b/boost/core/exchange.hpp
@@ -0,0 +1,49 @@
+/*
+Copyright 2018 Glen Joseph Fernandes
+(glenjofe@gmail.com)
+
+Distributed under the Boost Software License, Version 1.0.
+(http://www.boost.org/LICENSE_1_0.txt)
+*/
+#ifndef BOOST_CORE_EXCHANGE_HPP
+#define BOOST_CORE_EXCHANGE_HPP
+
+#include <boost/config.hpp>
+#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+#include <boost/config/workaround.hpp>
+#include <utility>
+#endif
+
+namespace boost {
+
+#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
+template<class T, class U>
+inline T exchange(T& t, const U& u)
+{
+ T v = t;
+ t = u;
+ return v;
+}
+#else
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1800)
+template<class T, class U>
+inline T exchange(T& t, U&& u)
+{
+ T v = std::move(t);
+ t = std::forward<U>(u);
+ return v;
+}
+#else
+template<class T, class U = T>
+BOOST_CXX14_CONSTEXPR inline T exchange(T& t, U&& u)
+{
+ T v = std::move(t);
+ t = std::forward<U>(u);
+ return v;
+}
+#endif
+#endif
+
+} /* boost */
+
+#endif