xref: /llvm-project/libcxx/test/std/thread/futures/futures.promise/swap.pass.cpp (revision a7f9895cc18995549c7facb96e72718da282a864)
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // UNSUPPORTED: no-threads
10 // UNSUPPORTED: c++03
11 
12 // <future>
13 
14 // class promise<R>
15 
16 // void swap(promise& other);
17 
18 // template <class R> void swap(promise<R>& x, promise<R>& y);
19 
20 #include <future>
21 #include <cassert>
22 
23 #include "test_macros.h"
24 #include "test_allocator.h"
25 
main(int,char **)26 int main(int, char**)
27 {
28     test_allocator_statistics alloc_stats;
29     assert(alloc_stats.alloc_count == 0);
30     {
31         std::promise<int> p0(std::allocator_arg, test_allocator<int>(&alloc_stats));
32         std::promise<int> p(std::allocator_arg, test_allocator<int>(&alloc_stats));
33         assert(alloc_stats.alloc_count == 2);
34         p.swap(p0);
35         assert(alloc_stats.alloc_count == 2);
36         std::future<int> f = p.get_future();
37         assert(alloc_stats.alloc_count == 2);
38         assert(f.valid());
39         f = p0.get_future();
40         assert(f.valid());
41         assert(alloc_stats.alloc_count == 2);
42     }
43     assert(alloc_stats.alloc_count == 0);
44     {
45         std::promise<int> p0(std::allocator_arg, test_allocator<int>(&alloc_stats));
46         std::promise<int> p(std::allocator_arg, test_allocator<int>(&alloc_stats));
47         assert(alloc_stats.alloc_count == 2);
48         swap(p, p0);
49         assert(alloc_stats.alloc_count == 2);
50         std::future<int> f = p.get_future();
51         assert(alloc_stats.alloc_count == 2);
52         assert(f.valid());
53         f = p0.get_future();
54         assert(f.valid());
55         assert(alloc_stats.alloc_count == 2);
56     }
57     assert(alloc_stats.alloc_count == 0);
58     {
59         std::promise<int> p0(std::allocator_arg, test_allocator<int>(&alloc_stats));
60         std::promise<int> p;
61         assert(alloc_stats.alloc_count == 1);
62         p.swap(p0);
63         assert(alloc_stats.alloc_count == 1);
64         std::future<int> f = p.get_future();
65         assert(alloc_stats.alloc_count == 1);
66         assert(f.valid());
67         f = p0.get_future();
68         assert(f.valid());
69         assert(alloc_stats.alloc_count == 1);
70     }
71     assert(alloc_stats.alloc_count == 0);
72     {
73         std::promise<int> p0(std::allocator_arg, test_allocator<int>(&alloc_stats));
74         std::promise<int> p;
75         assert(alloc_stats.alloc_count == 1);
76         swap(p, p0);
77         assert(alloc_stats.alloc_count == 1);
78         std::future<int> f = p.get_future();
79         assert(alloc_stats.alloc_count == 1);
80         assert(f.valid());
81         f = p0.get_future();
82         assert(f.valid());
83         assert(alloc_stats.alloc_count == 1);
84     }
85     assert(alloc_stats.alloc_count == 0);
86 
87   return 0;
88 }
89