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 10a3eac518e64aa0230894e4dde26c3f9714609e64Asiri Rathnayake// UNSUPPORTED: c++98, c++03, c++11 115b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow// <utility> 12e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow 13e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow// exchange 14e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow 155b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow// template<class T, class U=T> 165b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow// constexpr T // constexpr after C++17 175b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow// exchange(T& obj, U&& new_value); 185b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow 19e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow#include <utility> 20e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow#include <cassert> 21e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow#include <string> 22e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow 235b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow#include "test_macros.h" 245b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow 255b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow#if TEST_STD_VER > 17 265b12e3bdb43ac545206501fae955b37cef0c7475Marshall ClowTEST_CONSTEXPR bool test_constexpr() { 275b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow int v = 12; 285b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow 295b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow if (12 != std::exchange(v,23) || v != 23) 305b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow return false; 315b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow 325b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow if (23 != std::exchange(v,static_cast<short>(67)) || v != 67) 335b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow return false; 345b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow 355b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow if (67 != std::exchange<int, short>(v, {}) || v != 0) 365b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow return false; 375b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow return true; 385b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow } 395b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow#endif 405b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow 415b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow 425b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow 43e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clowint main() 44e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow{ 45171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant { 46171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant int v = 12; 47171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( std::exchange ( v, 23 ) == 12 ); 48171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( v == 23 ); 493e541a6172e39ead4fad233ec02c1898c006a0acStephan T. Lavavej assert ( std::exchange ( v, static_cast<short>(67) ) == 23 ); 5037c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow assert ( v == 67 ); 5137c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow 523e541a6172e39ead4fad233ec02c1898c006a0acStephan T. Lavavej assert ((std::exchange<int, short> ( v, {} )) == 67 ); 5337c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow assert ( v == 0 ); 5484acb1ec3f7d5e0f37d7176697c2fa876c413407Eric Fiselier 55171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant } 56e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow 57171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant { 58171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant bool b = false; 59171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( !std::exchange ( b, true )); 60171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( b ); 61171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant } 62e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow 63171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant { 64171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant const std::string s1 ( "Hi Mom!" ); 65171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant const std::string s2 ( "Yo Dad!" ); 66171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant std::string s3 = s1; // Mom 67171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( std::exchange ( s3, s2 ) == s1 ); 68171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( s3 == s2 ); 69171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( std::exchange ( s3, "Hi Mom!" ) == s2 ); 70171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( s3 == s1 ); 7137c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow 7237c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow s3 = s2; // Dad 7337c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow assert ( std::exchange ( s3, {} ) == s2 ); 7437c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow assert ( s3.size () == 0 ); 7584acb1ec3f7d5e0f37d7176697c2fa876c413407Eric Fiselier 7637c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow s3 = s2; // Dad 7737c17ed07dcecce46a7aceaa6991d85c8e72e3ecMarshall Clow assert ( std::exchange ( s3, "" ) == s2 ); 78171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant assert ( s3.size () == 0 ); 79171771a9f5fd9e5dbbc6d6a2d9dfb0d8532b5155Howard Hinnant } 805b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow 815b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow#if TEST_STD_VER > 17 825b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow static_assert(test_constexpr()); 835b12e3bdb43ac545206501fae955b37cef0c7475Marshall Clow#endif 84e2735d1df071b4854e577c227fe9d72b5de2b94eMarshall Clow} 85