1//===----------------------------------------------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// <future>
11
12// class promise<R>
13
14// void swap(promise& other);
15
16// template <class R> void swap(promise<R>& x, promise<R>& y);
17
18#include <future>
19#include <cassert>
20
21#include "../test_allocator.h"
22
23int main()
24{
25    assert(test_alloc_base::count == 0);
26    {
27        std::promise<int> p0(std::allocator_arg, test_allocator<int>());
28        std::promise<int> p(std::allocator_arg, test_allocator<int>());
29        assert(test_alloc_base::count == 2);
30        p.swap(p0);
31        assert(test_alloc_base::count == 2);
32        std::future<int> f = p.get_future();
33        assert(test_alloc_base::count == 2);
34        assert(f.valid());
35        f = p0.get_future();
36        assert(f.valid());
37        assert(test_alloc_base::count == 2);
38    }
39    assert(test_alloc_base::count == 0);
40    {
41        std::promise<int> p0(std::allocator_arg, test_allocator<int>());
42        std::promise<int> p(std::allocator_arg, test_allocator<int>());
43        assert(test_alloc_base::count == 2);
44        swap(p, p0);
45        assert(test_alloc_base::count == 2);
46        std::future<int> f = p.get_future();
47        assert(test_alloc_base::count == 2);
48        assert(f.valid());
49        f = p0.get_future();
50        assert(f.valid());
51        assert(test_alloc_base::count == 2);
52    }
53    assert(test_alloc_base::count == 0);
54    {
55        std::promise<int> p0(std::allocator_arg, test_allocator<int>());
56        std::promise<int> p;
57        assert(test_alloc_base::count == 1);
58        p.swap(p0);
59        assert(test_alloc_base::count == 1);
60        std::future<int> f = p.get_future();
61        assert(test_alloc_base::count == 1);
62        assert(f.valid());
63        f = p0.get_future();
64        assert(f.valid());
65        assert(test_alloc_base::count == 1);
66    }
67    assert(test_alloc_base::count == 0);
68    {
69        std::promise<int> p0(std::allocator_arg, test_allocator<int>());
70        std::promise<int> p;
71        assert(test_alloc_base::count == 1);
72        swap(p, p0);
73        assert(test_alloc_base::count == 1);
74        std::future<int> f = p.get_future();
75        assert(test_alloc_base::count == 1);
76        assert(f.valid());
77        f = p0.get_future();
78        assert(f.valid());
79        assert(test_alloc_base::count == 1);
80    }
81    assert(test_alloc_base::count == 0);
82}
83