2 // execution/detail/bulk_sender.hpp
3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5 // Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com)
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
11 #ifndef BOOST_ASIO_EXECUTION_DETAIL_BULK_SENDER_HPP
12 #define BOOST_ASIO_EXECUTION_DETAIL_BULK_SENDER_HPP
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
18 #include <boost/asio/detail/config.hpp>
19 #include <boost/asio/detail/type_traits.hpp>
20 #include <boost/asio/execution/connect.hpp>
21 #include <boost/asio/execution/executor.hpp>
22 #include <boost/asio/execution/set_done.hpp>
23 #include <boost/asio/execution/set_error.hpp>
24 #include <boost/asio/traits/connect_member.hpp>
25 #include <boost/asio/traits/set_done_member.hpp>
26 #include <boost/asio/traits/set_error_member.hpp>
27 #include <boost/asio/traits/set_value_member.hpp>
29 #include <boost/asio/detail/push_options.hpp>
36 template <typename Receiver, typename Function, typename Number, typename Index>
39 typename remove_cvref<Receiver>::type receiver_;
40 typename decay<Function>::type f_;
41 typename decay<Number>::type n_;
43 template <typename R, typename F, typename N>
44 explicit bulk_receiver(BOOST_ASIO_MOVE_ARG(R) r,
45 BOOST_ASIO_MOVE_ARG(F) f, BOOST_ASIO_MOVE_ARG(N) n)
46 : receiver_(BOOST_ASIO_MOVE_CAST(R)(r)),
47 f_(BOOST_ASIO_MOVE_CAST(F)(f)),
48 n_(BOOST_ASIO_MOVE_CAST(N)(n))
54 for (Index i = 0; i < n_; ++i)
58 BOOST_ASIO_MOVE_OR_LVALUE(
59 typename remove_cvref<Receiver>::type)(receiver_));
62 template <typename Error>
63 void set_error(BOOST_ASIO_MOVE_ARG(Error) e) BOOST_ASIO_NOEXCEPT
66 BOOST_ASIO_MOVE_OR_LVALUE(
67 typename remove_cvref<Receiver>::type)(receiver_),
68 BOOST_ASIO_MOVE_CAST(Error)(e));
71 void set_done() BOOST_ASIO_NOEXCEPT
74 BOOST_ASIO_MOVE_OR_LVALUE(
75 typename remove_cvref<Receiver>::type)(receiver_));
79 template <typename Sender, typename Receiver,
80 typename Function, typename Number>
81 struct bulk_receiver_traits
83 typedef bulk_receiver<
84 Receiver, Function, Number,
85 typename execution::executor_index<
86 typename remove_cvref<Sender>::type
90 #if defined(BOOST_ASIO_HAS_MOVE)
91 typedef type arg_type;
92 #else // defined(BOOST_ASIO_HAS_MOVE)
93 typedef const type& arg_type;
94 #endif // defined(BOOST_ASIO_HAS_MOVE)
97 template <typename Sender, typename Function, typename Number>
98 struct bulk_sender : sender_base
100 typename remove_cvref<Sender>::type sender_;
101 typename decay<Function>::type f_;
102 typename decay<Number>::type n_;
104 template <typename S, typename F, typename N>
105 explicit bulk_sender(BOOST_ASIO_MOVE_ARG(S) s,
106 BOOST_ASIO_MOVE_ARG(F) f, BOOST_ASIO_MOVE_ARG(N) n)
107 : sender_(BOOST_ASIO_MOVE_CAST(S)(s)),
108 f_(BOOST_ASIO_MOVE_CAST(F)(f)),
109 n_(BOOST_ASIO_MOVE_CAST(N)(n))
113 template <typename Receiver>
114 typename connect_result<
115 BOOST_ASIO_MOVE_OR_LVALUE_TYPE(typename remove_cvref<Sender>::type),
116 typename bulk_receiver_traits<
117 Sender, Receiver, Function, Number
119 >::type connect(BOOST_ASIO_MOVE_ARG(Receiver) r,
122 typename remove_cvref<Sender>::type,
123 typename bulk_receiver_traits<
124 Sender, Receiver, Function, Number
127 >::type* = 0) BOOST_ASIO_RVALUE_REF_QUAL BOOST_ASIO_NOEXCEPT
129 return execution::connect(
130 BOOST_ASIO_MOVE_OR_LVALUE(typename remove_cvref<Sender>::type)(sender_),
131 typename bulk_receiver_traits<Sender, Receiver, Function, Number>::type(
132 BOOST_ASIO_MOVE_CAST(Receiver)(r),
133 BOOST_ASIO_MOVE_CAST(typename decay<Function>::type)(f_),
134 BOOST_ASIO_MOVE_CAST(typename decay<Number>::type)(n_)));
137 template <typename Receiver>
138 typename connect_result<
139 const typename remove_cvref<Sender>::type&,
140 typename bulk_receiver_traits<
141 Sender, Receiver, Function, Number
143 >::type connect(BOOST_ASIO_MOVE_ARG(Receiver) r,
146 const typename remove_cvref<Sender>::type&,
147 typename bulk_receiver_traits<
148 Sender, Receiver, Function, Number
151 >::type* = 0) const BOOST_ASIO_LVALUE_REF_QUAL BOOST_ASIO_NOEXCEPT
153 return execution::connect(sender_,
154 typename bulk_receiver_traits<Sender, Receiver, Function, Number>::type(
155 BOOST_ASIO_MOVE_CAST(Receiver)(r), f_, n_));
159 } // namespace detail
160 } // namespace execution
163 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
165 template <typename Receiver, typename Function, typename Number, typename Index>
166 struct set_value_member<
167 execution::detail::bulk_receiver<Receiver, Function, Number, Index>,
170 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
171 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
172 typedef void result_type;
175 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_VALUE_MEMBER_TRAIT)
177 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
179 template <typename Receiver, typename Function,
180 typename Number, typename Index, typename Error>
181 struct set_error_member<
182 execution::detail::bulk_receiver<Receiver, Function, Number, Index>,
185 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
186 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = true);
187 typedef void result_type;
190 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
192 #if !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
194 template <typename Receiver, typename Function, typename Number, typename Index>
195 struct set_done_member<
196 execution::detail::bulk_receiver<Receiver, Function, Number, Index> >
198 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
199 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = true);
200 typedef void result_type;
203 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_SET_DONE_MEMBER_TRAIT)
205 #if !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
207 template <typename Sender, typename Function,
208 typename Number, typename Receiver>
209 struct connect_member<
210 execution::detail::bulk_sender<Sender, Function, Number>,
213 execution::can_connect<
214 BOOST_ASIO_MOVE_OR_LVALUE_TYPE(typename remove_cvref<Sender>::type),
215 typename execution::detail::bulk_receiver_traits<
216 Sender, Receiver, Function, Number
221 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
222 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
223 typedef typename execution::connect_result<
224 BOOST_ASIO_MOVE_OR_LVALUE_TYPE(typename remove_cvref<Sender>::type),
225 typename execution::detail::bulk_receiver_traits<
226 Sender, Receiver, Function, Number
231 template <typename Sender, typename Function,
232 typename Number, typename Receiver>
233 struct connect_member<
234 const execution::detail::bulk_sender<Sender, Function, Number>,
237 execution::can_connect<
238 const typename remove_cvref<Sender>::type&,
239 typename execution::detail::bulk_receiver_traits<
240 Sender, Receiver, Function, Number
245 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_valid = true);
246 BOOST_ASIO_STATIC_CONSTEXPR(bool, is_noexcept = false);
247 typedef typename execution::connect_result<
248 const typename remove_cvref<Sender>::type&,
249 typename execution::detail::bulk_receiver_traits<
250 Sender, Receiver, Function, Number
255 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_CONNECT_MEMBER_TRAIT)
257 } // namespace traits
261 #include <boost/asio/detail/pop_options.hpp>
263 #endif // BOOST_ASIO_EXECUTION_DETAIL_BULK_SENDER_HPP