1 // Copyright (C) 2012-2013 Vicente Botet
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)
6 // <boost/thread/future.hpp>
10 // template<typename F>
11 // auto then(F&& func) -> future<decltype(func(*this))>;
13 #define BOOST_THREAD_VERSION 4
14 //#define BOOST_THREAD_USES_LOG
15 #define BOOST_THREAD_USES_LOG_THREAD_ID
16 #include <boost/thread/detail/log.hpp>
18 #include <boost/thread/future.hpp>
19 #include <boost/detail/lightweight_test.hpp>
21 #if defined BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
26 BOOST_THREAD_LOG << "p1 < " << BOOST_THREAD_END_LOG;
27 boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
28 BOOST_THREAD_LOG << "p1 >" << BOOST_THREAD_END_LOG;
32 int p2(boost::future<int> f)
34 BOOST_THREAD_LOG << "p2 <" << &f << BOOST_THREAD_END_LOG;
35 BOOST_TEST(f.valid());
37 boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
38 BOOST_THREAD_LOG << "p2 <" << &f << BOOST_THREAD_END_LOG;
42 void p3(boost::future<int> f)
44 BOOST_THREAD_LOG << "p3 <" << &f << BOOST_THREAD_END_LOG;
45 BOOST_TEST(f.valid());
47 boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
48 BOOST_THREAD_LOG << "p3 <" << &f << " " <<i << BOOST_THREAD_END_LOG;
54 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
56 boost::future<int> f1 = boost::async(boost::launch::async, &p1);
57 BOOST_TEST(f1.valid());
58 boost::future<int> f2 = f1.then(boost::launch::deferred, &p2);
59 BOOST_TEST(f2.valid());
60 BOOST_TEST(! f1.valid());
63 BOOST_TEST(f2.get()==2);
65 catch (std::exception& ex)
67 BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG;
72 BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
76 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
78 boost::future<int> f1 = boost::async(boost::launch::async, &p1);
79 BOOST_TEST(f1.valid());
80 boost::future<void> f2 = f1.then(boost::launch::deferred, &p3);
81 BOOST_TEST(f2.valid());
86 catch (std::exception& ex)
88 BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG;
93 BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
97 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
99 boost::future<int> f2 = boost::async(p1).then(boost::launch::deferred, &p2);
100 BOOST_TEST(f2.get()==2);
102 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
104 boost::future<int> f1 = boost::async(p1);
105 boost::future<int> f21 = f1.then(boost::launch::deferred, &p2);
106 boost::future<int> f2= f21.then(boost::launch::deferred, &p2);
107 BOOST_TEST(f2.get()==4);
109 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
111 boost::future<int> f1 = boost::async(p1);
112 boost::future<int> f2= f1.then(boost::launch::deferred, &p2).then(boost::launch::deferred, &p2);
113 BOOST_TEST(f2.get()==4);
115 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
117 boost::future<int> f2 = boost::async(p1).then(boost::launch::deferred, &p2).then(boost::launch::deferred, &p2);
118 BOOST_TEST(f2.get()==4);
121 return boost::report_errors();