123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- //
- // experimental/detail/channel_send_functions.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_EXPERIMENTAL_DETAIL_CHANNEL_SEND_FUNCTIONS_HPP
- #define BOOST_ASIO_EXPERIMENTAL_DETAIL_CHANNEL_SEND_FUNCTIONS_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/async_result.hpp>
- #include <boost/asio/detail/completion_message.hpp>
- #include <boost/asio/detail/type_traits.hpp>
- #include <boost/system/error_code.hpp>
- #include <boost/asio/detail/push_options.hpp>
- namespace boost {
- namespace asio {
- namespace experimental {
- namespace detail {
- template <typename Derived, typename Executor, typename... Signatures>
- class channel_send_functions;
- template <typename Derived, typename Executor, typename R, typename... Args>
- class channel_send_functions<Derived, Executor, R(Args...)>
- {
- public:
- template <typename... Args2>
- enable_if_t<
- is_constructible<boost::asio::detail::completion_message<R(Args...)>,
- int, Args2...>::value,
- bool
- > try_send(Args2&&... args)
- {
- typedef boost::asio::detail::completion_message<R(Args...)> message_type;
- Derived* self = static_cast<Derived*>(this);
- return self->service_->template try_send<message_type>(
- self->impl_, false, static_cast<Args2&&>(args)...);
- }
- template <typename... Args2>
- enable_if_t<
- is_constructible<boost::asio::detail::completion_message<R(Args...)>,
- int, Args2...>::value,
- bool
- > try_send_via_dispatch(Args2&&... args)
- {
- typedef boost::asio::detail::completion_message<R(Args...)> message_type;
- Derived* self = static_cast<Derived*>(this);
- return self->service_->template try_send<message_type>(
- self->impl_, true, static_cast<Args2&&>(args)...);
- }
- template <typename... Args2>
- enable_if_t<
- is_constructible<boost::asio::detail::completion_message<R(Args...)>,
- int, Args2...>::value,
- std::size_t
- > try_send_n(std::size_t count, Args2&&... args)
- {
- typedef boost::asio::detail::completion_message<R(Args...)> message_type;
- Derived* self = static_cast<Derived*>(this);
- return self->service_->template try_send_n<message_type>(
- self->impl_, count, false, static_cast<Args2&&>(args)...);
- }
- template <typename... Args2>
- enable_if_t<
- is_constructible<boost::asio::detail::completion_message<R(Args...)>,
- int, Args2...>::value,
- std::size_t
- > try_send_n_via_dispatch(std::size_t count, Args2&&... args)
- {
- typedef boost::asio::detail::completion_message<R(Args...)> message_type;
- Derived* self = static_cast<Derived*>(this);
- return self->service_->template try_send_n<message_type>(
- self->impl_, count, true, static_cast<Args2&&>(args)...);
- }
- template <
- BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code))
- CompletionToken BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
- auto async_send(Args... args,
- CompletionToken&& token
- BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor))
- -> decltype(
- async_initiate<CompletionToken, void (boost::system::error_code)>(
- declval<typename conditional_t<false, CompletionToken,
- Derived>::initiate_async_send>(), token,
- declval<typename conditional_t<false, CompletionToken,
- Derived>::payload_type>()))
- {
- typedef typename Derived::payload_type payload_type;
- typedef boost::asio::detail::completion_message<R(Args...)> message_type;
- Derived* self = static_cast<Derived*>(this);
- return async_initiate<CompletionToken, void (boost::system::error_code)>(
- typename Derived::initiate_async_send(self), token,
- payload_type(message_type(0, static_cast<Args&&>(args)...)));
- }
- };
- template <typename Derived, typename Executor,
- typename R, typename... Args, typename... Signatures>
- class channel_send_functions<Derived, Executor, R(Args...), Signatures...> :
- public channel_send_functions<Derived, Executor, Signatures...>
- {
- public:
- using channel_send_functions<Derived, Executor, Signatures...>::try_send;
- using channel_send_functions<Derived, Executor, Signatures...>::async_send;
- template <typename... Args2>
- enable_if_t<
- is_constructible<boost::asio::detail::completion_message<R(Args...)>,
- int, Args2...>::value,
- bool
- > try_send(Args2&&... args)
- {
- typedef boost::asio::detail::completion_message<R(Args...)> message_type;
- Derived* self = static_cast<Derived*>(this);
- return self->service_->template try_send<message_type>(
- self->impl_, false, static_cast<Args2&&>(args)...);
- }
- template <typename... Args2>
- enable_if_t<
- is_constructible<boost::asio::detail::completion_message<R(Args...)>,
- int, Args2...>::value,
- bool
- > try_send_via_dispatch(Args2&&... args)
- {
- typedef boost::asio::detail::completion_message<R(Args...)> message_type;
- Derived* self = static_cast<Derived*>(this);
- return self->service_->template try_send<message_type>(
- self->impl_, true, static_cast<Args2&&>(args)...);
- }
- template <typename... Args2>
- enable_if_t<
- is_constructible<boost::asio::detail::completion_message<R(Args...)>,
- int, Args2...>::value,
- std::size_t
- > try_send_n(std::size_t count, Args2&&... args)
- {
- typedef boost::asio::detail::completion_message<R(Args...)> message_type;
- Derived* self = static_cast<Derived*>(this);
- return self->service_->template try_send_n<message_type>(
- self->impl_, count, false, static_cast<Args2&&>(args)...);
- }
- template <typename... Args2>
- enable_if_t<
- is_constructible<boost::asio::detail::completion_message<R(Args...)>,
- int, Args2...>::value,
- std::size_t
- > try_send_n_via_dispatch(std::size_t count, Args2&&... args)
- {
- typedef boost::asio::detail::completion_message<R(Args...)> message_type;
- Derived* self = static_cast<Derived*>(this);
- return self->service_->template try_send_n<message_type>(
- self->impl_, count, true, static_cast<Args2&&>(args)...);
- }
- template <
- BOOST_ASIO_COMPLETION_TOKEN_FOR(void (boost::system::error_code))
- CompletionToken BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
- auto async_send(Args... args,
- CompletionToken&& token
- BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(Executor))
- -> decltype(
- async_initiate<CompletionToken, void (boost::system::error_code)>(
- declval<typename conditional_t<false, CompletionToken,
- Derived>::initiate_async_send>(), token,
- declval<typename conditional_t<false, CompletionToken,
- Derived>::payload_type>()))
- {
- typedef typename Derived::payload_type payload_type;
- typedef boost::asio::detail::completion_message<R(Args...)> message_type;
- Derived* self = static_cast<Derived*>(this);
- return async_initiate<CompletionToken, void (boost::system::error_code)>(
- typename Derived::initiate_async_send(self), token,
- payload_type(message_type(0, static_cast<Args&&>(args)...)));
- }
- };
- } // namespace detail
- } // namespace experimental
- } // namespace asio
- } // namespace boost
- #include <boost/asio/detail/pop_options.hpp>
- #endif // BOOST_ASIO_EXPERIMENTAL_DETAIL_CHANNEL_SEND_FUNCTIONS_HPP
|