Warning, file /include/boost/leaf/capture.hpp was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 #ifndef BOOST_LEAF_CAPTURE_HPP_INCLUDED
0002 #define BOOST_LEAF_CAPTURE_HPP_INCLUDED
0003
0004
0005
0006
0007
0008
0009 #include <boost/leaf/config.hpp>
0010 #include <boost/leaf/handle_errors.hpp>
0011
0012 #if BOOST_LEAF_CFG_CAPTURE
0013
0014 namespace boost { namespace leaf {
0015
0016 namespace leaf_detail
0017 {
0018 template <class R, bool IsResult = is_result_type<R>::value>
0019 struct is_result_tag;
0020
0021 template <class R>
0022 struct is_result_tag<R, false>
0023 {
0024 };
0025
0026 template <class R>
0027 struct is_result_tag<R, true>
0028 {
0029 };
0030 }
0031
0032 #ifdef BOOST_LEAF_NO_EXCEPTIONS
0033
0034 namespace leaf_detail
0035 {
0036 template <class R, class F, class... A>
0037 inline
0038 decltype(std::declval<F>()(std::forward<A>(std::declval<A>())...))
0039 capture_impl(is_result_tag<R, false>, F && f, A... a) noexcept
0040 {
0041 return std::forward<F>(f)(std::forward<A>(a)...);
0042 }
0043
0044 template <class R, class Future>
0045 inline
0046 decltype(std::declval<Future>().get())
0047 future_get_impl(is_result_tag<R, false>, Future & fut) noexcept
0048 {
0049 return fut.get();
0050 }
0051 }
0052
0053 #else
0054
0055 namespace leaf_detail
0056 {
0057
0058 template <class R, class F, class... A>
0059 decltype(std::declval<F>()(std::forward<A>(std::declval<A>())...))
0060 capture_impl(is_result_tag<R, false>, F && f, A... a);
0061
0062
0063 template <class R, class Future>
0064 decltype(std::declval<Future>().get())
0065 future_get_impl(is_result_tag<R, false>, Future & fut );
0066 }
0067
0068 #endif
0069
0070 namespace leaf_detail
0071 {
0072 template <class R, class F, class... A>
0073 inline
0074 decltype(std::declval<F>()(std::forward<A>(std::declval<A>())...))
0075 capture_impl(is_result_tag<R, true>, F && f, A... a) noexcept
0076 {
0077 return try_capture_all(
0078 [&]
0079 {
0080 return std::forward<F>(f)(std::forward<A>(a)...);
0081 } );
0082 }
0083
0084 template <class R, class Future>
0085 inline
0086 decltype(std::declval<Future>().get())
0087 future_get_impl(is_result_tag<R, true>, Future & fut) noexcept
0088 {
0089 if( auto r = fut.get() )
0090 return r;
0091 else
0092 {
0093 r.unload();
0094 return r;
0095 }
0096 }
0097 }
0098
0099 template <class F, class... A>
0100 inline
0101 decltype(std::declval<F>()(std::forward<A>(std::declval<A>())...))
0102 capture(context_ptr &&, F && f, A... a)
0103 {
0104 using namespace leaf_detail;
0105 return capture_impl(is_result_tag<decltype(std::declval<F>()(std::forward<A>(std::declval<A>())...))>(), std::forward<F>(f), std::forward<A>(a)...);
0106 }
0107
0108 template <class Future>
0109 inline
0110 decltype(std::declval<Future>().get())
0111 future_get( Future & fut )
0112 {
0113 using namespace leaf_detail;
0114 return future_get_impl(is_result_tag<decltype(std::declval<Future>().get())>(), fut);
0115 }
0116
0117 } }
0118
0119 #endif
0120
0121 #endif