di 0.1.0
Loading...
Searching...
No Matches
connect.h
Go to the documentation of this file.
1#pragma once
2
11
12namespace di::execution {
13namespace detail {
14 struct ConnectFunction;
15
16 template<typename Sender, typename Receiver>
17 concept CustomConnect =
18 concepts::Sender<Sender> &&
19 concepts::ReceiverOf<Receiver, meta::CompletionSignaturesOf<Sender, meta::EnvOf<Receiver>>> &&
20 concepts::TagInvocable<ConnectFunction, Sender, Receiver>;
21
22 template<typename Sender, typename Receiver>
23 concept AwaitableConnect = requires(Sender&& sender, Receiver&& receiver) {
24 connect_awaitable_ns::connect_awaitable(util::forward<Sender>(sender), util::forward<Receiver>(receiver));
25 };
26
27 struct ConnectFunction {
28 template<typename Sender, typename Receiver>
29 requires(CustomConnect<Sender, Receiver> || AwaitableConnect<Sender, Receiver> ||
30 concepts::DebugEnv<meta::EnvOf<Receiver>>)
31 constexpr auto operator()(Sender&& sender, Receiver&& receiver) const -> concepts::OperationState auto {
32 if constexpr (CustomConnect<Sender, Receiver>) {
33 return function::tag_invoke(*this, util::forward<Sender>(sender), util::forward<Receiver>(receiver));
34 } else if constexpr (AwaitableConnect<Sender, Receiver>) {
35 return connect_awaitable_ns::connect_awaitable(util::forward<Sender>(sender),
36 util::forward<Receiver>(receiver));
37 }
38 }
39 };
40}
41
42constexpr inline auto connect = detail::ConnectFunction {};
43}
meta::Type< ReceiverT< meta::Decay< Shape >, meta::Decay< Function >, meta::Decay< Rec > > > Receiver
Definition bulk.h:80
meta::Type< SenderT< meta::RemoveCVRef< Send >, meta::Decay< Shape >, meta::Decay< Function > > > Sender
Definition bulk.h:155
constexpr auto connect_awaitable
Definition connect_awaitable.h:173
Definition bulk.h:30
constexpr auto connect
Definition connect.h:42
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22