• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (C) 2012 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 
13 #include <boost/thread/future.hpp>
14 #include <iostream>
15 
16 namespace boost
17 {
18 
19   template <typename T>
make_exception_ptr(T v)20   exception_ptr make_exception_ptr(T v)
21   {
22     return copy_exception(v);
23   }
24 }
25 
p1()26 int p1() { return 5; }
p1r()27 int& p1r() { static int i=0; return i; }
28 
p()29 void p() { }
30 
31 #if defined BOOST_THREAD_USES_MOVE
void_compute()32 boost::future<void> void_compute()
33 {
34   return BOOST_THREAD_MAKE_RV_REF(boost::make_ready_future());
35 }
36 #endif
37 
compute(int x)38 boost::future<int> compute(int x)
39 {
40   if (x == 0) return boost::make_ready_future(0);
41 #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
42   if (x < 0) return boost::make_exceptional_future<int>(std::logic_error("Error"));
43 #else
44   if (x < 0) return boost::make_exceptional(std::logic_error("Error"));
45 #endif
46   //boost::future<int> f1 = boost::async([]() { return x+1; });
47   boost::future<int> f1 = boost::async(p1);
48   return boost::move(f1);
49 }
50 
compute_ref(int x)51 boost::future<int&> compute_ref(int x)
52 {
53   static int i = 0;
54   //if (x == 0) return boost::make_ready_future<int&>(i); //This must not compile as the type is deduced as boost::future<int>
55   if (x == 0) return boost::make_ready_no_decay_future<int&>(i);
56 #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
57   if (x < 0) return boost::make_exceptional_future<int&>(std::logic_error("Error"));
58 #else
59   if (x < 0) return boost::make_exceptional(std::logic_error("Error"));
60 #endif
61   boost::future<int&> f1 = boost::async(p1r);
62   return boost::move(f1);
63 }
64 
shared_compute(int x)65 boost::shared_future<int> shared_compute(int x)
66 {
67   if (x == 0) return boost::make_ready_future(0).share();
68 #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
69   if (x < 0) return boost::make_exceptional_future<int>(std::logic_error("Error")).share();
70 #else
71   if (x < 0) return boost::make_exceptional(std::logic_error("Error"));
72 #endif
73   //boost::future<int> f1 = boost::async([]() { return x+1; });
74   boost::shared_future<int> f1 = boost::async(&p1).share();
75   return f1;
76 }
77 
78 
main()79 int main()
80 {
81   const int number_of_tests = 100;
82   for (int i=0; i< number_of_tests; i++)
83   try
84   {
85 //    {
86 //    std::cout << __FILE__ << " "<<__LINE__ << std::endl;
87 //    boost::future<int> f = boost::async(boost::launch::async, p1);
88 //    std::cout << i << " "<<f.get() << std::endl;
89 //    }
90 #if defined BOOST_THREAD_USES_MOVE
91   {
92     std::cout << __FILE__ << " "<< __LINE__ << std::endl;
93     boost::future<void> f = void_compute();
94     f.get();
95   }
96 #endif
97   {
98     std::cout << __FILE__ << " "<< __LINE__ << std::endl;
99     boost::future<int> f = compute(-1);
100     f.wait();
101   }
102   {
103     std::cout << __FILE__ << " "<< __LINE__ << std::endl;
104     boost::future<int> f = compute(0);
105     std::cout << f.get() << std::endl;
106   }
107   {
108     std::cout << __FILE__ << " "<< __LINE__ << std::endl;
109     boost::future<int&> f = compute_ref(0);
110     std::cout << f.get() << std::endl;
111   }
112 #if __cplusplus > 201103L
113   {
114     std::cout << __FILE__ << " "<< __LINE__ << std::endl;
115     int i = 0;
116     boost::future<int&> f = boost::make_ready_future(std::ref(i));
117     std::cout << f.get() << std::endl;
118   }
119 #endif
120   {
121     std::cout << __FILE__ << " "<< __LINE__ << std::endl;
122     int i = 0;
123     boost::future<int&> f = boost::make_ready_future(boost::ref(i));
124     std::cout << f.get() << std::endl;
125   }
126   {
127     std::cout << __FILE__ << " "<< __LINE__ << std::endl;
128     const int i = 0;
129     boost::future<int const&> f = boost::make_ready_future(boost::cref(i));
130     std::cout << f.get() << std::endl;
131   }
132   {
133     std::cout << __FILE__ << " "<< __LINE__ << std::endl;
134     boost::future<int> f = compute(2);
135     std::cout << f.get() << std::endl;
136   }
137   {
138     std::cout << __FILE__ << " "<< __LINE__ << std::endl;
139     boost::shared_future<int> f = shared_compute(0);
140     std::cout << f.get() << std::endl;
141   }
142   }
143   catch (std::exception& ex)
144   {
145     std::cout << "ERRORRRRR "<<ex.what() << "" << std::endl;
146     return 1;
147   }
148   catch (...)
149   {
150     std::cout << "ERRORRRRR "<<"ERRORRRRR exception thrown" << std::endl;
151     return 2;
152   }
153   return 0;
154 }
155