• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  // Copyright (C) 2015 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  #define BOOST_THREAD_VERSION 4
7  #include <boost/config.hpp>
8  #if ! defined  BOOST_NO_CXX11_DECLTYPE
9  #define BOOST_RESULT_OF_USE_DECLTYPE
10  #endif
11  #define BOOST_THREAD_PROVIDES_EXECUTORS
12  
13  #include <boost/thread/future.hpp>
14  #include <boost/static_assert.hpp>
15  #include <cassert>
16  #include <iostream>
17  #include <boost/thread/executors/basic_thread_pool.hpp>
18  
19  struct TestCallback
20  {
21    typedef boost::future<void> result_type;
22  
operator ()TestCallback23    result_type operator()(boost::future<void> future) const
24    {
25      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
26      assert(future.is_ready());
27      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
28      future.wait();
29      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
30      return boost::make_ready_future();
31    }
32  
operator ()TestCallback33    result_type operator()(boost::future<boost::future<void> > future) const
34    {
35      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
36      assert(future.is_ready());
37      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
38      assert(future.get().is_ready());
39      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
40      //boost::future<void> ff = future.get();
41  
42      return boost::make_ready_future();
43    }
operator ()TestCallback44    result_type operator()(boost::shared_future<void> future) const
45    {
46      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
47      assert(future.is_ready());
48      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
49      future.wait();
50      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
51      return boost::make_ready_future();
52    }
53  
operator ()TestCallback54    result_type operator()(boost::shared_future<boost::future<void> > future) const
55    {
56      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
57      assert(future.is_ready());
58      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
59      assert(future.get().is_ready());
60      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
61      //boost::future<void> ff = future.get();
62  
63      return boost::make_ready_future();
64    }
65  };
66  
p1()67  void p1()
68  {
69  }
70  
main()71  int main()
72  {
73    const int number_of_tests = 2;
74    (void)(number_of_tests);
75  
76  #if ! defined  BOOST_NO_CXX11_DECLTYPE && ! defined  BOOST_NO_CXX11_AUTO_DECLARATIONS
77    std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
78    {
79      auto f1 = boost::make_ready_future().then(TestCallback());
80      BOOST_STATIC_ASSERT(std::is_same<decltype(f1), boost::future<boost::future<void> > >::value);
81      f1.wait();
82    }
83    std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
84    for (int i=0; i< number_of_tests; i++)
85    {
86      auto f1 = boost::make_ready_future().then(TestCallback());
87      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
88      BOOST_STATIC_ASSERT(std::is_same<decltype(f1), boost::future<boost::future<void> > >::value);
89      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
90      auto f2 = f1.unwrap();
91      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
92      BOOST_STATIC_ASSERT(std::is_same<decltype(f2), boost::future<void> >::value);
93      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
94      f2.wait();
95      std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
96    }
97    std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
98    for (int i=0; i< number_of_tests; i++)
99    {
100      auto f1 = boost::make_ready_future().then(TestCallback());
101      BOOST_STATIC_ASSERT(std::is_same<decltype(f1), boost::future<boost::future<void> > >::value);
102      boost::future<void> f2 = f1.get();
103    }
104    std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
105    {
106      auto f1 = boost::make_ready_future().then(TestCallback());
107      BOOST_STATIC_ASSERT(std::is_same<decltype(f1), boost::future<boost::future<void> > >::value);
108      auto f3 = f1.then(TestCallback());
109      BOOST_STATIC_ASSERT(std::is_same<decltype(f3), boost::future<boost::future<void> > >::value);
110      f3.wait();
111    }
112    std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
113    for (int i=0; i< number_of_tests; i++)
114    {
115      auto f1 = boost::make_ready_future().then(TestCallback());
116      BOOST_STATIC_ASSERT(std::is_same<decltype(f1), boost::future<boost::future<void> > >::value);
117      auto f2 = f1.unwrap();
118      BOOST_STATIC_ASSERT(std::is_same<decltype(f2), boost::future<void> >::value);
119      auto f3 = f2.then(TestCallback());
120      BOOST_STATIC_ASSERT(std::is_same<decltype(f3), boost::future<boost::future<void> > >::value);
121      f3.wait();
122    }
123    std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
124    for (int i=0; i< number_of_tests; i++)
125    {
126          boost::make_ready_future().then(
127              TestCallback()).unwrap().then(TestCallback()).get();
128    }
129    std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
130    for (int i=0; i< number_of_tests; i++)
131    {
132      boost::future<void> f = boost::async(p1);
133      f.then(
134              TestCallback()).unwrap().then(TestCallback()).get();
135    }
136    std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
137    for (int i=0; i< number_of_tests; i++)
138    {
139      auto f1 = boost::make_ready_future().then(TestCallback());
140      BOOST_STATIC_ASSERT(std::is_same<decltype(f1), boost::future<boost::future<void> > >::value);
141      auto f3 = f1.then(TestCallback());
142      BOOST_STATIC_ASSERT(std::is_same<decltype(f3), boost::future<boost::future<void> > >::value);
143      f3.wait();
144    }
145    std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
146    for (int i=0; i< number_of_tests; i++)
147    {
148      boost::basic_thread_pool executor;
149      auto f1 = boost::make_ready_future().then(executor, TestCallback());
150      BOOST_STATIC_ASSERT(std::is_same<decltype(f1), boost::future<boost::future<void> > >::value);
151      auto f3 = f1.then(executor, TestCallback());
152      BOOST_STATIC_ASSERT(std::is_same<decltype(f3), boost::future<boost::future<void> > >::value);
153      f3.wait();
154    }
155  #if 1
156    std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
157    // fixme
158    for (int i=0; i< number_of_tests; i++)
159    {
160      boost::basic_thread_pool executor(2);
161  
162      auto f1 = boost::make_ready_future().then(executor, TestCallback());
163      BOOST_STATIC_ASSERT(std::is_same<decltype(f1), boost::future<boost::future<void> > >::value);
164      std::cout << __FILE__ << "[" << __LINE__ << "] " << int(f1.valid()) << std::endl;
165      auto f2 = f1.unwrap();
166      std::cout << __FILE__ << "[" << __LINE__ << "] " << int(f2.valid()) << std::endl;
167  
168      BOOST_STATIC_ASSERT(std::is_same<decltype(f2), boost::future<void> >::value);
169      auto f3 = f2.then(executor, TestCallback());
170      BOOST_STATIC_ASSERT(std::is_same<decltype(f3), boost::future<boost::future<void> > >::value);
171      f3.wait();
172    }
173  #endif
174    std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
175    for (int i=0; i< number_of_tests; i++)
176    {
177      boost::basic_thread_pool executor;
178  
179      auto f1 = boost::make_ready_future().then(executor, TestCallback());
180      BOOST_STATIC_ASSERT(std::is_same<decltype(f1), boost::future<boost::future<void> > >::value);
181      auto f2 = f1.unwrap();
182      BOOST_STATIC_ASSERT(std::is_same<decltype(f2), boost::future<void> >::value);
183      auto f3 = f2.then(executor, TestCallback());
184      BOOST_STATIC_ASSERT(std::is_same<decltype(f3), boost::future<boost::future<void> > >::value);
185      f3.wait();
186    }
187    std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
188  
189  #endif
190    return 0;
191  }
192