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