blob: 2eee2cbc2d509520afb9dac17154049909fecea7 [file] [log] [blame]
Howard Hinnant54da3382010-08-30 18:46:21 +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 Hinnant54da3382010-08-30 18:46:21 +00007//
8//===----------------------------------------------------------------------===//
Jonathan Roelofs8d86b2e2014-09-05 19:45:05 +00009//
10// UNSUPPORTED: libcpp-has-no-threads
Howard Hinnant54da3382010-08-30 18:46:21 +000011
12// <future>
13
14// class packaged_task<R(ArgTypes...)>
15
16// template <class F>
17// explicit packaged_task(F&& f);
18
19#include <future>
20#include <cassert>
21
22class A
23{
24 long data_;
25
26public:
27 static int n_moves;
28 static int n_copies;
29
30 explicit A(long i) : data_(i) {}
31 A(A&& a) : data_(a.data_) {++n_moves; a.data_ = -1;}
32 A(const A& a) : data_(a.data_) {++n_copies;}
33
34 long operator()(long i, long j) const {return data_ + i + j;}
35};
36
37int A::n_moves = 0;
38int A::n_copies = 0;
39
Marshall Clowf1264e72014-04-07 13:32:26 +000040int func(int i) { return i; }
41
Howard Hinnant54da3382010-08-30 18:46:21 +000042int main()
43{
44 {
45 std::packaged_task<double(int, char)> p(A(5));
Howard Hinnant7de47902010-11-30 20:23:32 +000046 assert(p.valid());
Howard Hinnant54da3382010-08-30 18:46:21 +000047 std::future<double> f = p.get_future();
48 p(3, 'a');
49 assert(f.get() == 105.0);
50 assert(A::n_copies == 0);
51 assert(A::n_moves > 0);
52 }
Howard Hinnant97ecd642011-05-17 19:12:55 +000053 A::n_copies = 0;
Howard Hinnant54da3382010-08-30 18:46:21 +000054 A::n_copies = 0;
55 {
56 A a(5);
57 std::packaged_task<double(int, char)> p(a);
Howard Hinnant7de47902010-11-30 20:23:32 +000058 assert(p.valid());
Howard Hinnant54da3382010-08-30 18:46:21 +000059 std::future<double> f = p.get_future();
60 p(3, 'a');
61 assert(f.get() == 105.0);
62 assert(A::n_copies > 0);
63 assert(A::n_moves > 0);
64 }
Marshall Clowf1264e72014-04-07 13:32:26 +000065 {
66 std::packaged_task<int(int)> p(&func);
67 assert(p.valid());
68 std::future<int> f = p.get_future();
69 p(4);
70 assert(f.get() == 4);
71 }
72 {
73 std::packaged_task<int(int)> p(func);
74 assert(p.valid());
75 std::future<int> f = p.get_future();
76 p(4);
77 assert(f.get() == 4);
78 }
Howard Hinnant54da3382010-08-30 18:46:21 +000079}