]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/thread/example/future_when_all.cpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / thread / example / future_when_all.cpp
1 // Copyright (C) 2012-2013 Vicente Botet
2 //
3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5
6 #include <boost/config.hpp>
7
8 #if ! defined BOOST_NO_CXX11_DECLTYPE
9 #define BOOST_RESULT_OF_USE_DECLTYPE
10 #endif
11
12
13 #define BOOST_THREAD_VERSION 4
14 //#define BOOST_THREAD_USES_LOG
15 #define BOOST_THREAD_USES_LOG_THREAD_ID
16
17 #include <boost/thread/future.hpp>
18 #include <boost/thread/csbl/vector.hpp>
19 #include <boost/assert.hpp>
20 #include <boost/thread/detail/log.hpp>
21 #include <string>
22 #if defined BOOST_THREAD_PROVIDES_FUTURE_WHEN_ALL_WHEN_ANY
23
24 int p1()
25 {
26 BOOST_THREAD_LOG
27 << "P1" << BOOST_THREAD_END_LOG;
28 boost::this_thread::sleep_for(boost::chrono::seconds(1));
29 return 123;
30 }
31 int p1b()
32 {
33 BOOST_THREAD_LOG
34 << "P1b" << BOOST_THREAD_END_LOG;
35 boost::this_thread::sleep_for(boost::chrono::seconds(1));
36 return 321;
37 }
38
39 int p2(boost::future<int> f)
40 {
41 BOOST_THREAD_LOG
42 << " P2 " << BOOST_THREAD_END_LOG;
43 try
44 {
45 return 2 * f.get();
46 }
47 catch (std::exception& ex)
48 {
49 BOOST_THREAD_LOG
50 << "ERRORRRRR " << ex.what() << "" << BOOST_THREAD_END_LOG;
51 BOOST_ASSERT(false);
52 }
53 catch (...)
54 {
55 BOOST_THREAD_LOG
56 << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
57 BOOST_ASSERT(false);
58 }
59 BOOST_THREAD_LOG
60 << "P2>" << BOOST_THREAD_END_LOG;
61 return 0;
62
63 }
64 int p2s(boost::shared_future<int> f)
65 {
66 BOOST_THREAD_LOG
67 << "<P2" << BOOST_THREAD_END_LOG;
68 try
69 {
70 return 2 * f.get();
71 }
72 catch (std::exception& ex)
73 {
74 BOOST_THREAD_LOG
75 << "ERRORRRRR " << ex.what() << "" << BOOST_THREAD_END_LOG;
76 BOOST_ASSERT(false);
77 }
78 catch (...)
79 {
80 BOOST_THREAD_LOG
81 << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
82 BOOST_ASSERT(false);
83 }
84 BOOST_THREAD_LOG
85 << "P2>" << BOOST_THREAD_END_LOG;
86 return 0;
87 }
88
89 int main()
90 {
91 BOOST_THREAD_LOG
92 << "<MAIN" << BOOST_THREAD_END_LOG;
93 {
94 try
95 {
96 {
97 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
98 boost::future<boost::csbl::tuple<> > all0 = boost::when_all();
99 BOOST_THREAD_LOG
100 << BOOST_THREAD_END_LOG;
101 }
102 {
103 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
104 boost::future<int> f1 = boost::async(boost::launch::async, &p1);
105 boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_all(boost::move(f1));
106 boost::csbl::tuple<boost::future<int> > res = all.get();
107 BOOST_THREAD_LOG
108 << boost::csbl::get<0>(res).get() <<" " << BOOST_THREAD_END_LOG;
109 }
110 #if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
111 {
112 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
113 boost::future<int> f1 = boost::async(boost::launch::deferred, &p1);
114 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
115 boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_all(boost::move(f1));
116 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
117 boost::csbl::tuple<boost::future<int> > res = all.get();
118 BOOST_THREAD_LOG
119 << boost::csbl::get<0>(res).get() <<" " << BOOST_THREAD_END_LOG;
120 }
121 #endif
122 {
123 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
124 boost::future<int> f1 = boost::make_ready_future(1);
125 boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_all(boost::move(f1));
126 boost::csbl::tuple<boost::future<int> > res = all.get();
127 BOOST_THREAD_LOG
128 << boost::csbl::get<0>(res).get() <<" " << BOOST_THREAD_END_LOG;
129 }
130 {
131 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
132 boost::future<int> f1 = boost::async(boost::launch::async, &p1);
133 boost::future<int> f2 = boost::async(boost::launch::async, &p1b);
134 boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
135 //(void) all.wait();
136 boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
137 BOOST_THREAD_LOG
138 << boost::csbl::get<0>(res).get() <<" " << BOOST_THREAD_END_LOG;
139 BOOST_THREAD_LOG
140 << boost::csbl::get<1>(res).get() <<" " << BOOST_THREAD_END_LOG;
141 }
142 {
143 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
144 boost::future<int> f1 = boost::async(boost::launch::async, &p1);
145 boost::future<std::string> f2 = boost::make_ready_future(std::string("nnnnnnn"));;
146 boost::future<boost::csbl::tuple<boost::future<int>, boost::future<std::string> > > all = boost::when_all(boost::move(f1), boost::move(f2));
147 //(void) all.wait();
148 boost::csbl::tuple<boost::future<int>, boost::future<std::string> > res = all.get();
149 BOOST_THREAD_LOG
150 << boost::csbl::get<0>(res).get() <<" " << BOOST_THREAD_END_LOG;
151 BOOST_THREAD_LOG
152 << boost::csbl::get<1>(res).get() <<" " << BOOST_THREAD_END_LOG;
153 }
154 {
155 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
156 boost::csbl::vector<boost::future<int> > v;
157 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
158 v.push_back(boost::async(boost::launch::async, &p1));
159 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
160 v.push_back(boost::async(boost::launch::async, &p1b));
161 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
162 boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(v.begin(), v.end());
163 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
164 boost::csbl::vector<boost::future<int> > res = all.get();
165 BOOST_THREAD_LOG
166 << res[0].get() <<" " << BOOST_THREAD_END_LOG;
167 BOOST_THREAD_LOG
168 << res[1].get() <<" " << BOOST_THREAD_END_LOG;
169 }
170 }
171 catch (std::exception& ex)
172 {
173 BOOST_THREAD_LOG
174 << "ERRORRRRR " << ex.what() << "" << BOOST_THREAD_END_LOG;
175 return 1;
176 }
177 catch (...)
178 {
179 BOOST_THREAD_LOG
180 << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
181 return 2;
182 }
183 }
184 {
185 try
186 {
187 {
188 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
189 boost::future<boost::csbl::tuple<> > all0 = boost::when_any();
190 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
191 }
192 {
193 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
194 boost::future<int> f1 = boost::async(boost::launch::async, &p1);
195 boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_any(boost::move(f1));
196 boost::csbl::tuple<boost::future<int> > res = all.get();
197 BOOST_THREAD_LOG
198 << boost::csbl::get<0>(res).get() <<" " << BOOST_THREAD_END_LOG;
199 }
200 #if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
201 {
202 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
203 boost::future<int> f1 = boost::async(boost::launch::deferred, &p1);
204 boost::future<boost::csbl::tuple<boost::future<int> > > all = boost::when_any(boost::move(f1));
205 boost::csbl::tuple<boost::future<int> > res = all.get();
206 BOOST_THREAD_LOG
207 << boost::csbl::get<0>(res).get() <<" " << BOOST_THREAD_END_LOG;
208 }
209 #endif
210 {
211 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
212 boost::future<int> f1 = boost::async(boost::launch::async, &p1);
213 boost::future<int> f2 = boost::async(boost::launch::async, &p1b);
214 boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_any(boost::move(f1), boost::move(f2));
215 boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
216 BOOST_THREAD_LOG
217 << boost::csbl::get<0>(res).get() <<" " << BOOST_THREAD_END_LOG;
218 BOOST_THREAD_LOG
219 << boost::csbl::get<1>(res).get() <<" " << BOOST_THREAD_END_LOG;
220 }
221 {
222 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
223 boost::future<int> f1 = boost::make_ready_future(1);
224 boost::future<int> f2 = boost::async(boost::launch::async, &p1b);
225 boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_any(boost::move(f1), boost::move(f2));
226 boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
227 BOOST_THREAD_LOG
228 << boost::csbl::get<0>(res).get() <<" " << BOOST_THREAD_END_LOG;
229 BOOST_THREAD_LOG
230 << boost::csbl::get<1>(res).get() <<" " << BOOST_THREAD_END_LOG;
231 }
232 {
233 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
234 boost::future<std::string> f1 = boost::make_ready_future(std::string("aaaa"));
235 boost::future<int> f2 = boost::async(boost::launch::async, &p1b);
236 boost::future<boost::csbl::tuple<boost::future<std::string>,boost::future<int> > > all = boost::when_any(boost::move(f1), boost::move(f2));
237 boost::csbl::tuple<boost::future<std::string>,boost::future<int> > res = all.get();
238 BOOST_THREAD_LOG
239 << boost::csbl::get<0>(res).get() <<" " << BOOST_THREAD_END_LOG;
240 BOOST_THREAD_LOG
241 << boost::csbl::get<1>(res).get() <<" " << BOOST_THREAD_END_LOG;
242 }
243 {
244 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
245 boost::future<int> f2 = boost::make_ready_future(1);
246 boost::future<int> f1 = boost::async(boost::launch::async, &p1b);
247 boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_any(boost::move(f1), boost::move(f2));
248 boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
249 BOOST_THREAD_LOG
250 << boost::csbl::get<0>(res).get() <<" " << BOOST_THREAD_END_LOG;
251 BOOST_THREAD_LOG
252 << boost::csbl::get<1>(res).get() <<" " << BOOST_THREAD_END_LOG;
253 }
254 #if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
255 {
256 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
257 boost::future<int> f1 = boost::async(boost::launch::deferred, &p1);
258 boost::future<int> f2 = boost::async(boost::launch::async, &p1b);
259 boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_any(boost::move(f1), boost::move(f2));
260 boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
261 BOOST_THREAD_LOG
262 << boost::csbl::get<0>(res).get() <<" " << BOOST_THREAD_END_LOG;
263 BOOST_THREAD_LOG
264 << boost::csbl::get<1>(res).get() <<" " << BOOST_THREAD_END_LOG;
265 }
266 {
267 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
268 boost::future<int> f1 = boost::async(boost::launch::async, &p1);
269 boost::future<int> f2 = boost::async(boost::launch::deferred, &p1b);
270 boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_any(boost::move(f1), boost::move(f2));
271 boost::csbl::tuple<boost::future<int>,boost::future<int> > res = all.get();
272 BOOST_THREAD_LOG
273 << boost::csbl::get<0>(res).get() <<" " << BOOST_THREAD_END_LOG;
274 BOOST_THREAD_LOG
275 << boost::csbl::get<1>(res).get() <<" " << BOOST_THREAD_END_LOG;
276 }
277 #endif
278 {
279 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
280 boost::csbl::vector<boost::future<int> > v;
281 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
282 v.push_back(boost::async(boost::launch::async, &p1));
283 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
284 v.push_back(boost::async(boost::launch::async, &p1b));
285 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
286 boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_any(v.begin(), v.end());
287 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
288 boost::csbl::vector<boost::future<int> > res = all.get();
289 BOOST_THREAD_LOG
290 << res[0].get() <<" " << BOOST_THREAD_END_LOG;
291 BOOST_THREAD_LOG
292 << res[1].get() <<" " << BOOST_THREAD_END_LOG;
293 }
294 }
295 catch (std::exception& ex)
296 {
297 BOOST_THREAD_LOG
298 << "ERRORRRRR " << ex.what() << "" << BOOST_THREAD_END_LOG;
299 return 1;
300 }
301 catch (...)
302 {
303 BOOST_THREAD_LOG
304 << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
305 return 2;
306 }
307 }
308 BOOST_THREAD_LOG
309 << "MAIN>" << BOOST_THREAD_END_LOG;
310 return 0;
311 }
312 #else
313 #include <boost/thread/csbl/vector.hpp>
314 using namespace boost;
315
316 void f( boost::csbl::vector<future<int> > &//vec
317 , BOOST_THREAD_RV_REF(future<int>) //f
318 ) {
319 }
320 int main()
321 {
322 boost::csbl::vector<future<int> > vec;
323 f(vec, make_ready_future(0));
324 return 0;
325 }
326 #endif