]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/thread/example/future_unwrap.cpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / thread / example / future_unwrap.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 #include <boost/config.hpp>
7 #if ! defined BOOST_NO_CXX11_DECLTYPE
8 #define BOOST_RESULT_OF_USE_DECLTYPE
9 #endif
10
11 #define BOOST_THREAD_VERSION 4
12 //#define BOOST_THREAD_USES_LOG
13 #define BOOST_THREAD_USES_LOG_THREAD_ID
14
15 #include <boost/thread/detail/log.hpp>
16 #include <boost/thread/future.hpp>
17 #include <boost/assert.hpp>
18 #include <string>
19 #include <iostream>
20
21 #if defined BOOST_THREAD_PROVIDES_FUTURE_UNWRAP
22
23 #ifdef BOOST_MSVC
24 #pragma warning(disable: 4127) // conditional expression is constant
25 #endif
26
27 int p1()
28 {
29 BOOST_THREAD_LOG << "P1" << BOOST_THREAD_END_LOG;
30 return 123;
31 }
32
33 boost::future<int> p2()
34 {
35 BOOST_THREAD_LOG << "<P2" << BOOST_THREAD_END_LOG;
36 boost::future<int> f1 = boost::async(boost::launch::async, &p1);
37 BOOST_THREAD_LOG << "P2>" << BOOST_THREAD_END_LOG;
38 return boost::move(f1);
39 }
40
41 int main()
42 {
43 const int number_of_tests = 100;
44 BOOST_THREAD_LOG << "<MAIN" << BOOST_THREAD_END_LOG;
45 for (int i=0; i< number_of_tests; i++)
46 try
47 {
48
49 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
50 {
51 boost::future<int> inner_future = boost::async(boost::launch::async, &p2).unwrap();
52 inner_future.wait();
53 int ii = inner_future.get();
54 BOOST_THREAD_LOG << "ii= "<< ii << "" << BOOST_THREAD_END_LOG;
55 }
56 #endif
57 {
58 boost::future<boost::future<int> > outer_future = boost::async(boost::launch::async, &p2);
59 boost::future<int> inner_future = outer_future.unwrap();
60 inner_future.wait();
61 int ii = inner_future.get();
62 BOOST_THREAD_LOG << "ii= "<< ii << "" << BOOST_THREAD_END_LOG;
63 }
64 {
65 boost::future<boost::future<int> > outer_future = boost::async(boost::launch::async, &p2);
66 boost::future<int> inner_future = outer_future.unwrap();
67 int ii = inner_future.get();
68 BOOST_THREAD_LOG << "ii= "<< ii << "" << BOOST_THREAD_END_LOG;
69 }
70 }
71 catch (std::exception& ex)
72 {
73 std::cout << "ERRORRRRR "<<ex.what() << "" << std::endl;
74 BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG;
75 return 1;
76 }
77 catch (...)
78 {
79 std::cout << " ERRORRRRR exception thrown" << std::endl;
80 BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
81 return 2;
82 }
83 BOOST_THREAD_LOG << "MAIN>" << BOOST_THREAD_END_LOG;
84 return 0;
85 }
86 #else
87
88 int main()
89 {
90 return 0;
91 }
92 #endif