Iros
 
Loading...
Searching...
No Matches
repeat.h
Go to the documentation of this file.
1#pragma once
2
18#include "di/meta/constexpr.h"
19#include "di/meta/core.h"
20#include "di/meta/operations.h"
21#include "di/meta/util.h"
25#include "di/util/as_const.h"
27#include "di/util/immovable.h"
30
31namespace di::execution {
32namespace repeat_ns {
33 template<typename Op, typename Rec>
34 struct ReceiverT {
35 struct Type {
36 using is_receiver = void;
37
38 Op* op;
39
40 friend void tag_invoke(Tag<set_value>, Type&& self) { self.op->did_set_value(); }
41
42 friend void tag_invoke(Tag<set_stopped>, Type&& self) { self.op->did_set_stopped(); }
43
44 friend auto tag_invoke(Tag<get_env>, Type const& self) -> MakeEnv<meta::EnvOf<Rec>> {
45 return make_env(get_env(self.op->receiver()));
46 }
47 };
48 };
49
50 template<typename Op, typename Rec>
52
53 template<typename Send, typename Rec>
56 public:
61
62 explicit Type(Send sender, Rec reciever)
63 : m_sender(di::move(sender))
64 , m_receiver(di::move(reciever))
65 , m_stop_token(get_stop_token(get_env(m_receiver))) {}
66
69 if (m_stop_token.stop_requested()) {
70 set_stopped(di::move(m_receiver));
71 return;
72 }
73 }
74
75 auto& op = m_operation.emplace(DeferConstruct([&] {
76 return connect(set_next(m_receiver, auto(di::as_const(m_sender))), Receiver<Type, Rec>(this));
77 }));
78 start(op);
79 }
80
81 void did_set_stopped() { set_value(di::move(m_receiver)); }
82
83 auto receiver() const& { return m_receiver; }
84
85 private:
86 friend void tag_invoke(Tag<start>, Type& self) { self.did_set_value(); }
87
88 [[no_unique_address]] Send m_sender;
89 [[no_unique_address]] Rec m_receiver;
90 [[no_unique_address]] StopToken m_stop_token;
92 };
93 };
94
95 template<typename Send, typename Rec>
97
98 template<typename Send, typename Env>
99 using Sigs =
103
104 template<typename Send>
105 struct SequenceT {
106 struct Type {
108
109 Send sender;
110
111 template<concepts::Like<Type> Self, typename Env>
113 return {};
114 }
115
116 template<concepts::Like<Type> Self, typename Rec>
118 friend auto tag_invoke(Tag<subscribe>, Self&& self, Rec receiver) {
119 return OperationState<Send, Rec>(di::forward<Self>(self).sender, di::move(receiver));
120 }
121
122 friend auto tag_invoke(Tag<get_env>, Type const& self) {
124 }
125 };
126 };
127
128 template<typename Send>
130
131 struct Function {
132 template<concepts::Sender Send>
134 auto operator()(Send&& sender) const {
137 "Customizations of repeat() must return a sequence sender.");
138 } else {
139 return Sequence<Send>(di::forward<Send>(sender));
140 }
141 }
142 };
143}
144
150constexpr inline auto repeat = repeat_ns::Function {};
151}
Definition defer_construct.h:8
Definition optional_forward_declaration.h:5
#define DI_IMMOVABLE_NO_UNIQUE_ADDRESS
Definition compiler.h:15
Definition operations.h:34
Definition sequence_sender.h:102
Definition sequence_sender.h:128
Definition tag_invoke.h:33
Definition unstoppable_token.h:7
Definition repeat.h:32
meta::Type< SequenceT< meta::RemoveCVRef< Send > > > Sequence
Definition repeat.h:129
meta::Type< OperationStateT< Send, Rec > > OperationState
Definition repeat.h:96
meta::MakeCompletionSignatures< Send, MakeEnv< Env >, meta::Conditional< concepts::UnstoppableToken< meta::StopTokenOf< Env > >, CompletionSignatures< SetStopped()>, CompletionSignatures<> > > Sigs
Definition repeat.h:99
meta::Type< ReceiverT< Op, Rec > > Receiver
Definition repeat.h:51
Definition bulk.h:30
constexpr auto set_next
Set the next sender of a sequence.
Definition sequence_sender.h:77
constexpr auto repeat
Transform a copyable sender into an infinite sequence sender.
Definition repeat.h:150
constexpr auto start
Definition start.h:20
constexpr auto make_env
Create an environment with overrides for queries.
Definition make_env.h:147
constexpr auto set_stopped
Definition set_stopped.h:14
constexpr auto with
Specify an override for an environment query.
Definition make_env.h:112
constexpr auto is_always_lockstep_sequence
A query that returns whether or not a sequence is always lockstep.
Definition is_always_lockstep_sequence.h:53
constexpr auto get_stop_token
Definition get_stop_token.h:25
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
meta::RemoveCVRef< decltype(execution::get_stop_token(util::declval< T >()))> StopTokenOf
Definition stop_token_of.h:7
detail::ConditionalHelper< value, T, U >::Type Conditional
Definition core.h:88
T::Type Type
Definition core.h:26
decltype(execution::set_next(util::declval< meta::RemoveCVRef< Rec > & >(), util::declval< Send >())) NextSenderOf
Definition sequence_sender.h:82
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
Definition zstring_parser.h:9
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
Defines the sequence sender concepts and related CPOs.
Definition sequence_sender.h:86
Definition set_stopped.h:6
Definition repeat.h:131
meta::StopTokenOf< meta::EnvOf< Rec > > StopToken
Definition repeat.h:60
void did_set_stopped()
Definition repeat.h:81
meta::ConnectResult< NextSend, Re > Op
Definition repeat.h:59
Receiver< Type, Rec > Re
Definition repeat.h:58
Type(Send sender, Rec reciever)
Definition repeat.h:62
friend void tag_invoke(Tag< start >, Type &self)
Definition repeat.h:86
meta::NextSenderOf< Rec, Send > NextSend
Definition repeat.h:57
void did_set_value()
Definition repeat.h:67
auto receiver() const &
Definition repeat.h:83
friend void tag_invoke(Tag< set_stopped >, Type &&self)
Definition repeat.h:42
friend auto tag_invoke(Tag< get_env >, Type const &self) -> MakeEnv< meta::EnvOf< Rec > >
Definition repeat.h:44
void is_receiver
Definition repeat.h:36
friend void tag_invoke(Tag< set_value >, Type &&self)
Definition repeat.h:40
friend auto tag_invoke(Tag< subscribe >, Self &&self, Rec receiver)
Definition repeat.h:118
SequenceTag is_sender
Definition repeat.h:107
friend auto tag_invoke(Tag< get_completion_signatures >, Self &&, Env &&) -> Sigs< Send, Env >
Definition repeat.h:112
Send sender
Definition repeat.h:109
friend auto tag_invoke(Tag< get_env >, Type const &self)
Definition repeat.h:122
Definition completion_signuatures.h:7
Definition immovable.h:4