1
0
forked from boostorg/core

Implement boost::exchange

This commit is contained in:
Glen Fernandes
2018-07-07 23:13:03 -04:00
parent 9445d08ea7
commit 2cd4753a02
4 changed files with 188 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
/*
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 <utility>
#endif
namespace boost {
#if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
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;
}
#else
namespace detail {
template<class T>
struct exchanger {
typedef T type;
};
} /* detail */
template<class T>
inline T exchange(T& t, const typename detail::exchanger<T>::type& u)
{
T v = t;
t = u;
return v;
}
#endif
} /* boost */
#endif