Iros
 
Loading...
Searching...
No Matches
on.h
Go to the documentation of this file.
1#pragma once
2
14#include "di/util/declval.h"
16
17namespace di::execution {
18namespace on_ns {
19 template<typename Send, typename Rec, typename Sched>
21 struct Type;
22 };
23
24 template<concepts::Sender Send, concepts::Receiver Rec, concepts::Scheduler Sched>
26
27 template<typename Base, concepts::Scheduler Sched>
29
30 template<typename Send, typename Rec, typename Sched>
32 struct Type : ReceiverAdaptor<Type> {
33 private:
34 using Base = ReceiverAdaptor<Type>;
35 friend Base;
36
37 public:
38 explicit Type(OperationState<Send, Rec, Sched>* operation_state) : m_operation_state(operation_state) {}
39
40 auto base() const& -> Rec const& { return m_operation_state->receiver; }
41 auto base() && -> Rec&& { return util::move(m_operation_state->receiver); }
42
43 private:
44 auto get_env() const& -> Env<meta::EnvOf<Rec>, Sched> {
45 return make_env(execution::get_env(base()), with(get_scheduler, m_operation_state->scheduler));
46 }
47
48 OperationState<Send, Rec, Sched>* m_operation_state;
49 };
50 };
51
52 template<concepts::Sender Send, concepts::Receiver Rec, concepts::Scheduler Sched>
54
55 template<typename Send, typename Rec, typename Sched>
56 struct ReceiverT {
57 struct Type : ReceiverAdaptor<Type> {
58 private:
59 using Base = ReceiverAdaptor<Type>;
60 friend Base;
61
62 public:
63 explicit Type(OperationState<Send, Rec, Sched>* operation_state) : m_operation_state(operation_state) {}
64
65 auto base() const& -> Rec const& { return m_operation_state->receiver; }
66 auto base() && -> Rec&& { return util::move(m_operation_state->receiver); }
67
68 private:
69 void set_value() && { m_operation_state->phase2(); }
70
71 OperationState<Send, Rec, Sched>* m_operation_state;
72 };
73 };
74
75 template<concepts::Sender Send, concepts::Receiver Rec, concepts::Scheduler Sched>
77
78 template<typename Send, typename Rec, typename Sched>
79 struct OperationStateT<Send, Rec, Sched>::Type : util::Immovable {
80 public:
81 [[no_unique_address]] Sched scheduler;
82 [[no_unique_address]] Send sender;
83 [[no_unique_address]] Rec receiver;
87
88 template<typename S>
90 explicit Type(Sched scheduler_, S&& sender_, Rec receiver_)
91 : scheduler(util::move(scheduler_))
92 , sender(util::forward<S>(sender_))
93 , receiver(util::move(receiver_))
97 })) {}
98
99 void phase2() {
100 operation_state.template emplace<1>(util::DeferConstruct([&] {
101 return execution::connect(util::move(sender), ReceiverWithEnv<Send, Rec, Sched> { this });
102 }));
104 }
105
106 private:
110 };
111
112 template<typename Send, typename Sched>
113 struct SenderT {
114 struct Type {
115 using is_sender = void;
116
117 [[no_unique_address]] Sched scheduler;
118 [[no_unique_address]] Send sender;
119
120 private:
121 template<concepts::DecaysTo<Type> Self, typename Rec>
124 friend auto tag_invoke(types::Tag<connect>, Self&& self, Rec receiver) {
126 util::forward_like<Self>(self.sender), util::move(receiver) };
127 }
128
129 template<concepts::DecaysTo<Type> Self, typename E>
137
138 constexpr friend auto tag_invoke(types::Tag<get_env>, Type const& self) {
139 return make_env(get_env(self.sender));
140 }
141 };
142 };
143
144 template<concepts::Sender Send, concepts::Scheduler Sched>
146
147 struct Function {
148 template<concepts::Scheduler Sched, concepts::Sender Send>
149 auto operator()(Sched&& scheduler, Send&& sender) const -> concepts::Sender auto {
151 return function::tag_invoke(*this, util::forward<Sched>(scheduler), util::forward<Send>(sender));
152 } else {
153 return Sender<meta::Decay<Send>, meta::Decay<Sched>> { util::forward<Sched>(scheduler),
154 util::forward<Send>(sender) };
155 }
156 }
157 };
158}
159
167constexpr inline auto on = on_ns::Function {};
168}
Definition defer_construct.h:8
Definition variant_forward_declaration.h:6
Definition operations.h:11
Definition sender_to.h:11
Definition sender.h:11
Definition tag_invoke.h:33
Definition on.h:18
meta::Type< SenderT< Send, Sched > > Sender
Definition on.h:145
meta::Type< ReceiverT< Send, Rec, Sched > > Receiver
Definition on.h:76
MakeEnv< Base, With< types::Tag< get_scheduler >, Sched > > Env
Definition on.h:28
meta::Type< OperationStateT< Send, Rec, Sched > > OperationState
Definition on.h:25
meta::Type< ReceiverWithEnvT< Send, Rec, Sched > > ReceiverWithEnv
Definition on.h:53
Definition bulk.h:30
constexpr auto schedule
Definition schedule.h:17
constexpr auto start
Definition start.h:20
constexpr auto make_env
Create an environment with overrides for queries.
Definition make_env.h:147
meta::Type< receiver_interface_ns::ReceiverAdaptor< Self, Base > > ReceiverAdaptor
Definition receiver_adaptor.h:236
constexpr auto with
Specify an override for an environment query.
Definition make_env.h:112
constexpr auto get_scheduler
Definition get_scheduler.h:20
decltype(make_env(util::declval< BaseEnv >(), util::declval< Withs >()...)) MakeEnv
Represent an environment with overrides for queries.
Definition make_env.h:189
constexpr auto get_env
Definition get_env.h:27
constexpr auto connect
Definition connect.h:42
constexpr auto set_value
Definition set_value.h:14
constexpr auto on
Definition on.h:167
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
Definition merge_interfaces.h:6
T::Type Type
Definition core.h:26
Conditional< concepts::LanguageArray< RemoveReference< T > >, RemoveExtent< RemoveReference< T > > *, Conditional< concepts::LanguageFunction< RemoveReference< T > >, AddPointer< RemoveReference< T > >, RemoveCVRef< T > > > Decay
Definition language.h:574
Type< detail::LikeHelper< T, U > > Like
Definition language.h:468
Type< detail::MakeCompletionSignaturesHelper< ExtraSigs, meta::ValueTypesOf< Send, Env, SetValue, meta::List >, meta::Transform< meta::ErrorTypesOf< Send, Env, meta::List >, meta::Quote< SetError > >, meta::Conditional< meta::sends_stopped< Send, Env >, SetStopped, types::CompletionSignatures<> > > > MakeCompletionSignatures
Definition make_completion_signatures.h:36
decltype(execution::connect(util::declval< Send >(), util::declval< Rec >())) ConnectResult
Definition connect_result.h:7
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
constexpr auto forward_like(U &&value) -> decltype(auto)
Definition forward_like.h:8
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
auto operator()(Sched &&scheduler, Send &&sender) const -> concepts::Sender auto
Definition on.h:149
Variant< meta::ConnectResult< meta::ScheduleResult< Sched >, Receiver< Send, Rec, Sched > >, meta::ConnectResult< Send, ReceiverWithEnv< Send, Rec, Sched > > > operation_state
Definition on.h:86
Type(Sched scheduler_, S &&sender_, Rec receiver_)
Definition on.h:90
friend void tag_invoke(types::Tag< execution::start >, Type &self)
Definition on.h:107
Type(OperationState< Send, Rec, Sched > *operation_state)
Definition on.h:63
auto base() const &-> Rec const &
Definition on.h:65
auto base() &&-> Rec &&
Definition on.h:66
auto base() &&-> Rec &&
Definition on.h:41
auto base() const &-> Rec const &
Definition on.h:40
Type(OperationState< Send, Rec, Sched > *operation_state)
Definition on.h:38
void is_sender
Definition on.h:115
friend auto tag_invoke(types::Tag< get_completion_signatures >, Self &&, E &&) -> meta::MakeCompletionSignatures< meta::Like< Self, Send >, Env< E, Sched >, meta::MakeCompletionSignatures< meta::ScheduleResult< Sched >, MakeEnv< E >, CompletionSignatures<>, meta::TypeConstant< CompletionSignatures<> >::template Invoke > >
Definition on.h:130
friend auto tag_invoke(types::Tag< connect >, Self &&self, Rec receiver)
Definition on.h:124
Send sender
Definition on.h:118
constexpr friend auto tag_invoke(types::Tag< get_env >, Type const &self)
Definition on.h:138
Sched scheduler
Definition on.h:117
Definition core.h:18
Definition completion_signuatures.h:7
Definition immovable.h:4