Implement n3668 - std::exchange

llvm-svn: 185863
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: a7b0e5ddf88ce3072f76f67a825a591b1c6809b6
diff --git a/include/utility b/include/utility
index ba65649..a2cafbf 100644
--- a/include/utility
+++ b/include/utility
@@ -138,6 +138,8 @@
 template<class... T>
   using index_sequence_for = make_index_sequence<sizeof...(T)>;
 
+template<class T, class U=T> 
+    T exchange(T& obj, U&& new_value);
 }  // std
 
 */
@@ -685,6 +687,17 @@
   
 #endif  // _LIBCPP_STD_VER > 11
 
+#if _LIBCPP_STD_VER > 11
+template<class _T1, class _T2 = _T1>
+_LIBCPP_INLINE_VISIBILITY inline
+_T1 exchange(_T1& __obj, _T2 && __new_value)
+{
+	_T1 __old_value = _VSTD::move(__obj);
+	__obj = _VSTD::forward<_T2>(__new_value);
+	return __old_value;
+}	
+#endif  // _LIBCPP_STD_VER > 11
+
 _LIBCPP_END_NAMESPACE_STD
 
 #endif  // _LIBCPP_UTILITY