Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 09:44:24

0001 //
0002 // Copyright (c) 2022 Klemens Morgenstern (klemens.morgenstern@gmx.net)
0003 //
0004 // Distributed under the Boost Software License, Version 1.0. (See accompanying
0005 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
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 //BOOST_COBALT_DETAIL_AWAIT_RESULT_HELPER_HPP