blob: 1ed3e646813c39cab7410fdf45a157ba42ede74a [file] [log] [blame]
Howard Hinnantf39daa82010-08-28 21:01:06 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantf39daa82010-08-28 21:01:06 +00007//
8//===----------------------------------------------------------------------===//
Jonathan Roelofs8d86b2e2014-09-05 19:45:05 +00009//
10// UNSUPPORTED: libcpp-has-no-threads
Howard Hinnantf39daa82010-08-28 21:01:06 +000011
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
Dan Albert1d4a1ed2016-05-25 22:36:09 -070023#include "../test_allocator.h"
Howard Hinnantf39daa82010-08-28 21:01:06 +000024
25int main()
26{
Dan Albert1d4a1ed2016-05-25 22:36:09 -070027 assert(test_alloc_base::count == 0);
Howard Hinnantf39daa82010-08-28 21:01:06 +000028 {
29 std::promise<int> p0(std::allocator_arg, test_allocator<int>());
30 std::promise<int> p(std::allocator_arg, test_allocator<int>());
Dan Albert1d4a1ed2016-05-25 22:36:09 -070031 assert(test_alloc_base::count == 2);
Howard Hinnantf39daa82010-08-28 21:01:06 +000032 p.swap(p0);
Dan Albert1d4a1ed2016-05-25 22:36:09 -070033 assert(test_alloc_base::count == 2);
Howard Hinnantf39daa82010-08-28 21:01:06 +000034 std::future<int> f = p.get_future();
Dan Albert1d4a1ed2016-05-25 22:36:09 -070035 assert(test_alloc_base::count == 2);
Howard Hinnantf39daa82010-08-28 21:01:06 +000036 assert(f.valid());
37 f = p0.get_future();
38 assert(f.valid());
Dan Albert1d4a1ed2016-05-25 22:36:09 -070039 assert(test_alloc_base::count == 2);
Howard Hinnantf39daa82010-08-28 21:01:06 +000040 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -070041 assert(test_alloc_base::count == 0);
Howard Hinnantf39daa82010-08-28 21:01:06 +000042 {
43 std::promise<int> p0(std::allocator_arg, test_allocator<int>());
44 std::promise<int> p(std::allocator_arg, test_allocator<int>());
Dan Albert1d4a1ed2016-05-25 22:36:09 -070045 assert(test_alloc_base::count == 2);
Howard Hinnantf39daa82010-08-28 21:01:06 +000046 swap(p, p0);
Dan Albert1d4a1ed2016-05-25 22:36:09 -070047 assert(test_alloc_base::count == 2);
Howard Hinnantf39daa82010-08-28 21:01:06 +000048 std::future<int> f = p.get_future();
Dan Albert1d4a1ed2016-05-25 22:36:09 -070049 assert(test_alloc_base::count == 2);
Howard Hinnantf39daa82010-08-28 21:01:06 +000050 assert(f.valid());
51 f = p0.get_future();
52 assert(f.valid());
Dan Albert1d4a1ed2016-05-25 22:36:09 -070053 assert(test_alloc_base::count == 2);
Howard Hinnantf39daa82010-08-28 21:01:06 +000054 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -070055 assert(test_alloc_base::count == 0);
Howard Hinnantf39daa82010-08-28 21:01:06 +000056 {
57 std::promise<int> p0(std::allocator_arg, test_allocator<int>());
58 std::promise<int> p;
Dan Albert1d4a1ed2016-05-25 22:36:09 -070059 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000060 p.swap(p0);
Dan Albert1d4a1ed2016-05-25 22:36:09 -070061 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000062 std::future<int> f = p.get_future();
Dan Albert1d4a1ed2016-05-25 22:36:09 -070063 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000064 assert(f.valid());
65 f = p0.get_future();
66 assert(f.valid());
Dan Albert1d4a1ed2016-05-25 22:36:09 -070067 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000068 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -070069 assert(test_alloc_base::count == 0);
Howard Hinnantf39daa82010-08-28 21:01:06 +000070 {
71 std::promise<int> p0(std::allocator_arg, test_allocator<int>());
72 std::promise<int> p;
Dan Albert1d4a1ed2016-05-25 22:36:09 -070073 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000074 swap(p, p0);
Dan Albert1d4a1ed2016-05-25 22:36:09 -070075 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000076 std::future<int> f = p.get_future();
Dan Albert1d4a1ed2016-05-25 22:36:09 -070077 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000078 assert(f.valid());
79 f = p0.get_future();
80 assert(f.valid());
Dan Albert1d4a1ed2016-05-25 22:36:09 -070081 assert(test_alloc_base::count == 1);
Howard Hinnantf39daa82010-08-28 21:01:06 +000082 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -070083 assert(test_alloc_base::count == 0);
Howard Hinnantf39daa82010-08-28 21:01:06 +000084}