1e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow//===----------------------------------------------------------------------===// 2e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow// 3e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow// The LLVM Compiler Infrastructure 4e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow// 5e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow// This file is dual licensed under the MIT and the University of Illinois Open 6e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow// Source Licenses. See LICENSE.TXT for details. 7e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow// 8e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow//===----------------------------------------------------------------------===// 9e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow 10e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow// utilities 11e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow 12e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow// exchange 13e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow 14e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow#include <utility> 15e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow#include <cassert> 16e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow#include <string> 17e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow 18e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clowint main() 19e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow{ 20e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow#if _LIBCPP_STD_VER > 11 21171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant { 22171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant int v = 12; 23171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( std::exchange ( v, 23 ) == 12 ); 24171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( v == 23 ); 25171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( std::exchange ( v, 67.2 ) == 23 ); 2637c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow assert ( v == 67 ); 2737c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow 2837c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow assert ((std::exchange<int, float> ( v, {} )) == 67 ); 2937c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow assert ( v == 0 ); 3037c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow 31171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant } 32e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow 33171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant { 34171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant bool b = false; 35171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( !std::exchange ( b, true )); 36171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( b ); 37171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant } 38e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow 39171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant { 40171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant const std::string s1 ( "Hi Mom!" ); 41171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant const std::string s2 ( "Yo Dad!" ); 42171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant std::string s3 = s1; // Mom 43171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( std::exchange ( s3, s2 ) == s1 ); 44171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( s3 == s2 ); 45171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( std::exchange ( s3, "Hi Mom!" ) == s2 ); 46171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( s3 == s1 ); 4737c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow 4837c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow s3 = s2; // Dad 4937c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow assert ( std::exchange ( s3, {} ) == s2 ); 5037c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow assert ( s3.size () == 0 ); 5137c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow 5237c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow s3 = s2; // Dad 5337c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow assert ( std::exchange ( s3, "" ) == s2 ); 54171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( s3.size () == 0 ); 55171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant } 5637c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow 57e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow#endif 58e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow} 59