Iros
 
Loading...
Searching...
No Matches
let_value_with.h
Go to the documentation of this file.
1#pragma once
2
8#include "di/meta/util.h"
11#include "di/util/move.h"
14
15namespace di::execution {
17 template<typename State, typename Send, typename Rec>
20 template<typename Fun, typename Factories>
21 explicit Type(Fun&& function, Factories&& factories, Rec receiver)
22 : m_state(util::DeferConstruct([&] {
23 return vocab::apply(
24 [&]<typename... Fs>(Fs&&... fs) {
25 return State(util::DeferConstruct([&] {
26 return function::invoke(util::forward<Fs>(fs));
27 })...);
28 },
29 util::forward<Factories>(factories));
30 }))
31 , m_op_state(execution::connect(
32 [&] {
33 return vocab::apply(
34 [&](auto&... args) {
35 return function::invoke(util::forward<Fun>(function), args...);
36 },
37 m_state);
38 }(),
39 util::move(receiver))) {}
40
41 private:
42 friend void tag_invoke(types::Tag<execution::start>, Type& self) { execution::start(self.m_op_state); }
43
46 };
47 };
48
49 template<typename State, concepts::Sender Send, concepts::Receiver Rec>
51
52 struct Function {
53 template<typename Fun, typename... Factories>
54 struct SenderT {
55 struct Type {
56 private:
59
60 public:
61 using is_sender = void;
62
63 [[no_unique_address]] Fun function;
64 [[no_unique_address]] vocab::Tuple<Factories...> factories;
65
66 template<typename F, typename... Fa>
67 explicit Type(F&& f, Fa&&... fa) : function(util::forward<F>(f)), factories(util::forward<Fa>(fa)...) {}
68
69 private:
70 template<concepts::DecaysTo<Type> Self, typename Rec>
74 friend auto tag_invoke(types::Tag<connect>, Self&& self, Rec receiver) {
76 di::forward_like<Self>(self.factories),
77 util::move(receiver) };
78 }
79
80 template<concepts::DecaysTo<Type> Self, typename Env>
85 };
86 };
87
88 template<typename Fun, typename... Factories>
89 using Sender = meta::Type<SenderT<Fun, Factories...>>;
90
91 template<concepts::MovableValue... Factories, concepts::MovableValue Fun, typename DFun = meta::Decay<Fun>>
92 requires(concepts::Sender<
94 auto operator()(Fun&& function, Factories&&... factories) const -> concepts::Sender auto {
95 return Sender<Fun, Factories...> { util::forward<Fun>(function), util::forward<Factories>(factories)... };
96 }
97 };
98}
99
119}
Definition defer_construct.h:8
Definition tuple_forward_declaration.h:5
#define DI_IMMOVABLE_NO_UNIQUE_ADDRESS
Definition compiler.h:15
Definition util.h:71
Definition sender_to.h:11
Definition sender.h:11
Definition let_value_with.h:16
meta::Type< OperationStateT< State, Send, Rec > > OperationState
Definition let_value_with.h:50
Definition bulk.h:30
constexpr auto let_value_with
Inject values into an operation state.
Definition let_value_with.h:118
constexpr auto start
Definition start.h:20
constexpr auto connect
Definition connect.h:42
Definition as_bool.h:8
constexpr auto invoke
Definition invoke.h:100
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
decltype(function::detail::invoke_impl(util::declval< Ts >()...)) InvokeResult
Definition invoke.h:64
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 vocab.h:96
constexpr auto apply(F &&f, Tup &&tuple) -> decltype(detail::apply_impl(meta::MakeIndexSequence< meta::TupleSize< Tup > > {}, util::forward< F >(f), util::forward< Tup >(tuple)))
Definition apply.h:22
constexpr auto forward_like(U &&value) -> decltype(auto)
Definition forward_like.h:8
friend auto tag_invoke(types::Tag< get_completion_signatures >, Self &&, Env &&) -> meta::CompletionSignaturesOf< Send, Env >
Definition let_value_with.h:81
Type(F &&f, Fa &&... fa)
Definition let_value_with.h:67
friend auto tag_invoke(types::Tag< connect >, Self &&self, Rec receiver)
Definition let_value_with.h:74
vocab::Tuple< Factories... > factories
Definition let_value_with.h:64
Definition let_value_with.h:52
meta::Type< SenderT< Fun, Factories... > > Sender
Definition let_value_with.h:89
Type(Fun &&function, Factories &&factories, Rec receiver)
Definition let_value_with.h:21
friend void tag_invoke(types::Tag< execution::start >, Type &self)
Definition let_value_with.h:42
Definition immovable.h:4