Back to home page

EIC code displayed by LXR

 
 

    


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 // Copyright 2018-2023 Emil Dotchevski and Reverge Studios, Inc.
0005 
0006 // Distributed under the Boost Software License, Version 1.0. (See accompanying
0007 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
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     // Not defined, no longer supported. Please use try_capture_all instead of make_shared_context/capture.
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     // Not defined, no longer supported. Please use try_capture_all instead of make_shared_context/capture.
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