1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Copyright (C) 2011 Vicente J. Botet Escriba
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)
15 // <boost/thread/future.hpp>
16 // class packaged_task<R>
19 // explicit packaged_task(F&& f);
22 #define BOOST_THREAD_VERSION 4
24 #include <boost/thread/future.hpp>
25 #include <boost/detail/lightweight_test.hpp>
27 #if BOOST_THREAD_VERSION == 4
28 #define BOOST_THREAD_DETAIL_SIGNATURE double()
29 #define BOOST_THREAD_DETAIL_VOID_SIGNATURE void()
31 #define BOOST_THREAD_DETAIL_SIGNATURE double
32 #define BOOST_THREAD_DETAIL_VOID_SIGNATURE void
35 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK
36 #if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
37 #define BOOST_THREAD_DETAIL_SIGNATURE_2 double(int, char)
38 #define BOOST_THREAD_DETAIL_SIGNATURE_2_RES 5 + 3 +'a'
39 #define BOOST_THREAD_DETAIL_VOID_SIGNATURE_2 void(int)
41 #define BOOST_THREAD_DETAIL_SIGNATURE_2 double()
42 #define BOOST_THREAD_DETAIL_SIGNATURE_2_RES 5
43 #define BOOST_THREAD_DETAIL_VOID_SIGNATURE_2 void()
46 #define BOOST_THREAD_DETAIL_SIGNATURE_2 double
47 #define BOOST_THREAD_DETAIL_SIGNATURE_2_RES 5
48 #define BOOST_THREAD_DETAIL_VOID_SIGNATURE_2 void
71 BOOST_THREAD_COPYABLE_AND_MOVABLE(A
)
78 explicit A(long i
) : data_(i
)
81 A(BOOST_THREAD_RV_REF(A
) a
) : data_(BOOST_THREAD_RV(a
).data_
)
83 BOOST_THREAD_RV(a
).data_
= -1;
86 A
& operator=(BOOST_THREAD_RV_REF(A
) a
)
88 data_
= BOOST_THREAD_RV(a
).data_
;
89 BOOST_THREAD_RV(a
).data_
= -1;
93 A(const A
& a
) : data_(a
.data_
)
97 A
& operator=(BOOST_THREAD_COPY_ASSIGN_REF(A
) a
)
107 void operator()(int) const
109 long operator()() const
111 long operator()(long i
, long j
) const
112 { return data_
+ i
+ j
;}
125 BOOST_THREAD_MOVABLE_ONLY(M
)
126 static void reset() {
129 explicit M(long i
) : data_(i
)
132 M(BOOST_THREAD_RV_REF(M
) a
) : data_(BOOST_THREAD_RV(a
).data_
)
134 BOOST_THREAD_RV(a
).data_
= -1;
137 M
& operator=(BOOST_THREAD_RV_REF(M
) a
)
139 data_
= BOOST_THREAD_RV(a
).data_
;
140 BOOST_THREAD_RV(a
).data_
= -1;
148 void operator()(int) const
150 long operator()() const
152 long operator()(long i
, long j
) const
153 { return data_
+ i
+ j
;}
169 explicit C(long i
) : data_(i
)
172 C(const C
& a
) : data_(a
.data_
)
176 C
& operator=(C
const& a
)
186 void operator()(int) const
188 long operator()() const
190 long operator()(long i
, long j
) const
191 { return data_
+ i
+ j
;}
199 boost::packaged_task
<BOOST_THREAD_DETAIL_SIGNATURE_2
> p(BOOST_THREAD_MAKE_RV_REF(A(5)));
200 BOOST_TEST(p
.valid());
201 boost::future
<double> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
202 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
207 BOOST_TEST(f
.get() == BOOST_THREAD_DETAIL_SIGNATURE_2_RES
);
208 BOOST_TEST(A::n_copies
== 0);
209 BOOST_TEST_EQ(A::n_moves
, 1);
214 boost::packaged_task
<BOOST_THREAD_DETAIL_SIGNATURE
> p(a
);
215 BOOST_TEST(p
.valid());
216 boost::future
<double> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
219 BOOST_TEST(f
.get() == 5.0);
220 BOOST_TEST_EQ(A::n_copies
, 1);
221 BOOST_TEST_EQ(A::n_moves
, 0);
226 boost::packaged_task
<BOOST_THREAD_DETAIL_SIGNATURE
> p(a
);
227 BOOST_TEST(p
.valid());
228 boost::future
<double> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
231 BOOST_TEST(f
.get() == 5.0);
232 BOOST_TEST_EQ(A::n_copies
, 1);
233 BOOST_TEST_EQ(A::n_moves
, 0);
235 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
238 boost::packaged_task
<BOOST_THREAD_DETAIL_VOID_SIGNATURE_2
> p(BOOST_THREAD_MAKE_RV_REF(A(5)));
239 BOOST_TEST(p
.valid());
240 boost::future
<void> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
242 BOOST_TEST(A::n_copies
== 0);
243 BOOST_TEST_EQ(A::n_moves
, 1);
248 boost::packaged_task
<BOOST_THREAD_DETAIL_VOID_SIGNATURE_2
> p(a
);
249 BOOST_TEST(p
.valid());
250 boost::future
<void> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
252 BOOST_TEST_EQ(A::n_copies
, 1);
253 BOOST_TEST_EQ(A::n_moves
, 0);
258 boost::packaged_task
<BOOST_THREAD_DETAIL_VOID_SIGNATURE_2
> p(a
);
259 BOOST_TEST(p
.valid());
260 boost::future
<void> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
262 BOOST_TEST_EQ(A::n_copies
, 1);
263 BOOST_TEST_EQ(A::n_moves
, 0);
268 boost::packaged_task
<BOOST_THREAD_DETAIL_SIGNATURE_2
> p(BOOST_THREAD_MAKE_RV_REF(M(5)));
269 BOOST_TEST(p
.valid());
270 boost::future
<double> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
271 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
276 BOOST_TEST(f
.get() == BOOST_THREAD_DETAIL_SIGNATURE_2_RES
);
277 BOOST_TEST_EQ(M::n_moves
, 1);
282 boost::packaged_task
<BOOST_THREAD_DETAIL_SIGNATURE
> p(boost::move(a
));
283 BOOST_TEST(p
.valid());
284 boost::future
<double> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
287 BOOST_TEST(f
.get() == 5.0);
288 BOOST_TEST_EQ(M::n_moves
, 1);
290 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
293 boost::packaged_task
<BOOST_THREAD_DETAIL_VOID_SIGNATURE_2
> p(BOOST_THREAD_MAKE_RV_REF(M(5)));
294 BOOST_TEST(p
.valid());
295 boost::future
<void> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
297 BOOST_TEST_EQ(M::n_moves
, 1);
302 boost::packaged_task
<BOOST_THREAD_DETAIL_VOID_SIGNATURE_2
> p(boost::move(a
));
303 BOOST_TEST(p
.valid());
304 boost::future
<void> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
306 BOOST_TEST_EQ(M::n_moves
, 1);
312 boost::packaged_task
<BOOST_THREAD_DETAIL_SIGNATURE
> p(a
);
313 BOOST_TEST(p
.valid());
314 boost::future
<double> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
317 BOOST_TEST(f
.get() == 5.0);
318 BOOST_TEST_EQ(C::n_copies
, 1);
324 boost::packaged_task
<BOOST_THREAD_DETAIL_SIGNATURE
> p(a
);
325 BOOST_TEST(p
.valid());
326 boost::future
<double> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
329 BOOST_TEST(f
.get() == 5.0);
330 BOOST_TEST_EQ(C::n_copies
, 1);
332 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
336 boost::packaged_task
<BOOST_THREAD_DETAIL_VOID_SIGNATURE_2
> p(a
);
337 BOOST_TEST(p
.valid());
338 boost::future
<void> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
340 BOOST_TEST_EQ(C::n_copies
, 1);
346 boost::packaged_task
<BOOST_THREAD_DETAIL_VOID_SIGNATURE_2
> p(a
);
347 BOOST_TEST(p
.valid());
348 boost::future
<void> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
350 BOOST_TEST_EQ(C::n_copies
, 1);
354 boost::packaged_task
<BOOST_THREAD_DETAIL_VOID_SIGNATURE
> p(void_fct
);
355 BOOST_TEST(p
.valid());
356 boost::future
<void> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
360 boost::packaged_task
<BOOST_THREAD_DETAIL_SIGNATURE
> p(fct
);
361 BOOST_TEST(p
.valid());
362 boost::future
<double> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
365 BOOST_TEST(f
.get() == 5.0);
368 boost::packaged_task
<BOOST_THREAD_DETAIL_SIGNATURE
> p(&lfct
);
369 BOOST_TEST(p
.valid());
370 boost::future
<double> f
= BOOST_THREAD_MAKE_RV_REF(p
.get_future());
373 BOOST_TEST(f
.get() == 5.0);
376 return boost::report_errors();