123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- //
- // impl/as_tuple.hpp
- // ~~~~~~~~~~~~~~~~~
- //
- // Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com)
- //
- // 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_IMPL_AS_TUPLE_HPP
- #define ASIO_IMPL_AS_TUPLE_HPP
- #if defined(_MSC_VER) && (_MSC_VER >= 1200)
- # pragma once
- #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
- #include "asio/detail/config.hpp"
- #include <tuple>
- #include "asio/associator.hpp"
- #include "asio/async_result.hpp"
- #include "asio/detail/handler_cont_helpers.hpp"
- #include "asio/detail/type_traits.hpp"
- #include "asio/detail/push_options.hpp"
- namespace asio {
- namespace detail {
- // Class to adapt a as_tuple_t as a completion handler.
- template <typename Handler>
- class as_tuple_handler
- {
- public:
- typedef void result_type;
- template <typename CompletionToken>
- as_tuple_handler(as_tuple_t<CompletionToken> e)
- : handler_(static_cast<CompletionToken&&>(e.token_))
- {
- }
- template <typename RedirectedHandler>
- as_tuple_handler(RedirectedHandler&& h)
- : handler_(static_cast<RedirectedHandler&&>(h))
- {
- }
- template <typename... Args>
- void operator()(Args&&... args)
- {
- static_cast<Handler&&>(handler_)(
- std::make_tuple(static_cast<Args&&>(args)...));
- }
- //private:
- Handler handler_;
- };
- template <typename Handler>
- inline bool asio_handler_is_continuation(
- as_tuple_handler<Handler>* this_handler)
- {
- return asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
- template <typename Signature>
- struct as_tuple_signature;
- template <typename R, typename... Args>
- struct as_tuple_signature<R(Args...)>
- {
- typedef R type(std::tuple<decay_t<Args>...>);
- };
- template <typename R, typename... Args>
- struct as_tuple_signature<R(Args...) &>
- {
- typedef R type(std::tuple<decay_t<Args>...>) &;
- };
- template <typename R, typename... Args>
- struct as_tuple_signature<R(Args...) &&>
- {
- typedef R type(std::tuple<decay_t<Args>...>) &&;
- };
- #if defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
- template <typename R, typename... Args>
- struct as_tuple_signature<R(Args...) noexcept>
- {
- typedef R type(std::tuple<decay_t<Args>...>) noexcept;
- };
- template <typename R, typename... Args>
- struct as_tuple_signature<R(Args...) & noexcept>
- {
- typedef R type(std::tuple<decay_t<Args>...>) & noexcept;
- };
- template <typename R, typename... Args>
- struct as_tuple_signature<R(Args...) && noexcept>
- {
- typedef R type(std::tuple<decay_t<Args>...>) && noexcept;
- };
- #endif // defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
- } // namespace detail
- #if !defined(GENERATING_DOCUMENTATION)
- template <typename CompletionToken, typename... Signatures>
- struct async_result<as_tuple_t<CompletionToken>, Signatures...>
- : async_result<CompletionToken,
- typename detail::as_tuple_signature<Signatures>::type...>
- {
- template <typename Initiation>
- struct init_wrapper
- {
- init_wrapper(Initiation init)
- : initiation_(static_cast<Initiation&&>(init))
- {
- }
- template <typename Handler, typename... Args>
- void operator()(Handler&& handler, Args&&... args)
- {
- static_cast<Initiation&&>(initiation_)(
- detail::as_tuple_handler<decay_t<Handler>>(
- static_cast<Handler&&>(handler)),
- static_cast<Args&&>(args)...);
- }
- Initiation initiation_;
- };
- template <typename Initiation, typename RawCompletionToken, typename... Args>
- static auto initiate(Initiation&& initiation,
- RawCompletionToken&& token, Args&&... args)
- -> decltype(
- async_initiate<
- conditional_t<
- is_const<remove_reference_t<RawCompletionToken>>::value,
- const CompletionToken, CompletionToken>,
- typename detail::as_tuple_signature<Signatures>::type...>(
- init_wrapper<decay_t<Initiation>>(
- static_cast<Initiation&&>(initiation)),
- token.token_, static_cast<Args&&>(args)...))
- {
- return async_initiate<
- conditional_t<
- is_const<remove_reference_t<RawCompletionToken>>::value,
- const CompletionToken, CompletionToken>,
- typename detail::as_tuple_signature<Signatures>::type...>(
- init_wrapper<decay_t<Initiation>>(
- static_cast<Initiation&&>(initiation)),
- token.token_, static_cast<Args&&>(args)...);
- }
- };
- #if defined(ASIO_MSVC)
- // Workaround for MSVC internal compiler error.
- template <typename CompletionToken, typename Signature>
- struct async_result<as_tuple_t<CompletionToken>, Signature>
- : async_result<CompletionToken,
- typename detail::as_tuple_signature<Signature>::type>
- {
- template <typename Initiation>
- struct init_wrapper
- {
- init_wrapper(Initiation init)
- : initiation_(static_cast<Initiation&&>(init))
- {
- }
- template <typename Handler, typename... Args>
- void operator()(Handler&& handler, Args&&... args)
- {
- static_cast<Initiation&&>(initiation_)(
- detail::as_tuple_handler<decay_t<Handler>>(
- static_cast<Handler&&>(handler)),
- static_cast<Args&&>(args)...);
- }
- Initiation initiation_;
- };
- template <typename Initiation, typename RawCompletionToken, typename... Args>
- static auto initiate(Initiation&& initiation,
- RawCompletionToken&& token, Args&&... args)
- -> decltype(
- async_initiate<
- conditional_t<
- is_const<remove_reference_t<RawCompletionToken>>::value,
- const CompletionToken, CompletionToken>,
- typename detail::as_tuple_signature<Signature>::type>(
- init_wrapper<decay_t<Initiation>>(
- static_cast<Initiation&&>(initiation)),
- token.token_, static_cast<Args&&>(args)...))
- {
- return async_initiate<
- conditional_t<
- is_const<remove_reference_t<RawCompletionToken>>::value,
- const CompletionToken, CompletionToken>,
- typename detail::as_tuple_signature<Signature>::type>(
- init_wrapper<decay_t<Initiation>>(
- static_cast<Initiation&&>(initiation)),
- token.token_, static_cast<Args&&>(args)...);
- }
- };
- #endif // defined(ASIO_MSVC)
- template <template <typename, typename> class Associator,
- typename Handler, typename DefaultCandidate>
- struct associator<Associator,
- detail::as_tuple_handler<Handler>, DefaultCandidate>
- : Associator<Handler, DefaultCandidate>
- {
- static typename Associator<Handler, DefaultCandidate>::type get(
- const detail::as_tuple_handler<Handler>& h) noexcept
- {
- return Associator<Handler, DefaultCandidate>::get(h.handler_);
- }
- static auto get(const detail::as_tuple_handler<Handler>& h,
- const DefaultCandidate& c) noexcept
- -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
- {
- return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
- }
- };
- #endif // !defined(GENERATING_DOCUMENTATION)
- } // namespace asio
- #include "asio/detail/pop_options.hpp"
- #endif // ASIO_IMPL_AS_TUPLE_HPP
|