async.hpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // Copyright Oliver Kowalke 2013.
  2. // Distributed under the Boost Software License, Version 1.0.
  3. // (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. #ifndef BOOST_FIBERS_ASYNC_HPP
  6. #define BOOST_FIBERS_ASYNC_HPP
  7. #include <algorithm>
  8. #include <memory>
  9. #include <type_traits>
  10. #include <utility>
  11. #include <boost/config.hpp>
  12. #include <boost/fiber/future/future.hpp>
  13. #include <boost/fiber/future/packaged_task.hpp>
  14. #include <boost/fiber/policy.hpp>
  15. namespace boost {
  16. namespace fibers {
  17. template< typename Fn, typename ... Args >
  18. future<
  19. typename std::result_of<
  20. typename std::enable_if<
  21. ! detail::is_launch_policy< typename std::decay< Fn >::type >::value,
  22. typename std::decay< Fn >::type
  23. >::type( typename std::decay< Args >::type ... )
  24. >::type
  25. >
  26. async( Fn && fn, Args ... args) {
  27. typedef typename std::result_of<
  28. typename std::decay< Fn >::type( typename std::decay< Args >::type ... )
  29. >::type result_type;
  30. packaged_task< result_type( typename std::decay< Args >::type ... ) > pt{
  31. std::forward< Fn >( fn) };
  32. future< result_type > f{ pt.get_future() };
  33. fiber{ std::move( pt), std::forward< Args >( args) ... }.detach();
  34. return f;
  35. }
  36. template< typename Policy, typename Fn, typename ... Args >
  37. future<
  38. typename std::result_of<
  39. typename std::enable_if<
  40. detail::is_launch_policy< Policy >::value,
  41. typename std::decay< Fn >::type
  42. >::type( typename std::decay< Args >::type ...)
  43. >::type
  44. >
  45. async( Policy policy, Fn && fn, Args ... args) {
  46. typedef typename std::result_of<
  47. typename std::decay< Fn >::type( typename std::decay< Args >::type ... )
  48. >::type result_type;
  49. packaged_task< result_type( typename std::decay< Args >::type ... ) > pt{
  50. std::forward< Fn >( fn) };
  51. future< result_type > f{ pt.get_future() };
  52. fiber{ policy, std::move( pt), std::forward< Args >( args) ... }.detach();
  53. return f;
  54. }
  55. template< typename Policy, typename StackAllocator, typename Fn, typename ... Args >
  56. future<
  57. typename std::result_of<
  58. typename std::enable_if<
  59. detail::is_launch_policy< Policy >::value,
  60. typename std::decay< Fn >::type
  61. >::type( typename std::decay< Args >::type ... )
  62. >::type
  63. >
  64. async( Policy policy, std::allocator_arg_t, StackAllocator salloc, Fn && fn, Args ... args) {
  65. typedef typename std::result_of<
  66. typename std::decay< Fn >::type( typename std::decay< Args >::type ... )
  67. >::type result_type;
  68. packaged_task< result_type( typename std::decay< Args >::type ... ) > pt{
  69. std::forward< Fn >( fn) };
  70. future< result_type > f{ pt.get_future() };
  71. fiber{ policy, std::allocator_arg, salloc,
  72. std::move( pt), std::forward< Args >( args) ... }.detach();
  73. return f;
  74. }
  75. template< typename Policy, typename StackAllocator, typename Allocator, typename Fn, typename ... Args >
  76. future<
  77. typename std::result_of<
  78. typename std::enable_if<
  79. detail::is_launch_policy< Policy >::value,
  80. typename std::decay< Fn >::type
  81. >::type( typename std::decay< Args >::type ... )
  82. >::type
  83. >
  84. async( Policy policy, std::allocator_arg_t, StackAllocator salloc, Allocator alloc, Fn && fn, Args ... args) {
  85. typedef typename std::result_of<
  86. typename std::decay< Fn >::type( typename std::decay< Args >::type ... )
  87. >::type result_type;
  88. packaged_task< result_type( typename std::decay< Args >::type ... ) > pt{
  89. std::allocator_arg, alloc, std::forward< Fn >( fn) };
  90. future< result_type > f{ pt.get_future() };
  91. fiber{ policy, std::allocator_arg, salloc,
  92. std::move( pt), std::forward< Args >( args) ... }.detach();
  93. return f;
  94. }
  95. }}
  96. #endif // BOOST_FIBERS_ASYNC_HPP