File indexing completed on 2025-12-16 09:44:24
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef BOOST_COBALT_DETAIL_AWAIT_RESULT_HELPER_HPP
0009 #define BOOST_COBALT_DETAIL_AWAIT_RESULT_HELPER_HPP
0010
0011 #include <boost/cobalt/concepts.hpp>
0012 #include <utility>
0013
0014 namespace boost::cobalt::detail
0015 {
0016
0017 template<awaitable_type T>
0018 auto co_await_result_helper() -> decltype(std::declval<T&>());
0019
0020 template<typename T>
0021 auto co_await_result_helper() -> decltype(std::declval<T>().operator co_await());
0022
0023 template<typename T>
0024 auto co_await_result_helper() -> decltype(operator co_await(std::declval<T>()));
0025
0026 template<typename T>
0027 using co_awaitable_type = decltype(co_await_result_helper<T>());
0028
0029 template<typename T>
0030 using co_await_result_t = decltype(co_await_result_helper<T>().await_resume());
0031
0032 template<awaitable_type T>
0033 T&& get_awaitable_type(T && t) { return std::forward<T>(t);}
0034
0035 template<typename T>
0036 requires (requires (T && t) {{operator co_await(std::forward<T>(t))} -> awaitable_type;} )
0037 decltype(auto) get_awaitable_type(T && t) { return operator co_await(std::forward<T>(t));}
0038
0039 template<typename T>
0040 requires (requires (T && t) {{std::forward<T>(t).operator co_await()} -> awaitable_type;} )
0041 decltype(auto) get_awaitable_type(T && t) { return std::forward<T>(t).operator co_await();}
0042
0043 template<typename T>
0044 struct awaitable_type_getter
0045 {
0046 using type = co_awaitable_type<T&&>;
0047 std::decay_t<T> & ref;
0048
0049 template<typename U>
0050 awaitable_type_getter(U && ref) : ref(ref) {}
0051
0052 operator type ()
0053 {
0054 if constexpr (std::is_lvalue_reference_v<T>)
0055 return get_awaitable_type(ref);
0056 else
0057 return get_awaitable_type(std::move(ref));
0058 }
0059 };
0060
0061
0062 template<awaitable_type T>
0063 struct awaitable_type_getter<T>
0064 {
0065 using type = T&&;
0066 std::decay_t<T> & ref;
0067
0068 template<typename U>
0069 awaitable_type_getter(U && ref) : ref(ref) {}
0070
0071 operator type ()
0072 {
0073 if constexpr (std::is_lvalue_reference_v<T>)
0074 return ref;
0075 else
0076 return std::move(ref);
0077 }
0078 };
0079
0080 }
0081
0082 #endif