Iros
 
Loading...
Searching...
No Matches
from_container.h
Go to the documentation of this file.
1#pragma once
2
29#include "di/meta/constexpr.h"
30#include "di/meta/core.h"
31#include "di/meta/util.h"
35#include "di/util/addressof.h"
37#include "di/util/immovable.h"
38#include "di/util/move.h"
40
41namespace di::execution {
43 template<typename Con, typename Rec>
44 struct DataT {
45 struct Type {
49
50 explicit Type(Con container_, Rec receiver_)
51 : container(util::move(container_))
52 , receiver(util::move(receiver_))
55
56 [[no_unique_address]] Con container;
57 [[no_unique_address]] Rec receiver;
58 [[no_unique_address]] Iterator iterator;
59 [[no_unique_address]] StopToken stop_token;
60 };
61 };
62
63 template<concepts::InputContainer Con, concepts::Receiver Rec>
65
66 template<typename Con, typename Rec>
68 struct Type;
69 };
70
71 template<concepts::InputContainer Con, concepts::Receiver Rec>
73
74 template<typename Con, typename Rec>
76 struct Type {
77 using is_receiver = void;
78
80
81 friend void tag_invoke(types::Tag<set_value>, Type&& self) { self.op->report_value(); }
82 friend void tag_invoke(types::Tag<set_stopped>, Type&& self) { self.op->report_stopped(); }
83 };
84 };
85
86 template<concepts::InputContainer Con, concepts::Receiver Rec>
88
89 template<typename Con, typename Rec, typename R>
92 public:
93 explicit Type(Data<Con, Rec>* data, R receiver) : m_data(data), m_receiver(util::move(receiver)) {}
94
95 private:
96 friend void tag_invoke(types::Tag<start>, Type& self) {
97 auto&& value = container::iterator_move(self.m_data->iterator);
98 ++self.m_data->iterator;
99 set_value(util::move(self.m_receiver), util::forward<decltype(value)>(value));
100 }
101
102 Data<Con, Rec>* m_data;
103 [[no_unique_address]] R m_receiver;
104 };
105 };
106
107 template<concepts::InputContainer Con, concepts::Receiver Rec, concepts::Receiver R>
109
110 template<typename Con, typename Rec>
111 struct NextSenderT {
112 struct Type {
113 using is_sender = void;
114
116
118
119 template<concepts::ReceiverOf<CompletionSignatures> R>
120 friend auto tag_invoke(types::Tag<connect>, Type&& self, R receiver) {
121 return NextOperationState<Con, Rec, R>(self.data, util::move(receiver));
122 }
123 };
124 };
125
126 template<concepts::InputContainer Con, concepts::Receiver Rec>
128
129 template<typename Con, typename Rec>
131 public:
137
138 explicit Type(Con container, Rec receiver) : m_data(util::move(container), util::move(receiver)) {}
139
141 if (m_data.iterator == container::end(m_data.container)) {
142 return set_value(util::move(m_data.receiver));
143 }
144
145 m_operation.emplace(util::DeferConstruct([&] {
146 return connect(set_next(m_data.receiver, NextSender<Con, Rec>(util::addressof(m_data))),
147 Receiver(this));
148 }));
149 start(*m_operation);
150 }
151
152 void report_stopped() { set_value(util::move(m_data.receiver)); }
153
154 private:
155 friend void tag_invoke(types::Tag<start>, Type& self) { self.report_value(); }
156
157 [[no_unique_address]] Data<Con, Rec> m_data;
159 };
160
161 template<typename Con, typename Env>
163
164 template<typename Con>
165 struct SequenceT {
166 struct Type {
168
169 [[no_unique_address]] Con container;
170
171 template<concepts::RemoveCVRefSameAs<Type> Self, typename Rec>
174 friend auto tag_invoke(types::Tag<subscribe>, Self&& self, Rec receiver) {
175 return OperationState<Con, Rec>(util::forward<Self>(self).container, util::move(receiver));
176 }
177
178 template<concepts::RemoveCVRefSameAs<Type> Self, typename Env>
181 return {};
182 }
183
187 };
188 };
189
190 template<concepts::InputContainer Con>
193
195
197 template<concepts::InputContainer Con>
199 auto operator()(Con&& container) const {
200 return Sequence<Con>(util::forward<Con>(container));
201 }
202
203 template<concepts::InputContainer Con>
205 auto operator()(ValidLifetimeTag, Con&& container) const {
206 return Sequence<Con>(util::forward<Con>(container));
207 }
208 };
209}
210
215
230}
Definition defer_construct.h:8
Definition optional_forward_declaration.h:5
#define DI_IMMOVABLE_NO_UNIQUE_ADDRESS
Definition compiler.h:15
Definition util.h:71
Definition sequence_sender.h:128
Definition view.h:10
Definition sequence.h:12
constexpr auto iterator_move
Definition iterator_move.h:56
constexpr auto end
Definition end.h:47
Definition from_container.h:42
meta::Type< DataT< Con, Rec > > Data
Definition from_container.h:64
types::CompletionSignatures< SetValue(meta::ContainerRValue< Con >)> Signatures
Definition from_container.h:162
meta::Type< NextSenderT< Con, Rec > > NextSender
Definition from_container.h:127
meta::Type< NextOperationStateT< Con, Rec, R > > NextOperationState
Definition from_container.h:108
meta::Type< SequenceT< meta::Decay< Con > > > Sequence
Definition from_container.h:192
meta::Type< OperationStateT< Con, Rec > > OperationState
Definition from_container.h:72
meta::Type< NextReceiverT< Con, Rec > > NextReceiver
Definition from_container.h:87
Definition bulk.h:30
constexpr auto set_next
Set the next sender of a sequence.
Definition sequence_sender.h:77
constexpr auto from_container
Creates a sequence sender from a container.
Definition from_container.h:229
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 valid_lifetime
Tag type to indicate that the container lifetime is valid for the async sequence.
Definition from_container.h:214
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
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
IteratorRValue< ContainerIterator< T > > ContainerRValue
Definition container_rvalue.h:8
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
decltype(execution::set_next(util::declval< meta::RemoveCVRef< Rec > & >(), util::declval< Send >())) NextSenderOf
Definition sequence_sender.h:82
decltype(execution::get_env(util::declval< T >())) EnvOf
Definition env_of.h:8
decltype(execution::connect(util::declval< Send >(), util::declval< Rec >())) ConnectResult
Definition connect_result.h:7
decltype(container::begin(util::declval< T & >())) ContainerIterator
Definition container_iterator.h:8
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition vocab.h:96
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
constexpr auto data
Definition data.h:51
constexpr auto empty_env
Definition empty_env.h:6
constexpr auto begin
Definition begin.h:44
Defines the sequence sender concepts and related CPOs.
Definition sequence_sender.h:86
Definition set_value.h:6
Rec receiver
Definition from_container.h:57
Con container
Definition from_container.h:56
StopToken stop_token
Definition from_container.h:59
meta::StopTokenOf< Env > StopToken
Definition from_container.h:47
meta::ContainerIterator< Con > Iterator
Definition from_container.h:48
Type(Con container_, Rec receiver_)
Definition from_container.h:50
Iterator iterator
Definition from_container.h:58
meta::EnvOf< Rec > Env
Definition from_container.h:46
Definition from_container.h:44
Definition from_container.h:196
friend void tag_invoke(types::Tag< start >, Type &self)
Definition from_container.h:96
Type(Data< Con, Rec > *data, R receiver)
Definition from_container.h:93
friend void tag_invoke(types::Tag< set_value >, Type &&self)
Definition from_container.h:81
OperationState< Con, Rec > * op
Definition from_container.h:79
friend void tag_invoke(types::Tag< set_stopped >, Type &&self)
Definition from_container.h:82
void is_receiver
Definition from_container.h:77
friend auto tag_invoke(types::Tag< connect >, Type &&self, R receiver)
Definition from_container.h:120
Data< Con, Rec > * data
Definition from_container.h:117
void is_sender
Definition from_container.h:113
types::CompletionSignatures< SetValue(meta::ContainerRValue< Con >)> CompletionSignatures
Definition from_container.h:115
Definition from_container.h:111
meta::EnvOf< Rec > Env
Definition from_container.h:132
friend void tag_invoke(types::Tag< start >, Type &self)
Definition from_container.h:155
void report_value()
Definition from_container.h:140
void report_stopped()
Definition from_container.h:152
meta::StopTokenOf< Env > StopToken
Definition from_container.h:133
meta::NextSenderOf< Rec, NextSender< Con, Rec > > Send
Definition from_container.h:134
meta::ConnectResult< Send, Receiver > Op
Definition from_container.h:136
NextReceiver< Con, Rec > Receiver
Definition from_container.h:135
Type(Con container, Rec receiver)
Definition from_container.h:138
friend auto tag_invoke(types::Tag< subscribe >, Self &&self, Rec receiver)
Definition from_container.h:174
Con container
Definition from_container.h:169
SequenceTag is_sender
Definition from_container.h:167
friend auto tag_invoke(types::Tag< get_completion_signatures >, Self &&, Env &&) -> Signatures< Con, Env >
Definition from_container.h:180
friend auto tag_invoke(Tag< get_env >, Type const &)
Definition from_container.h:184
Definition from_container.h:165
Definition completion_signuatures.h:7
Definition immovable.h:4