• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 2010 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 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
8 
9 #include <boost/detail/lightweight_test.hpp>
10 #include <boost/thread/future.hpp>
11 #include <boost/utility/result_of.hpp>
12 #include <functional>
13 
14 struct async_func {
~async_funcasync_func15     virtual ~async_func() { }
16     virtual void run() =0;
17     };
18 
19 template <typename Ret>
20 class async_func_pt : public async_func {
21     boost::packaged_task<Ret> f;
22 public:
run()23     void run() {
24       std::cout << __FILE__ << ":" << __LINE__ << std::endl;
25 f(); }
async_func_pt(boost::packaged_task<Ret> && f)26     async_func_pt (boost::packaged_task<Ret>&& f) : f(boost::move(f)) {}
~async_func_pt()27     ~async_func_pt() { }
get_future()28     boost::unique_future<Ret> get_future()  { return f.get_future(); }
29     };
30 
async_core(async_func * p)31 void async_core (async_func* p) {
32   std::cout << __FILE__ << ":" << __LINE__ << std::endl;
33   p->run();
34 }
35 
36 
37 
38 
39 template <typename F>
40 boost::unique_future<typename boost::result_of< F() >::type>
async(F && f)41 async (F&& f)
42  {
43   std::cout << __FILE__ << ":" << __LINE__ << std::endl;
44  typedef typename boost::result_of< F() >::type RetType;
45  std::cout << __FILE__ << ":" << __LINE__ << std::endl;
46  async_func_pt<RetType>* p= new  async_func_pt<RetType> (boost::packaged_task<RetType>(boost::forward<F>(f)));
47  std::cout << __FILE__ << ":" << __LINE__ << std::endl;
48  boost::unique_future<RetType> future_result= p->get_future();
49  std::cout << __FILE__ << ":" << __LINE__ << std::endl;
50  async_core (p);
51  std::cout << __FILE__ << ":" << __LINE__ << std::endl;
52  return boost::move(future_result);
53  }
54 
55 template <typename F, typename A1>
56 boost::unique_future<typename boost::result_of< F(A1) >::type>
async(F && f,A1 && a1)57 async (F&& f, A1&& a1)
58  {
59   std::cout << __FILE__ << ":" << __LINE__ << std::endl;
60 // This should be all it needs.  But get a funny error deep inside Boost.
61 // problem overloading with && ?
62  return async (boost::bind(f,a1));
63  }
64 
65 
calculate_the_answer_to_life_the_universe_and_everything()66 int calculate_the_answer_to_life_the_universe_and_everything()
67 {
68     return 42;
69 }
70 
71 
foo(const std::string & s)72 size_t foo (const std::string& s)
73  {
74  return s.size();
75  }
76 
77 
78 
test1()79 void test1()
80 {
81 // this one works
82     // most fundimental form:
83   std::cout << __FILE__ << ":" << __LINE__ << std::endl;
84     boost::unique_future<int> fi= async (&calculate_the_answer_to_life_the_universe_and_everything);
85     int i= fi.get();
86     BOOST_TEST (i== 42);
87 
88 
89 // This one chokes at compile time
90     std::cout << __FILE__ << ":" << __LINE__ << std::endl;
91     boost::unique_future<size_t> fut_1= async (&foo, "Life");
92 
93     BOOST_TEST (fut_1.get()== 4);
94 }
95 
main()96 int main()
97 {
98   test1();
99   return boost::report_errors();
100 
101 }
102 
103 #else
main()104 int main()
105 {
106   return 0;
107 }
108 
109 #endif
110 /*
111  *
112  "/Users/viboes/clang/llvmCore-3.0-rc1.install/bin/clang++"
113  -o "../../../bin.v2/libs/thread/test/test_ml.test/clang-darwin-3.0x/debug/threading-multi/test_ml"
114  "../../../bin.v2/libs/thread/test/test_ml.test/clang-darwin-3.0x/debug/threading-multi/test_ml.o"
115  "../../../bin.v2/libs/test/build/clang-darwin-3.0x/debug/link-static/threading-multi/libboost_unit_test_framework.a"
116  "../../../bin.v2/libs/thread/build/clang-darwin-3.0x/debug/threading-multi/libboost_thread.dylib"
117  "../../../bin.v2/libs/chrono/build/clang-darwin-3.0x/debug/threading-multi/libboost_chrono.dylib"
118  "../../../bin.v2/libs/system/build/clang-darwin-3.0x/debug/threading-multi/libboost_system.dylib"    -g
119 */
120 
121 
122 /*
123  *
124  * #include <boost/test/unit_test.hpp>
125 #include <boost/thread/future.hpp>
126 #include <boost/utility/result_of.hpp>
127 #include <functional>
128 
129 struct async_func {
130     virtual ~async_func() { }
131     virtual void run() =0;
132     };
133 
134 template <typename Ret>
135 class async_func_pt : public async_func {
136     boost::packaged_task<Ret> f;
137 public:
138     void run() override { f(); }
139     async_func_pt (boost::packaged_task<Ret>&& f) : f(std::move(f)) {}
140     ~async_func_pt() { }
141     boost::unique_future<Ret> get_future()  { return f.get_future(); }
142     };
143 
144 void async_core (async_func* p);
145 
146 
147 
148 
149 template <typename F>
150 boost::unique_future<typename boost::result_of< F() >::type>
151 async (F&& f)
152  {
153  typedef typename boost::result_of< F() >::type RetType;
154  async_func_pt<RetType>* p= new  async_func_pt<RetType> (boost::packaged_task<RetType>(f));
155  boost::unique_future<RetType> future_result= p->get_future();
156  async_core (p);
157  return std::move(future_result);
158  }
159 
160 template <typename F, typename A1>
161 boost::unique_future<typename boost::result_of< F(A1) >::type>
162 async (F&& f, A1&& a1)
163  {
164 // This should be all it needs.  But get a funny error deep inside Boost.
165 // problem overloading with && ?
166  return async (std::tr1::bind(f,a1));
167  }
168 
169 BOOST_AUTO_TEST_SUITE(thread_pool_tests)
170 
171 int calculate_the_answer_to_life_the_universe_and_everything()
172 {
173     return 42;
174 }
175 
176 
177 size_t foo (const std::string& s)
178  {
179  return s.size();
180  }
181 
182 
183 
184 BOOST_AUTO_TEST_CASE( async_test )
185 {
186 // this one works
187     // most fundimental form:
188     boost::unique_future<int> fi= async (&calculate_the_answer_to_life_the_universe_and_everything);
189     int i= fi.get();
190     BOOST_CHECK_EQUAL (i, 42);
191 
192 
193 // This one chokes at compile time
194     boost::unique_future<size_t> fut_1= async (&foo, "Life");
195 
196     BOOST_CHECK_EQUAL (fut_1.get(), 4);
197 }
198 
199 
200 BOOST_AUTO_TEST_SUITE_END()
201  */
202