123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- //
- // impl/append.hpp
- // ~~~~~~~~~~~~~~~
- //
- // Copyright (c) 2003-2024 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 BOOST_ASIO_IMPL_APPEND_HPP
- #define BOOST_ASIO_IMPL_APPEND_HPP
- #if defined(_MSC_VER) && (_MSC_VER >= 1200)
- # pragma once
- #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
- #include <boost/asio/detail/config.hpp>
- #include <boost/asio/associator.hpp>
- #include <boost/asio/async_result.hpp>
- #include <boost/asio/detail/handler_cont_helpers.hpp>
- #include <boost/asio/detail/type_traits.hpp>
- #include <boost/asio/detail/utility.hpp>
- #include <boost/asio/detail/push_options.hpp>
- namespace boost {
- namespace asio {
- namespace detail {
- // Class to adapt an append_t as a completion handler.
- template <typename Handler, typename... Values>
- class append_handler
- {
- public:
- typedef void result_type;
- template <typename H>
- append_handler(H&& handler, std::tuple<Values...> values)
- : handler_(static_cast<H&&>(handler)),
- values_(static_cast<std::tuple<Values...>&&>(values))
- {
- }
- template <typename... Args>
- void operator()(Args&&... args)
- {
- this->invoke(
- index_sequence_for<Values...>{},
- static_cast<Args&&>(args)...);
- }
- template <std::size_t... I, typename... Args>
- void invoke(index_sequence<I...>, Args&&... args)
- {
- static_cast<Handler&&>(handler_)(
- static_cast<Args&&>(args)...,
- static_cast<Values&&>(std::get<I>(values_))...);
- }
- //private:
- Handler handler_;
- std::tuple<Values...> values_;
- };
- template <typename Handler>
- inline bool asio_handler_is_continuation(
- append_handler<Handler>* this_handler)
- {
- return boost_asio_handler_cont_helpers::is_continuation(
- this_handler->handler_);
- }
- template <typename Signature, typename... Values>
- struct append_signature;
- template <typename R, typename... Args, typename... Values>
- struct append_signature<R(Args...), Values...>
- {
- typedef R type(decay_t<Args>..., Values...);
- };
- } // namespace detail
- #if !defined(GENERATING_DOCUMENTATION)
- template <typename CompletionToken, typename... Values, typename Signature>
- struct async_result<append_t<CompletionToken, Values...>, Signature>
- : async_result<CompletionToken,
- typename detail::append_signature<
- Signature, Values...>::type>
- {
- typedef typename detail::append_signature<
- Signature, Values...>::type signature;
- template <typename Initiation>
- struct init_wrapper
- {
- init_wrapper(Initiation init)
- : initiation_(static_cast<Initiation&&>(init))
- {
- }
- template <typename Handler, typename... Args>
- void operator()(Handler&& handler,
- std::tuple<Values...> values, Args&&... args)
- {
- static_cast<Initiation&&>(initiation_)(
- detail::append_handler<decay_t<Handler>, Values...>(
- static_cast<Handler&&>(handler),
- static_cast<std::tuple<Values...>&&>(values)),
- 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<CompletionToken, signature>(
- declval<init_wrapper<decay_t<Initiation>>>(),
- token.token_,
- static_cast<std::tuple<Values...>&&>(token.values_),
- static_cast<Args&&>(args)...))
- {
- return async_initiate<CompletionToken, signature>(
- init_wrapper<decay_t<Initiation>>(
- static_cast<Initiation&&>(initiation)),
- token.token_,
- static_cast<std::tuple<Values...>&&>(token.values_),
- static_cast<Args&&>(args)...);
- }
- };
- template <template <typename, typename> class Associator,
- typename Handler, typename... Values, typename DefaultCandidate>
- struct associator<Associator,
- detail::append_handler<Handler, Values...>, DefaultCandidate>
- : Associator<Handler, DefaultCandidate>
- {
- static typename Associator<Handler, DefaultCandidate>::type get(
- const detail::append_handler<Handler, Values...>& h) noexcept
- {
- return Associator<Handler, DefaultCandidate>::get(h.handler_);
- }
- static auto get(const detail::append_handler<Handler, Values...>& 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
- } // namespace boost
- #include <boost/asio/detail/pop_options.hpp>
- #endif // BOOST_ASIO_IMPL_APPEND_HPP
|