change support python version
[platform/upstream/boost.git] / libs / thread / test / sync / futures / when_all / variadic_pass.cpp
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 // Copyright (C) 2014 Vicente J. Botet Escriba
11 //
12 //  Distributed under the Boost Software License, Version 1.0. (See accompanying
13 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
14
15 // <boost/thread/future.hpp>
16
17 // template <class T, class Ts>
18 // future<tuple<T, Ts...>> when_all(T&&, Ts&& ...);
19
20 #include <boost/config.hpp>
21
22 #if ! defined  BOOST_NO_CXX11_DECLTYPE
23 #define BOOST_RESULT_OF_USE_DECLTYPE
24 #endif
25
26
27 #define BOOST_THREAD_VERSION 4
28
29 #include <boost/thread/future.hpp>
30 #include <boost/detail/lightweight_test.hpp>
31 #include <stdexcept>
32
33 #ifdef BOOST_MSVC
34 #pragma warning(disable: 4127) // conditional expression is constant
35 #endif
36
37 int p1()
38 {
39   boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
40   return 123;
41 }
42
43 int thr()
44 {
45   throw std::logic_error("123");
46 }
47 int p2()
48 {
49   boost::this_thread::sleep_for(boost::chrono::milliseconds(200));
50   return 321;
51 }
52
53 int main()
54 {
55 #if defined BOOST_THREAD_PROVIDES_FUTURE_WHEN_ALL_WHEN_ANY
56   if (0) // todo not yet implemented
57   { // invalid future copy-constructible
58     boost::future<int> f1;
59     boost::future<int> f2 = boost::make_ready_future(321);
60     BOOST_TEST(! f1.valid());
61     BOOST_TEST(f2.valid());
62     boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
63     BOOST_TEST(! f1.valid());
64     BOOST_TEST(! f2.valid());
65     BOOST_TEST(all.valid());
66     boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
67     BOOST_TEST(boost::csbl::get<0>(res).valid());
68     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
69     // has exception
70     //BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
71     BOOST_TEST(boost::csbl::get<1>(res).valid());
72     BOOST_TEST(boost::csbl::get<1>(res).is_ready());
73     BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
74   }
75   { // is_ready future copy-constructible
76     boost::future<int> f1 = boost::make_ready_future(123);
77     boost::future<int> f2 = boost::make_ready_future(321);
78     BOOST_TEST(f1.valid());
79     BOOST_TEST(f1.is_ready());
80     BOOST_TEST(f2.valid());
81     BOOST_TEST(f2.is_ready());
82     boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
83     BOOST_TEST(! f1.valid());
84     BOOST_TEST(! f2.valid());
85     BOOST_TEST(all.valid());
86     if (0) // todo FAILS not yet implemented
87     BOOST_TEST(all.is_ready());
88     boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
89     BOOST_TEST(boost::csbl::get<0>(res).valid());
90     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
91     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
92     BOOST_TEST(boost::csbl::get<1>(res).valid());
93     BOOST_TEST(boost::csbl::get<1>(res).is_ready());
94     BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
95   }
96   { // is_ready shared_future copy-constructible
97     boost::shared_future<int> f1 = boost::make_ready_future(123).share();
98     boost::shared_future<int> f2 = boost::make_ready_future(321).share();
99     BOOST_TEST(f1.valid());
100     BOOST_TEST(f1.is_ready());
101     BOOST_TEST(f2.valid());
102     BOOST_TEST(f2.is_ready());
103     boost::future<boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > > all = boost::when_all(f1, f2);
104     BOOST_TEST(f1.valid());
105     BOOST_TEST(f2.valid());
106     BOOST_TEST(all.valid());
107     if (0) // todo FAILS not yet implemented
108     BOOST_TEST(all.is_ready());
109     boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > res = all.get();
110     BOOST_TEST(boost::csbl::get<0>(res).valid());
111     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
112     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
113     BOOST_TEST(boost::csbl::get<1>(res).valid());
114     BOOST_TEST(boost::csbl::get<1>(res).is_ready());
115     BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
116   }
117   { // packaged_task future copy-constructible
118     boost::packaged_task<int()> pt1(&p1);
119     boost::future<int> f1 = pt1.get_future();
120     BOOST_TEST(f1.valid());
121     boost::packaged_task<int()> pt2(&p2);
122     boost::future<int> f2 = pt2.get_future();
123     BOOST_TEST(f2.valid());
124     boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
125     BOOST_TEST(! f1.valid());
126     BOOST_TEST(! f2.valid());
127     BOOST_TEST(all.valid());
128     pt1();
129     pt2();
130     boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
131     BOOST_TEST(boost::csbl::get<0>(res).valid());
132     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
133     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
134     BOOST_TEST(boost::csbl::get<1>(res).valid());
135     BOOST_TEST(boost::csbl::get<1>(res).is_ready());
136     BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
137   }
138   { // packaged_task future copy-constructible
139     boost::packaged_task<int()> pt1(&thr);
140     boost::future<int> f1 = pt1.get_future();
141     BOOST_TEST(f1.valid());
142     boost::packaged_task<int()> pt2(&p2);
143     boost::future<int> f2 = pt2.get_future();
144     BOOST_TEST(f2.valid());
145     boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
146     BOOST_TEST(! f1.valid());
147     BOOST_TEST(! f2.valid());
148     BOOST_TEST(all.valid());
149     pt1();
150     pt2();
151     boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
152     BOOST_TEST(boost::csbl::get<0>(res).valid());
153     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
154     try {
155       boost::csbl::get<0>(res).get();
156       BOOST_TEST(false);
157     } catch (std::logic_error& ex) {
158       BOOST_TEST(ex.what() == std::string("123"));
159     } catch (...) {
160       BOOST_TEST(false);
161     }
162     BOOST_TEST(boost::csbl::get<1>(res).valid());
163     BOOST_TEST(boost::csbl::get<1>(res).is_ready());
164     BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
165   }
166   { // packaged_task shared_future copy-constructible
167     boost::packaged_task<int()> pt1(&p1);
168     boost::shared_future<int> f1 = pt1.get_future().share();
169     BOOST_TEST(f1.valid());
170     boost::packaged_task<int()> pt2(&p2);
171     boost::shared_future<int> f2 = pt2.get_future().share();
172     BOOST_TEST(f2.valid());
173     boost::future<boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > > all = boost::when_all(f1, f2);
174     BOOST_TEST(f1.valid());
175     BOOST_TEST(f2.valid());
176     BOOST_TEST(all.valid());
177     BOOST_TEST(! all.is_ready());
178     pt1();
179     BOOST_TEST(! all.is_ready());
180     pt2();
181     boost::this_thread::sleep_for(boost::chrono::milliseconds(300));
182     BOOST_TEST(all.is_ready());
183     boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > res = all.get();
184     BOOST_TEST(boost::csbl::get<0>(res).valid());
185     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
186     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
187     BOOST_TEST(boost::csbl::get<1>(res).valid());
188     BOOST_TEST(boost::csbl::get<1>(res).is_ready());
189     BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
190   }
191   { // async future copy-constructible
192     boost::future<int> f1 = boost::async(boost::launch::async, &p1);
193     BOOST_TEST(f1.valid());
194     boost::future<int> f2 = boost::async(boost::launch::async, &p2);
195     BOOST_TEST(f2.valid());
196     boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
197     BOOST_TEST(! f1.valid());
198     BOOST_TEST(! f2.valid());
199     BOOST_TEST(all.valid());
200     boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
201     BOOST_TEST(boost::csbl::get<0>(res).valid());
202     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
203     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
204     BOOST_TEST(boost::csbl::get<1>(res).valid());
205     BOOST_TEST(boost::csbl::get<1>(res).is_ready());
206     BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
207   }
208   { // async shared_future copy-constructible
209     boost::shared_future<int> f1 = boost::async(boost::launch::async, &p1).share();
210     BOOST_TEST(f1.valid());
211     boost::shared_future<int> f2 = boost::async(boost::launch::async, &p2).share();
212     BOOST_TEST(f2.valid());
213     boost::future<boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > > all = boost::when_all(f1, f2);
214     BOOST_TEST(f1.valid());
215     BOOST_TEST(f2.valid());
216     BOOST_TEST(all.valid());
217     boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > res = all.get();
218     BOOST_TEST(boost::csbl::get<0>(res).valid());
219     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
220     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
221     BOOST_TEST(boost::csbl::get<1>(res).valid());
222     BOOST_TEST(boost::csbl::get<1>(res).is_ready());
223     BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
224   }
225   { // async future copy-constructible
226     boost::future<int> f1 = boost::async(boost::launch::async, &p1);
227     BOOST_TEST(f1.valid());
228     boost::future<int> f2 = boost::make_ready_future(321);
229     BOOST_TEST(f2.valid());
230     BOOST_TEST(f2.is_ready());
231     boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
232     BOOST_TEST(! f1.valid());
233     BOOST_TEST(! f2.valid());
234     BOOST_TEST(all.valid());
235     boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
236     BOOST_TEST(boost::csbl::get<0>(res).valid());
237     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
238     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
239     BOOST_TEST(boost::csbl::get<1>(res).valid());
240     BOOST_TEST(boost::csbl::get<1>(res).is_ready());
241     BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
242   }
243 #if defined BOOST_THREAD_PROVIDES_VARIADIC_THREAD
244   // fixme darwin-4.8.0_11 terminate called without an active exception
245   { // deferred future copy-constructible
246     boost::future<int> f1 = boost::async(boost::launch::deferred, &p1);
247     boost::future<int> f2 = boost::async(boost::launch::deferred, &p2);
248     boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
249     BOOST_TEST(! f1.valid());
250     BOOST_TEST(! f2.valid());
251     BOOST_TEST(all.valid());
252     boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
253     BOOST_TEST(boost::csbl::get<0>(res).valid());
254     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
255     BOOST_TEST(boost::csbl::get<1>(res).valid());
256     BOOST_TEST(boost::csbl::get<1>(res).is_ready());
257     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
258     BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
259   }
260   // fixme darwin-4.8.0_11 terminate called without an active exception
261   { // deferred shared_future copy-constructible
262     boost::shared_future<int> f1 = boost::async(boost::launch::deferred, &p1).share();
263     boost::shared_future<int> f2 = boost::async(boost::launch::deferred, &p2).share();
264     boost::future<boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > > all = boost::when_all(f1, f2);
265     BOOST_TEST(f1.valid());
266     BOOST_TEST(f2.valid());
267     BOOST_TEST(all.valid());
268     boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > res = all.get();
269     BOOST_TEST(boost::csbl::get<0>(res).valid());
270     BOOST_TEST(boost::csbl::get<0>(res).is_ready());
271     BOOST_TEST(boost::csbl::get<1>(res).valid());
272     BOOST_TEST(boost::csbl::get<1>(res).is_ready());
273     BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
274     BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
275   }
276 #endif
277 #if ! defined BOOST_NO_CXX11_LAMBDAS
278     { // async futures copy-constructible then()
279       boost::future<int> f1 = boost::async(boost::launch::async, &p1);
280       BOOST_TEST(f1.valid());
281       boost::future<int> f2 = boost::async(boost::launch::async, &p2);
282       BOOST_TEST(f2.valid());
283       boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
284       BOOST_TEST(! f1.valid());
285       BOOST_TEST(! f2.valid());
286       BOOST_TEST(all.valid());
287       boost::future<int> sum = all.then([](boost::future<boost::csbl::tuple<boost::future<int>, boost::future<int> > > f)
288       {
289         boost::csbl::tuple<boost::future<int>,boost::future<int> > v = f.get();
290         return boost::csbl::get<0>(v).get()+boost::csbl::get<1>(v).get();
291       });
292       BOOST_TEST(sum.valid());
293       BOOST_TEST(sum.get() == 444);
294     }
295 #endif
296 #endif
297
298   return boost::report_errors();
299 }
300