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