20template <PrepFuncLike PrepFunc, CQEHandlerLike CQEHandler>
class OpSender {
22 using ReturnType = std::invoke_result_t<CQEHandler &, io_uring_cqe *>;
24 OpSender(PrepFunc func, CQEHandler cqe_handler)
25 : prep_func_(std::move(func)), cqe_handler_(std::move(cqe_handler)) {}
27 template <
typename Receiver>
auto connect(Receiver receiver)
noexcept {
28 return detail::OpSenderOperationState<
29 OpFinishHandle<CQEHandler, Receiver>, PrepFunc>(
30 std::move(prep_func_), std::move(cqe_handler_),
36 CQEHandler cqe_handler_;
39template <PrepFuncLike PrepFunc, CQEHandlerLike CQEHandler,
40 typename MultiShotFunc>
41class MultiShotOpSender {
43 using ReturnType = std::invoke_result_t<CQEHandler &, io_uring_cqe *>;
45 MultiShotOpSender(PrepFunc func, CQEHandler cqe_handler,
46 MultiShotFunc multi_shot_func)
47 : prep_func_(std::move(func)), cqe_handler_(std::move(cqe_handler)),
48 multi_shot_func_(std::move(multi_shot_func)) {}
50 template <
typename Receiver>
auto connect(Receiver receiver)
noexcept {
51 return detail::OpSenderOperationState<
52 MultiShotOpFinishHandle<CQEHandler, MultiShotFunc, Receiver>,
53 PrepFunc>(std::move(prep_func_), std::move(cqe_handler_),
54 std::move(receiver), std::move(multi_shot_func_));
59 CQEHandler cqe_handler_;
60 MultiShotFunc multi_shot_func_;
63template <PrepFuncLike PrepFunc, CQEHandlerLike CQEHandler,
typename FreeFunc>
64class ZeroCopyOpSender {
66 using ReturnType = std::invoke_result_t<CQEHandler &, io_uring_cqe *>;
68 ZeroCopyOpSender(PrepFunc func, CQEHandler cqe_handler, FreeFunc free_func)
69 : prep_func_(std::move(func)), cqe_handler_(std::move(cqe_handler)),
70 free_func_(std::move(free_func)) {}
72 template <
typename Receiver>
auto connect(Receiver receiver)
noexcept {
73 return detail::OpSenderOperationState<
74 ZeroCopyOpFinishHandle<CQEHandler, FreeFunc, Receiver>, PrepFunc>(
75 std::move(prep_func_), std::move(cqe_handler_), std::move(receiver),
76 std::move(free_func_));
81 CQEHandler cqe_handler_;
85template <
unsigned int Flags,
typename Sender>
class FlaggedOpSender {
87 using ReturnType =
typename Sender::ReturnType;
89 FlaggedOpSender(Sender sender) : sender_(std::move(sender)) {}
91 template <
typename Receiver>
auto connect(Receiver receiver)
noexcept {
92 return detail::FlaggedOpState<Flags, Sender, Receiver>(
93 std::move(sender_), std::move(receiver));
100template <
typename... Senders>
class ParallelAllSender {
102 using ReturnType = std::pair<std::array<size_t,
sizeof...(Senders)>,
103 std::tuple<typename Senders::ReturnType...>>;
105 ParallelAllSender(Senders... senders) : senders_(std::move(senders)...) {}
107 template <
typename Receiver>
auto connect(Receiver receiver)
noexcept {
108 return detail::ParallelAllOperationState<Receiver, Senders...>(
109 std::move(senders_), std::move(receiver));
113 std::tuple<Senders...> senders_;
116template <
typename... Senders>
class ParallelAnySender {
118 using ReturnType = std::pair<std::array<size_t,
sizeof...(Senders)>,
119 std::tuple<typename Senders::ReturnType...>>;
121 ParallelAnySender(Senders... senders) : senders_(std::move(senders)...) {}
123 template <
typename Receiver>
auto connect(Receiver receiver)
noexcept {
124 return detail::ParallelAnyOperationState<Receiver, Senders...>(
125 std::move(senders_), std::move(receiver));
129 std::tuple<Senders...> senders_;
132template <
typename... Senders>
class WhenAllSender {
134 using ReturnType = std::tuple<
typename Senders::ReturnType...>;
136 WhenAllSender(Senders... senders) : senders_(std::move(senders)...) {}
138 template <
typename S,
typename... Ss>
139 WhenAllSender(WhenAllSender<Ss...> other, S sender)
140 : senders_(std::tuple_cat(std::move(other.senders_),
141 std::make_tuple(std::move(sender)))) {}
143 template <
typename Receiver>
auto connect(Receiver receiver)
noexcept {
144 return detail::WhenAllOperationState<Receiver, Senders...>(
145 std::move(senders_), std::move(receiver));
149 std::tuple<Senders...> senders_;
151 template <
typename...>
friend class WhenAllSender;
154template <
typename... Senders>
class WhenAnySender {
156 using ReturnType = std::variant<
typename Senders::ReturnType...>;
158 WhenAnySender(Senders... senders) : senders_(std::move(senders)...) {}
160 template <
typename S,
typename... Ss>
161 WhenAnySender(WhenAnySender<Ss...> other, S sender)
162 : senders_(std::tuple_cat(std::move(other.senders_),
163 std::make_tuple(std::move(sender)))) {}
165 template <
typename Receiver>
auto connect(Receiver receiver)
noexcept {
166 return detail::WhenAnyOperationState<Receiver, Senders...>(
167 std::move(senders_), std::move(receiver));
171 std::tuple<Senders...> senders_;
173 template <
typename...>
friend class WhenAnySender;
176template <
unsigned int Flags,
typename... Senders>
class LinkSenderBase {
178 using ReturnType = std::tuple<
typename Senders::ReturnType...>;
180 LinkSenderBase(Senders... senders) : senders_(std::move(senders)...) {}
182 template <
typename S,
typename... Ss>
183 LinkSenderBase(LinkSenderBase<Flags, Ss...> other, S sender)
184 : senders_(std::tuple_cat(std::move(other.senders_),
185 std::make_tuple(std::move(sender)))) {}
187 template <
typename Receiver>
auto connect(Receiver receiver)
noexcept {
188 return detail::LinkOperationState<Receiver, Flags, Senders...>(
189 std::move(senders_), std::move(receiver));
193 std::tuple<Senders...> senders_;
195 template <
unsigned int,
typename...>
friend class LinkSenderBase;
198template <
typename... Senders>
199using LinkSender = LinkSenderBase<IOSQE_IO_LINK, Senders...>;
201template <
typename... Senders>
202using HardLinkSender = LinkSenderBase<IOSQE_IO_HARDLINK, Senders...>;
204template <
typename Sender>
class RangedParallelAllSender {
206 using ReturnType = std::pair<std::vector<size_t>,
207 std::vector<typename Sender::ReturnType>>;
209 RangedParallelAllSender(std::vector<Sender> senders)
210 : senders_(std::move(senders)) {}
212 template <
typename Receiver>
auto connect(Receiver receiver)
noexcept {
213 return detail::RangedParallelAllOperationState<Receiver, Sender>(
214 std::move(senders_), std::move(receiver));
218 std::vector<Sender> senders_;
221template <
typename Sender>
class RangedParallelAnySender {
223 using ReturnType = std::pair<std::vector<size_t>,
224 std::vector<typename Sender::ReturnType>>;
226 RangedParallelAnySender(std::vector<Sender> senders)
227 : senders_(std::move(senders)) {}
229 template <
typename Receiver>
auto connect(Receiver receiver)
noexcept {
230 return detail::RangedParallelAnyOperationState<Receiver, Sender>(
231 std::move(senders_), std::move(receiver));
235 std::vector<Sender> senders_;
238template <
typename Sender>
class RangedWhenAllSender {
240 using ReturnType = std::vector<typename Sender::ReturnType>;
242 RangedWhenAllSender(std::vector<Sender> senders)
243 : senders_(std::move(senders)) {}
245 template <
typename Receiver>
auto connect(Receiver receiver)
noexcept {
246 return detail::WhenAllRangeOperationState<Receiver, Sender>(
247 std::move(senders_), std::move(receiver));
251 std::vector<Sender> senders_;
254template <
typename Sender>
class RangedWhenAnySender {
256 using ReturnType = std::pair<size_t, typename Sender::ReturnType>;
258 RangedWhenAnySender(std::vector<Sender> senders)
259 : senders_(std::move(senders)) {
260 if (senders_.empty()) {
261 throw std::invalid_argument(
262 "when_any requires at least one sender");
266 template <
typename Receiver>
auto connect(Receiver receiver)
noexcept {
267 return detail::WhenAnyRangeOperationState<Receiver, Sender>(
268 std::move(senders_), std::move(receiver));
272 std::vector<Sender> senders_;
275template <
unsigned int Flags,
typename Sender>
class RangedLinkSenderBase {
277 using ReturnType = std::vector<typename Sender::ReturnType>;
279 RangedLinkSenderBase(std::vector<Sender> senders)
280 : senders_(std::move(senders)) {}
282 template <
typename Receiver>
auto connect(Receiver receiver)
noexcept {
283 return detail::RangedLinkOperationState<Receiver, Flags, Sender>(
284 std::move(senders_), std::move(receiver));
288 std::vector<Sender> senders_;
291template <
typename Sender>
292using RangedLinkSender = RangedLinkSenderBase<IOSQE_IO_LINK, Sender>;
294template <
typename Sender>
295using RangedHardLinkSender = RangedLinkSenderBase<IOSQE_IO_HARDLINK, Sender>;
The main namespace for the Condy library.
Operation state implementations for various operations.