Imported Upstream version 1.57.0
[platform/upstream/boost.git] / libs / thread / test / sync / futures / future / then_deferred_pass.cpp
1 // Copyright (C) 2012-2013 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 // <boost/thread/future.hpp>
7
8 // class future<R>
9
10 // template<typename F>
11 // auto then(F&& func) -> future<decltype(func(*this))>;
12
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>
17
18 #include <boost/thread/future.hpp>
19 #include <boost/detail/lightweight_test.hpp>
20
21 #if defined BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
22
23
24 int p1()
25 {
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;
29   return 1;
30 }
31
32 int p2(boost::future<int> f)
33 {
34   BOOST_THREAD_LOG << "p2 <" << &f << BOOST_THREAD_END_LOG;
35   BOOST_TEST(f.valid());
36   int i = f.get();
37   boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
38   BOOST_THREAD_LOG << "p2 <" << &f << BOOST_THREAD_END_LOG;
39   return 2 * i;
40 }
41
42 void p3(boost::future<int> f)
43 {
44   BOOST_THREAD_LOG << "p3 <" << &f << BOOST_THREAD_END_LOG;
45   BOOST_TEST(f.valid());
46   int i = f.get();
47   boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
48   BOOST_THREAD_LOG << "p3 <" << &f << " " <<i << BOOST_THREAD_END_LOG;
49   return;
50 }
51
52 int main()
53 {
54   BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
55   {
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());
61     try
62     {
63       BOOST_TEST(f2.get()==2);
64     }
65     catch (std::exception& ex)
66     {
67       BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG;
68       BOOST_TEST(false);
69     }
70     catch (...)
71     {
72       BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
73       BOOST_TEST(false);
74     }
75   }
76   BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
77   {
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());
82     try
83     {
84       f2.wait();
85     }
86     catch (std::exception& ex)
87     {
88       BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG;
89       BOOST_TEST(false);
90     }
91     catch (...)
92     {
93       BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
94       BOOST_TEST(false);
95     }
96   }
97   BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
98   {
99     boost::future<int> f2 = boost::async(p1).then(boost::launch::deferred, &p2);
100     BOOST_TEST(f2.get()==2);
101   }
102   BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
103   {
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);
108   }
109   BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
110   {
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);
114   }
115   BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
116   {
117     boost::future<int> f2 = boost::async(p1).then(boost::launch::deferred, &p2).then(boost::launch::deferred, &p2);
118     BOOST_TEST(f2.get()==4);
119   }
120
121   return boost::report_errors();
122 }
123
124 #else
125
126 int main()
127 {
128   return 0;
129 }
130 #endif