get_pass.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. //===----------------------------------------------------------------------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is dual licensed under the MIT and the University of Illinois Open
  6. // Source Licenses. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. // Copyright (C) 2011 Vicente J. Botet Escriba
  10. //
  11. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  12. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  13. // <boost/thread/shared_future.hpp>
  14. // class shared_future<R>
  15. // const R& shared_future::get();
  16. // R& shared_future<R&>::get();
  17. // void shared_future<void>::get();
  18. //#define BOOST_THREAD_VERSION 3
  19. #define BOOST_THREAD_VERSION 4
  20. #include <boost/thread/future.hpp>
  21. #include <boost/thread/thread.hpp>
  22. #include <boost/detail/lightweight_test.hpp>
  23. #if defined BOOST_THREAD_USES_CHRONO
  24. namespace boost
  25. {
  26. template <typename T>
  27. struct wrap
  28. {
  29. wrap(T const& v) : value(v){}
  30. T value;
  31. };
  32. template <typename T>
  33. exception_ptr make_exception_ptr(T v) {
  34. return copy_exception(wrap<T>(v));
  35. }
  36. }
  37. void func1(boost::promise<int> p)
  38. {
  39. boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
  40. p.set_value(3);
  41. }
  42. void func2(boost::promise<int> p)
  43. {
  44. boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
  45. p.set_exception(boost::make_exception_ptr(3));
  46. }
  47. int j = 0;
  48. void func3(boost::promise<int&> p)
  49. {
  50. boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
  51. j = 5;
  52. p.set_value(j);
  53. }
  54. void func4(boost::promise<int&> p)
  55. {
  56. boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
  57. p.set_exception(boost::make_exception_ptr(3.5));
  58. }
  59. void func5(boost::promise<void> p)
  60. {
  61. boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
  62. p.set_value();
  63. }
  64. void func6(boost::promise<void> p)
  65. {
  66. boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
  67. p.set_exception(boost::make_exception_ptr(4));
  68. }
  69. int main()
  70. {
  71. {
  72. typedef int T;
  73. {
  74. boost::promise<T> p;
  75. boost::shared_future<T> f((p.get_future()));
  76. #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
  77. boost::thread(func1, boost::move(p)).detach();
  78. #else
  79. p.set_value(3);
  80. #endif
  81. BOOST_TEST(f.valid());
  82. BOOST_TEST(f.get() == 3);
  83. BOOST_TEST(f.valid());
  84. }
  85. {
  86. boost::promise<T> p;
  87. boost::shared_future<T> f((p.get_future()));
  88. #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
  89. boost::thread(func2, boost::move(p)).detach();
  90. #else
  91. p.set_exception(boost::make_exception_ptr(3));
  92. #endif
  93. try
  94. {
  95. BOOST_TEST(f.valid());
  96. BOOST_TEST(f.get() == 3);
  97. BOOST_TEST(false);
  98. }
  99. catch (boost::wrap<int> const& i)
  100. {
  101. BOOST_TEST(i.value == 3);
  102. }
  103. catch (...)
  104. {
  105. BOOST_TEST(false);
  106. }
  107. BOOST_TEST(f.valid());
  108. }
  109. }
  110. {
  111. typedef int& T;
  112. {
  113. boost::promise<T> p;
  114. boost::shared_future<T> f((p.get_future()));
  115. #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
  116. boost::thread(func3, boost::move(p)).detach();
  117. #else
  118. int j=5;
  119. p.set_value(j);
  120. #endif
  121. BOOST_TEST(f.valid());
  122. BOOST_TEST(f.get() == 5);
  123. BOOST_TEST(f.valid());
  124. }
  125. {
  126. boost::promise<T> p;
  127. boost::shared_future<T> f((p.get_future()));
  128. #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
  129. boost::thread(func4, boost::move(p)).detach();
  130. #else
  131. p.set_exception(boost::make_exception_ptr(3.5));
  132. #endif
  133. try
  134. {
  135. BOOST_TEST(f.valid());
  136. BOOST_TEST(f.get() == 3);
  137. BOOST_TEST(false);
  138. }
  139. catch (boost::wrap<double> const& i)
  140. {
  141. BOOST_TEST(i.value == 3.5);
  142. }
  143. BOOST_TEST(f.valid());
  144. }
  145. }
  146. typedef void T;
  147. {
  148. boost::promise<T> p;
  149. boost::shared_future<T> f((p.get_future()));
  150. #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
  151. boost::thread(func5, boost::move(p)).detach();
  152. #else
  153. p.set_value();
  154. #endif
  155. BOOST_TEST(f.valid());
  156. f.get();
  157. BOOST_TEST(f.valid());
  158. }
  159. {
  160. boost::promise<T> p;
  161. boost::shared_future<T> f((p.get_future()));
  162. #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
  163. boost::thread(func6, boost::move(p)).detach();
  164. #else
  165. p.set_exception(boost::make_exception_ptr(4));
  166. #endif
  167. try
  168. {
  169. BOOST_TEST(f.valid());
  170. f.get();
  171. BOOST_TEST(false);
  172. }
  173. catch (boost::wrap<int> const& i)
  174. {
  175. BOOST_TEST(i.value == 4);
  176. }
  177. catch (...)
  178. {
  179. BOOST_TEST(false);
  180. }
  181. BOOST_TEST(f.valid());
  182. }
  183. return boost::report_errors();
  184. }
  185. #else
  186. #error "Test not applicable: BOOST_THREAD_USES_CHRONO not defined for this platform as not supported"
  187. #endif