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
14struct async_func {
15 virtual ~async_func() { }
16 virtual void run() =0;
17 };
18
19template <typename Ret>
20class async_func_pt : public async_func {
21 boost::packaged_task<Ret> f;
22public:
23 void run() {
24 std::cout << __FILE__ << ":" << __LINE__ << std::endl;
25f(); }
26 async_func_pt (boost::packaged_task<Ret>&& f) : f(boost::move(f)) {}
27 ~async_func_pt() { }
28 boost::unique_future<Ret> get_future() { return f.get_future(); }
29 };
30
31void async_core (async_func* p) {
32 std::cout << __FILE__ << ":" << __LINE__ << std::endl;
33 p->run();
34}
35
36
37
38
39template <typename F>
40boost::unique_future<typename boost::result_of< F() >::type>
41async (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
55template <typename F, typename A1>
56boost::unique_future<typename boost::result_of< F(A1) >::type>
57async (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
66int calculate_the_answer_to_life_the_universe_and_everything()
67{
68 return 42;
69}
70
71
72size_t foo (const std::string& s)
73 {
74 return s.size();
75 }
76
77
78
79void test1()
80{
81// this one works
82 // most fundimental form:
83 std::cout << __FILE__ << ":" << __LINE__ << std::endl;
84 boost::unique_future<int> fi= async (f: &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 (f: &foo, a1: "Life");
92
93 BOOST_TEST (fut_1.get()== 4);
94}
95
96int main()
97{
98 test1();
99 return boost::report_errors();
100
101}
102
103#else
104int 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
129struct async_func {
130 virtual ~async_func() { }
131 virtual void run() =0;
132 };
133
134template <typename Ret>
135class async_func_pt : public async_func {
136 boost::packaged_task<Ret> f;
137public:
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
144void async_core (async_func* p);
145
146
147
148
149template <typename F>
150boost::unique_future<typename boost::result_of< F() >::type>
151async (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
160template <typename F, typename A1>
161boost::unique_future<typename boost::result_of< F(A1) >::type>
162async (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
169BOOST_AUTO_TEST_SUITE(thread_pool_tests)
170
171int calculate_the_answer_to_life_the_universe_and_everything()
172{
173 return 42;
174}
175
176
177size_t foo (const std::string& s)
178 {
179 return s.size();
180 }
181
182
183
184BOOST_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
200BOOST_AUTO_TEST_SUITE_END()
201 */
202

source code of boost/libs/thread/test/test_ml.cpp