xref: /llvm-project/libcxx/test/std/experimental/memory/memory.observer.ptr/swap.pass.cpp (revision 7a62bee611f1c451fa026c146b03a3a277a5a1dd)
1*7a62bee6SZoe Carver // -*- C++ -*-
2*7a62bee6SZoe Carver //===----------------------------------------------------------------------===//
3*7a62bee6SZoe Carver //
4*7a62bee6SZoe Carver // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*7a62bee6SZoe Carver // See https://llvm.org/LICENSE.txt for license information.
6*7a62bee6SZoe Carver // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*7a62bee6SZoe Carver //
8*7a62bee6SZoe Carver //===----------------------------------------------------------------------===//
9*7a62bee6SZoe Carver 
10*7a62bee6SZoe Carver // UNSUPPORTED: c++03, c++11, c++14
11*7a62bee6SZoe Carver // REQUIRES: c++experimental
12*7a62bee6SZoe Carver 
13*7a62bee6SZoe Carver // <experimental/memory>
14*7a62bee6SZoe Carver 
15*7a62bee6SZoe Carver // observer_ptr
16*7a62bee6SZoe Carver //
17*7a62bee6SZoe Carver // constexpr void swap(observer_ptr& other) noexcept;
18*7a62bee6SZoe Carver //
19*7a62bee6SZoe Carver // template <class W>
20*7a62bee6SZoe Carver // void swap(observer_ptr<W>& lhs, observer_ptr<W>& rhs) noexcept;
21*7a62bee6SZoe Carver 
22*7a62bee6SZoe Carver #include <experimental/memory>
23*7a62bee6SZoe Carver #include <type_traits>
24*7a62bee6SZoe Carver #include <cassert>
25*7a62bee6SZoe Carver 
26*7a62bee6SZoe Carver template <class T, class Object = T>
test_swap()27*7a62bee6SZoe Carver constexpr void test_swap() {
28*7a62bee6SZoe Carver   using Ptr = std::experimental::observer_ptr<T>;
29*7a62bee6SZoe Carver   Object obj1, obj2;
30*7a62bee6SZoe Carver 
31*7a62bee6SZoe Carver   {
32*7a62bee6SZoe Carver     Ptr ptr1(&obj1);
33*7a62bee6SZoe Carver     Ptr ptr2(&obj2);
34*7a62bee6SZoe Carver 
35*7a62bee6SZoe Carver     assert(ptr1.get() == &obj1);
36*7a62bee6SZoe Carver     assert(ptr2.get() == &obj2);
37*7a62bee6SZoe Carver 
38*7a62bee6SZoe Carver     ptr1.swap(ptr2);
39*7a62bee6SZoe Carver 
40*7a62bee6SZoe Carver     assert(ptr1.get() == &obj2);
41*7a62bee6SZoe Carver     assert(ptr2.get() == &obj1);
42*7a62bee6SZoe Carver 
43*7a62bee6SZoe Carver     static_assert(noexcept(ptr1.swap(ptr2)));
44*7a62bee6SZoe Carver     static_assert(std::is_same<decltype(ptr1.swap(ptr2)), void>::value);
45*7a62bee6SZoe Carver   }
46*7a62bee6SZoe Carver 
47*7a62bee6SZoe Carver   {
48*7a62bee6SZoe Carver     Ptr ptr1(&obj1);
49*7a62bee6SZoe Carver     Ptr ptr2(&obj2);
50*7a62bee6SZoe Carver 
51*7a62bee6SZoe Carver     assert(ptr1.get() == &obj1);
52*7a62bee6SZoe Carver     assert(ptr2.get() == &obj2);
53*7a62bee6SZoe Carver 
54*7a62bee6SZoe Carver     std::experimental::swap(ptr1, ptr2);
55*7a62bee6SZoe Carver 
56*7a62bee6SZoe Carver     assert(ptr1.get() == &obj2);
57*7a62bee6SZoe Carver     assert(ptr2.get() == &obj1);
58*7a62bee6SZoe Carver 
59*7a62bee6SZoe Carver     static_assert(noexcept(std::experimental::swap(ptr1, ptr2)));
60*7a62bee6SZoe Carver     static_assert(std::is_same<decltype(std::experimental::swap(ptr1, ptr2)), void>::value);
61*7a62bee6SZoe Carver   }
62*7a62bee6SZoe Carver }
63*7a62bee6SZoe Carver 
64*7a62bee6SZoe Carver struct Bar {};
65*7a62bee6SZoe Carver 
test()66*7a62bee6SZoe Carver constexpr bool test() {
67*7a62bee6SZoe Carver   test_swap<Bar>();
68*7a62bee6SZoe Carver   test_swap<int>();
69*7a62bee6SZoe Carver   test_swap<void, int>();
70*7a62bee6SZoe Carver 
71*7a62bee6SZoe Carver   return true;
72*7a62bee6SZoe Carver }
73*7a62bee6SZoe Carver 
main(int,char **)74*7a62bee6SZoe Carver int main(int, char**) {
75*7a62bee6SZoe Carver   test();
76*7a62bee6SZoe Carver   static_assert(test());
77*7a62bee6SZoe Carver 
78*7a62bee6SZoe Carver   return 0;
79*7a62bee6SZoe Carver }
80