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) 2011 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 // class packaged_task<R>
18 
19 // future<R> get_future();
20 
21 
22 #define BOOST_THREAD_VERSION 4
23 #if BOOST_THREAD_VERSION == 4
24 #define BOOST_THREAD_DETAIL_SIGNATURE double()
25 #else
26 #define BOOST_THREAD_DETAIL_SIGNATURE double
27 #endif
28 
29 #include <boost/thread/future.hpp>
30 #include <boost/detail/lightweight_test.hpp>
31 
32 class A
33 {
34     long data_;
35 
36 public:
A(long i)37     explicit A(long i) : data_(i) {}
38 
operator ()() const39     long operator()() const {return data_;}
operator ()(long i,long j) const40     long operator()(long i, long j) const {return data_ + i + j;}
41 };
42 
main()43 int main()
44 {
45   {
46       boost::packaged_task<BOOST_THREAD_DETAIL_SIGNATURE> p(A(5));
47       boost::future<double> f = BOOST_THREAD_MAKE_RV_REF(p.get_future());
48       //p(3, 'a');
49       p();
50       BOOST_TEST(f.get() == 5.0);
51   }
52   {
53       boost::packaged_task<BOOST_THREAD_DETAIL_SIGNATURE> p(A(5));
54       boost::future<double> f = BOOST_THREAD_MAKE_RV_REF(p.get_future());
55       try
56       {
57           f = BOOST_THREAD_MAKE_RV_REF(p.get_future());
58           BOOST_TEST(false);
59       }
60       catch (const boost::future_error& e)
61       {
62           BOOST_TEST(e.code() ==  boost::system::make_error_code(boost::future_errc::future_already_retrieved));
63       }
64   }
65   {
66       boost::packaged_task<BOOST_THREAD_DETAIL_SIGNATURE> p;
67       try
68       {
69           boost::future<double> f = BOOST_THREAD_MAKE_RV_REF(p.get_future());
70           BOOST_TEST(false);
71       }
72       catch (const boost::future_error& e)
73       {
74           BOOST_TEST(e.code() ==  boost::system::make_error_code(boost::future_errc::no_state));
75       }
76   }
77 
78   return boost::report_errors();
79 }
80 
81