// // experimental/impl/use_coro.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2021-2023 Klemens D. Morgenstern // (klemens dot morgenstern at gmx dot net) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef ASIO_EXPERIMENTAL_IMPL_USE_CORO_HPP #define ASIO_EXPERIMENTAL_IMPL_USE_CORO_HPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/deferred.hpp" #include "asio/experimental/coro.hpp" #include "asio/detail/push_options.hpp" namespace asio { #if !defined(GENERATING_DOCUMENTATION) template struct async_result, R()> { template static auto initiate_impl(Initiation initiation, std::allocator_arg_t, Allocator, InitArgs... args) -> experimental::coro, Allocator> { co_await deferred_async_operation( deferred_init_tag{}, std::move(initiation), std::move(args)...); } template static auto initiate_impl(asio::detail::initiation_archetype, std::allocator_arg_t, Allocator, InitArgs... args) -> experimental::coro; template static auto initiate(Initiation initiation, experimental::use_coro_t tk, InitArgs&&... args) { return initiate_impl(std::move(initiation), std::allocator_arg, tk.get_allocator(), std::forward(args)...); } }; template struct async_result< experimental::use_coro_t, R(asio::error_code)> { template static auto initiate_impl(Initiation initiation, std::allocator_arg_t, Allocator, InitArgs... args) -> experimental::coro, Allocator> { co_await deferred_async_operation< R(asio::error_code), Initiation, InitArgs...>( deferred_init_tag{}, std::move(initiation), std::move(args)...); } template static auto initiate_impl( asio::detail::initiation_archetype, std::allocator_arg_t, Allocator, InitArgs... args) -> experimental::coro; template static auto initiate(Initiation initiation, experimental::use_coro_t tk, InitArgs&&... args) { return initiate_impl(std::move(initiation), std::allocator_arg, tk.get_allocator(), std::forward(args)...); } }; template struct async_result< experimental::use_coro_t, R(std::exception_ptr)> { template static auto initiate_impl(Initiation initiation, std::allocator_arg_t, Allocator, InitArgs... args) -> experimental::coro, Allocator> { co_await deferred_async_operation< R(std::exception_ptr), Initiation, InitArgs...>( deferred_init_tag{}, std::move(initiation), std::move(args)...); } template static auto initiate_impl( asio::detail::initiation_archetype, std::allocator_arg_t, Allocator, InitArgs... args) -> experimental::coro; template static auto initiate(Initiation initiation, experimental::use_coro_t tk, InitArgs&&... args) { return initiate_impl(std::move(initiation), std::allocator_arg, tk.get_allocator(), std::forward(args)...); } }; template struct async_result, R(T)> { template static auto initiate_impl(Initiation initiation, std::allocator_arg_t, Allocator, InitArgs... args) -> experimental::coro, Allocator> { co_return co_await deferred_async_operation( deferred_init_tag{}, std::move(initiation), std::move(args)...); } template static auto initiate_impl(asio::detail::initiation_archetype, std::allocator_arg_t, Allocator, InitArgs... args) -> experimental::coro; template static auto initiate(Initiation initiation, experimental::use_coro_t tk, InitArgs&&... args) { return initiate_impl(std::move(initiation), std::allocator_arg, tk.get_allocator(), std::forward(args)...); } }; template struct async_result< experimental::use_coro_t, R(asio::error_code, T)> { template static auto initiate_impl(Initiation initiation, std::allocator_arg_t, Allocator, InitArgs... args) -> experimental::coro, Allocator> { co_return co_await deferred_async_operation< R(asio::error_code, T), Initiation, InitArgs...>( deferred_init_tag{}, std::move(initiation), std::move(args)...); } template static auto initiate_impl( asio::detail::initiation_archetype< R(asio::error_code, T)>, std::allocator_arg_t, Allocator, InitArgs... args) -> experimental::coro; template static auto initiate(Initiation initiation, experimental::use_coro_t tk, InitArgs&&... args) { return initiate_impl(std::move(initiation), std::allocator_arg, tk.get_allocator(), std::forward(args)...); } }; template struct async_result< experimental::use_coro_t, R(std::exception_ptr, T)> { template static auto initiate_impl(Initiation initiation, std::allocator_arg_t, Allocator, InitArgs... args) -> experimental::coro, Allocator> { co_return co_await deferred_async_operation< R(std::exception_ptr, T), Initiation, InitArgs...>( deferred_init_tag{}, std::move(initiation), std::move(args)...); } template static auto initiate_impl( asio::detail::initiation_archetype, std::allocator_arg_t, Allocator, InitArgs... args) -> experimental::coro; template static auto initiate(Initiation initiation, experimental::use_coro_t tk, InitArgs&&... args) { return initiate_impl(std::move(initiation), std::allocator_arg, tk.get_allocator(), std::forward(args)...); } }; #endif // !defined(GENERATING_DOCUMENTATION) } // namespace asio #include "asio/detail/pop_options.hpp" #endif // ASIO_EXPERIMENTAL_IMPL_USE_CORO_HPP