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