Loading [MathJax]/extensions/tex2jax.js
Iros
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages Concepts
Loading...
Searching...
No Matches
transform_each.h
Go to the documentation of this file.
1#pragma once
2
13#include "di/function/invoke.h"
15#include "di/meta/core.h"
16#include "di/meta/util.h"
18#include "di/util/addressof.h"
19#include "di/util/immovable.h"
20
21namespace di::execution {
23 template<typename Fun, typename Rec>
24 struct DataT {
25 struct Type {
26 [[no_unique_address]] Fun transformer;
27 [[no_unique_address]] Rec receiver;
28 };
29 };
30
31 template<concepts::MovableValue Fun, concepts::Receiver Rec>
33
34 template<typename Fun, typename Rec>
35 struct ReceiverT {
36 struct Type : ReceiverAdaptor<Type> {
37 private:
38 using Base = ReceiverAdaptor<Type>;
39 friend Base;
40
41 public:
42 explicit Type(Data<Fun, Rec>* data) : m_data(data) {}
43
44 auto base() & -> Rec& { return m_data->receiver; }
45 auto base() const& -> Rec const& { return m_data->receiver; }
46 auto base() && -> Rec&& { return util::move(m_data->receiver); }
47
48 private:
49 template<concepts::Sender Next>
51 auto set_next(Next&& next) & -> concepts::NextSender auto {
52 return execution::set_next(this->base(),
53 function::invoke(m_data->transformer, util::forward<Next>(next)));
54 }
55
56 Data<Fun, Rec>* m_data;
57 };
58 };
59
60 template<concepts::MovableValue Fun, concepts::Receiver Rec>
62
63 template<typename Seq, typename Fun, typename Rec>
66 public:
70
71 explicit Type(Seq&& sequence, Fun&& transformer, Rec receiver)
72 : m_data(util::forward<Fun>(transformer), util::move(receiver))
73 , m_op(subscribe(util::forward<Seq>(sequence), Receiver(util::addressof(m_data)))) {}
74
75 private:
76 friend void tag_invoke(types::Tag<start>, Type& self) { start(self.m_op); }
77
78 [[no_unique_address]] Data m_data;
80 };
81 };
82
83 template<concepts::Sender Seq, concepts::MovableValue Fun, concepts::Receiver Rec>
85
86 template<typename Seq, typename Fun, typename Env>
89
90 template<typename Seq, typename Fun>
91 struct SequenceT {
92 struct Type {
94
95 [[no_unique_address]] Seq sequence;
96 [[no_unique_address]] Fun transformer;
97
98 template<concepts::RemoveCVRefSameAs<Type> Self, typename Rec>
101 friend auto tag_invoke(types::Tag<subscribe>, Self&& self, Rec receiver) {
103 di::forward_like<Self>(self.sequence), di::forward_like<Self>(self.transformer),
104 util::move(receiver));
105 }
106
107 template<concepts::RemoveCVRefSameAs<Type> Self, typename Env>
111 return {};
112 }
113
114 friend auto tag_invoke(types::Tag<get_env>, Type const& self) { return make_env(get_env(self.sequence)); }
115 };
116 };
117
118 template<concepts::Sender Seq, concepts::MovableValue Fun>
120
121 struct Function {
122 template<concepts::Sender Seq, concepts::MovableValue Fun>
123 auto operator()(Seq&& sequence, Fun&& transformer) const -> concepts::SequenceSender auto {
126 "The return type of the transform_each function must be a sequence sender.");
127 return function::tag_invoke(*this, util::forward<Seq>(sequence), util::forward<Fun>(transformer));
128 } else {
129 return Sequence<Seq, Fun> { util::forward<Seq>(sequence), util::forward<Fun>(transformer) };
130 }
131 }
132 };
133}
134
150}
#define DI_IMMOVABLE_NO_UNIQUE_ADDRESS
Definition compiler.h:15
Definition invoke.h:58
A sender that can be returned from di::execution::set_next().
Definition sequence_sender.h:50
Definition sequence_sender.h:102
Definition sequence_sender.h:128
Definition tag_invoke.h:33
Definition transform_each.h:22
meta::Type< DataT< meta::Decay< Fun >, Rec > > Data
Definition transform_each.h:32
meta::Type< SequenceT< meta::RemoveCVRef< Seq >, meta::Decay< Fun > > > Sequence
Definition transform_each.h:119
meta::Type< ReceiverT< meta::Decay< Fun >, Rec > > Receiver
Definition transform_each.h:61
meta::CompletionSignaturesOf< meta::InvokeResult< Fun &, dummy_ns::DummySenderOf< meta::CompletionSignaturesOf< Seq, Fun > > >, Env > Signatures
Definition transform_each.h:87
meta::Type< OperationStateT< Seq, Fun, Rec > > OperationState
Definition transform_each.h:84
Definition bulk.h:30
constexpr auto set_next
Set the next sender of a sequence.
Definition sequence_sender.h:77
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 subscribe
Subscribe a receiver to a sequence.
Definition sequence_sender.h:234
constexpr auto transform_each
Transform each sender of a sequence.
Definition transform_each.h:149
constexpr auto next
Get the next value of a async range in a coroutine.
Definition async_range.h:52
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 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
decltype(execution::get_completion_signatures(util::declval< Sender >(), util::declval< Env >())) CompletionSignaturesOf
Definition completion_signatures_of.h:12
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
decltype(execution::subscribe(util::declval< Send >(), util::declval< Rec >())) SubscribeResult
Definition sequence_sender.h:239
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
decltype(function::detail::invoke_impl(util::declval< Ts >()...)) InvokeResult
Definition invoke.h:64
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 sequence
Definition sequence.h:34
constexpr auto data
Definition data.h:51
Defines the sequence sender concepts and related CPOs.
Definition sequence_sender.h:86
Definition transform_each.h:25
Fun transformer
Definition transform_each.h:26
Rec receiver
Definition transform_each.h:27
Definition transform_each.h:24
Definition transform_each.h:121
auto operator()(Seq &&sequence, Fun &&transformer) const -> concepts::SequenceSender auto
Definition transform_each.h:123
friend void tag_invoke(types::Tag< start >, Type &self)
Definition transform_each.h:76
transform_each_ns::Data< Fun, Rec > Data
Definition transform_each.h:69
meta::SubscribeResult< Seq, Receiver > Op
Definition transform_each.h:68
transform_each_ns::Receiver< Fun, Rec > Receiver
Definition transform_each.h:67
Type(Seq &&sequence, Fun &&transformer, Rec receiver)
Definition transform_each.h:71
auto base() const &-> Rec const &
Definition transform_each.h:45
Type(Data< Fun, Rec > *data)
Definition transform_each.h:42
auto base() &-> Rec &
Definition transform_each.h:44
auto base() &&-> Rec &&
Definition transform_each.h:46
Definition transform_each.h:35
Seq sequence
Definition transform_each.h:95
friend auto tag_invoke(types::Tag< subscribe >, Self &&self, Rec receiver)
Definition transform_each.h:101
SequenceTag is_sender
Definition transform_each.h:93
friend auto tag_invoke(types::Tag< get_env >, Type const &self)
Definition transform_each.h:114
friend auto tag_invoke(types::Tag< get_completion_signatures >, Self &&, Env &&) -> Signatures< meta::Like< Self, Seq >, Fun, MakeEnv< Env > >
Definition transform_each.h:109
Fun transformer
Definition transform_each.h:96
Definition transform_each.h:91
Definition immovable.h:4