blob: 21c946981a2820bad1990b7dbfe6a18134518bf7 [file] [log] [blame]
Howard Hinnant8759d9d2010-08-28 21:01:06 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Howard Hinnant412dbeb2010-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 Hinnant8759d9d2010-08-28 21:01:06 +00007//
8//===----------------------------------------------------------------------===//
Jonathan Roelofsb3fcc672014-09-05 19:45:05 +00009//
10// UNSUPPORTED: libcpp-has-no-threads
Eric Fiseliercb38f752015-08-28 05:06:04 +000011// UNSUPPORTED: c++98, c++03
Howard Hinnant8759d9d2010-08-28 21:01:06 +000012
13// <future>
14
15// class promise<R>
16
17// void swap(promise& other);
18
19// template <class R> void swap(promise<R>& x, promise<R>& y);
20
21#include <future>
22#include <cassert>
23
Eric Fiseliercb38f752015-08-28 05:06:04 +000024#include "test_allocator.h"
Howard Hinnant8759d9d2010-08-28 21:01:06 +000025
26int main()
27{
Eric Fiseliercb38f752015-08-28 05:06:04 +000028 assert(test_alloc_base::alloc_count == 0);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000029 {
30 std::promise<int> p0(std::allocator_arg, test_allocator<int>());
31 std::promise<int> p(std::allocator_arg, test_allocator<int>());
Eric Fiseliercb38f752015-08-28 05:06:04 +000032 assert(test_alloc_base::alloc_count == 2);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000033 p.swap(p0);
Eric Fiseliercb38f752015-08-28 05:06:04 +000034 assert(test_alloc_base::alloc_count == 2);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000035 std::future<int> f = p.get_future();
Eric Fiseliercb38f752015-08-28 05:06:04 +000036 assert(test_alloc_base::alloc_count == 2);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000037 assert(f.valid());
38 f = p0.get_future();
39 assert(f.valid());
Eric Fiseliercb38f752015-08-28 05:06:04 +000040 assert(test_alloc_base::alloc_count == 2);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000041 }
Eric Fiseliercb38f752015-08-28 05:06:04 +000042 assert(test_alloc_base::alloc_count == 0);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000043 {
44 std::promise<int> p0(std::allocator_arg, test_allocator<int>());
45 std::promise<int> p(std::allocator_arg, test_allocator<int>());
Eric Fiseliercb38f752015-08-28 05:06:04 +000046 assert(test_alloc_base::alloc_count == 2);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000047 swap(p, p0);
Eric Fiseliercb38f752015-08-28 05:06:04 +000048 assert(test_alloc_base::alloc_count == 2);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000049 std::future<int> f = p.get_future();
Eric Fiseliercb38f752015-08-28 05:06:04 +000050 assert(test_alloc_base::alloc_count == 2);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000051 assert(f.valid());
52 f = p0.get_future();
53 assert(f.valid());
Eric Fiseliercb38f752015-08-28 05:06:04 +000054 assert(test_alloc_base::alloc_count == 2);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000055 }
Eric Fiseliercb38f752015-08-28 05:06:04 +000056 assert(test_alloc_base::alloc_count == 0);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000057 {
58 std::promise<int> p0(std::allocator_arg, test_allocator<int>());
59 std::promise<int> p;
Eric Fiseliercb38f752015-08-28 05:06:04 +000060 assert(test_alloc_base::alloc_count == 1);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000061 p.swap(p0);
Eric Fiseliercb38f752015-08-28 05:06:04 +000062 assert(test_alloc_base::alloc_count == 1);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000063 std::future<int> f = p.get_future();
Eric Fiseliercb38f752015-08-28 05:06:04 +000064 assert(test_alloc_base::alloc_count == 1);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000065 assert(f.valid());
66 f = p0.get_future();
67 assert(f.valid());
Eric Fiseliercb38f752015-08-28 05:06:04 +000068 assert(test_alloc_base::alloc_count == 1);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000069 }
Eric Fiseliercb38f752015-08-28 05:06:04 +000070 assert(test_alloc_base::alloc_count == 0);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000071 {
72 std::promise<int> p0(std::allocator_arg, test_allocator<int>());
73 std::promise<int> p;
Eric Fiseliercb38f752015-08-28 05:06:04 +000074 assert(test_alloc_base::alloc_count == 1);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000075 swap(p, p0);
Eric Fiseliercb38f752015-08-28 05:06:04 +000076 assert(test_alloc_base::alloc_count == 1);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000077 std::future<int> f = p.get_future();
Eric Fiseliercb38f752015-08-28 05:06:04 +000078 assert(test_alloc_base::alloc_count == 1);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000079 assert(f.valid());
80 f = p0.get_future();
81 assert(f.valid());
Eric Fiseliercb38f752015-08-28 05:06:04 +000082 assert(test_alloc_base::alloc_count == 1);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000083 }
Eric Fiseliercb38f752015-08-28 05:06:04 +000084 assert(test_alloc_base::alloc_count == 0);
Howard Hinnant8759d9d2010-08-28 21:01:06 +000085}