Iros
 
Loading...
Searching...
No Matches
repeat_effect_until.h
Go to the documentation of this file.
1#pragma once
2
11#include "di/meta/util.h"
13
14namespace di::execution {
16 template<typename Send, typename Rec, typename Pred>
18 struct Type;
19 };
20
21 template<concepts::Sender Send, concepts::Receiver Rec, concepts::MovableValue Pred>
23
24 template<typename Send, typename Rec, typename Pred>
25 struct ReceiverT {
26 struct Type : ReceiverAdaptor<Type> {
28 friend Base;
29
30 public:
31 explicit Type(OperationState<Send, Rec, Pred>* data) : m_op_state(data) {}
32
33 auto base() const& -> Rec const& { return m_op_state->m_receiver; }
34 auto base() && -> Rec&& { return util::move(m_op_state->m_receiver); }
35
36 private:
37 void set_value() && { m_op_state->repeat_effect(); }
38
40 };
41 };
42
43 template<concepts::Sender Send, concepts::Receiver Rec, concepts::MovableValue Pred>
45
46 template<typename Send, typename Rec, typename Pred>
47 struct OperationStateT<Send, Rec, Pred>::Type : util::Immovable {
48 private:
50
51 public:
52 template<typename S>
53 explicit Type(Pred predicate, Rec receiver, S&& sender)
54 : m_predicate(util::move(predicate)), m_sender(util::forward<S>(sender)), m_receiver(util::move(receiver)) {
55 reconnect();
56 }
57
58 private:
59 void reconnect() {
60 m_op_state2.emplace(util::DeferConstruct([&] {
61 return execution::connect(util::as_const(m_sender), Receiver<Send, Rec, Pred>(this));
62 }));
63 }
64
65 void repeat_effect() {
66 if (function::invoke(m_predicate)) {
67 execution::set_value(util::move(m_receiver));
68 } else {
69 reconnect();
70 restart();
71 }
72 }
73
74 void restart() { execution::start(*m_op_state2); }
75
76 friend void tag_invoke(types::Tag<execution::start>, Type& self) { self.restart(); }
77
78 [[no_unique_address]] Pred m_predicate;
79 [[no_unique_address]] Send m_sender;
80 [[no_unique_address]] Rec m_receiver;
82 };
83
84 template<typename Send, typename Pred>
85 struct SenderT {
86 struct Type {
87 using is_sender = void;
88
89 [[no_unique_address]] Send sender;
90 [[no_unique_address]] Pred predicate;
91
92 private:
93 template<concepts::DecaysTo<Type> Self, typename Rec>
96 friend auto tag_invoke(types::Tag<connect>, Self&& self, Rec receiver) {
97 return OperationState<Send, Rec, Pred> { util::forward_like<Self>(self.predicate), util::move(receiver),
98 util::forward_like<Self>(self.sender) };
99 }
100
101 template<concepts::DecaysTo<Type> Self, typename Env>
106
107 constexpr friend auto tag_invoke(types::Tag<get_env>, Type const& self) {
108 return make_env(get_env(self.sender));
109 }
110 };
111 };
112
113 template<concepts::Sender Send, concepts::MovableValue Pred>
115
116 struct Function {
117 template<concepts::SenderOf<SetValue()> Send, concepts::MovableValue Pred>
119 constexpr auto operator()(Send&& sender, Pred&& predicate) const -> concepts::SenderOf<SetValue()> auto {
121 return function::tag_invoke(*this, util::forward<Send>(sender), util::forward<Pred>(predicate));
122 } else {
123 return Sender<meta::Decay<Send>, meta::Decay<Pred>> { util::forward<Send>(sender),
124 util::forward<Pred>(predicate) };
125 }
126 }
127 };
128}
129
131}
Definition defer_construct.h:8
Definition optional_forward_declaration.h:5
Definition operations.h:34
Definition relation.h:7
Definition sender_of.h:26
Definition sender_to.h:11
Definition tag_invoke.h:33
Definition repeat_effect_until.h:15
meta::Type< OperationStateT< Send, Rec, Pred > > OperationState
Definition repeat_effect_until.h:22
meta::Type< ReceiverT< Send, Rec, Pred > > Receiver
Definition repeat_effect_until.h:44
meta::Type< SenderT< Send, Pred > > Sender
Definition repeat_effect_until.h:114
Definition bulk.h:30
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 repeat_effect_until
Definition repeat_effect_until.h:130
constexpr auto get_env
Definition get_env.h:27
constexpr auto connect
Definition connect.h:42
constexpr auto repeat_effect
Definition repeat_effect.h:22
constexpr auto set_value
Definition set_value.h:14
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto invoke
Definition invoke.h:100
constexpr auto curry_back
Definition curry_back.h:141
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
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
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
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition vocab.h:96
constexpr auto forward_like(U &&value) -> decltype(auto)
Definition forward_like.h:8
constexpr auto data
Definition data.h:51
Definition set_value.h:6
Definition repeat_effect_until.h:116
constexpr auto operator()(Send &&sender, Pred &&predicate) const -> concepts::SenderOf< SetValue()> auto
Definition repeat_effect_until.h:119
Type(Pred predicate, Rec receiver, S &&sender)
Definition repeat_effect_until.h:53
friend void tag_invoke(types::Tag< execution::start >, Type &self)
Definition repeat_effect_until.h:76
auto base() const &-> Rec const &
Definition repeat_effect_until.h:33
ReceiverAdaptor< Type > Base
Definition repeat_effect_until.h:27
auto base() &&-> Rec &&
Definition repeat_effect_until.h:34
Type(OperationState< Send, Rec, Pred > *data)
Definition repeat_effect_until.h:31
Definition repeat_effect_until.h:25
Definition repeat_effect_until.h:86
friend auto tag_invoke(types::Tag< get_completion_signatures >, Self &&, Env &&) -> meta::MakeCompletionSignatures< Send const &, MakeEnv< Env > >
Definition repeat_effect_until.h:102
constexpr friend auto tag_invoke(types::Tag< get_env >, Type const &self)
Definition repeat_effect_until.h:107
Pred predicate
Definition repeat_effect_until.h:90
friend auto tag_invoke(types::Tag< connect >, Self &&self, Rec receiver)
Definition repeat_effect_until.h:96
Send sender
Definition repeat_effect_until.h:89
void is_sender
Definition repeat_effect_until.h:87
Definition repeat_effect_until.h:85
Definition immovable.h:4