Iros
 
Loading...
Searching...
No Matches
just_or_error.h
Go to the documentation of this file.
1#pragma once
2
12#include "di/meta/algorithm.h"
13#include "di/meta/core.h"
14#include "di/meta/language.h"
15#include "di/meta/operations.h"
16#include "di/meta/vocab.h"
17#include "di/util/move.h"
19
20namespace di::execution {
22 template<typename R, typename Rec>
25 public:
26 explicit Type(R&& value_, Rec receiver_) : value(util::move(value_)), receiver(util::move(receiver_)) {}
27
28 [[no_unique_address]] R value;
29 [[no_unique_address]] Rec receiver;
30
31 private:
32 constexpr friend void tag_invoke(types::Tag<di::execution::start>, Type& self) {
33 if (!self.value.has_value()) {
34 return execution::set_error(util::move(self.receiver),
35 vocab::Error(util::move(self.value).error()));
36 }
38 return execution::set_value(util::move(self.receiver));
39 } else {
40 return execution::set_value(util::move(self.receiver), util::move(self.value).value());
41 }
42 }
43 };
44 };
45
46 template<concepts::Expected R, concepts::Receiver Rec>
48
49 template<typename R>
50 struct SenderT {
51 struct Type {
52 public:
53 using is_sender = void;
54
59
60 [[no_unique_address]] R value;
61
62 private:
63 template<concepts::ReceiverOf<CompletionSignatures> Rec>
65 constexpr friend auto tag_invoke(types::Tag<di::execution::connect>, Type const& self, Rec receiver) {
66 return OperationState<R, Rec> { self.value, util::move(receiver) };
67 }
68
69 template<concepts::ReceiverOf<CompletionSignatures> Rec>
70 constexpr friend auto tag_invoke(types::Tag<di::execution::connect>, Type&& self, Rec receiver) {
71 return OperationState<R, Rec> { util::move(self.value), util::move(receiver) };
72 }
73 };
74 };
75
76 template<concepts::Expected R>
78
79 struct Function {
80 auto operator()(concepts::Expected auto value) const -> concepts::Sender auto {
81 return Sender<decltype(value)> { util::move(value) };
82 }
83 };
84}
85
86constexpr inline auto just_or_error = just_or_error_ns::Function {};
87}
Definition operations.h:34
Definition vocab.h:30
Definition core.h:128
Definition sender.h:11
Definition just_or_error.h:21
meta::Type< OperationStateT< R, Rec > > OperationState
Definition just_or_error.h:47
meta::Type< SenderT< R > > Sender
Definition just_or_error.h:77
Definition bulk.h:30
constexpr auto set_error
Definition set_error.h:14
constexpr auto just_or_error
Definition just_or_error.h:86
constexpr auto set_value
Definition set_value.h:14
T::Type Type
Definition core.h:26
Type< detail::AsLanguageFunction< R, T > > AsLanguageFunction
Definition algorithm.h:31
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition vocab.h:96
StatusCode< Erased< long > > Error
Definition error.h:8
Definition set_error.h:6
Definition just_or_error.h:79
auto operator()(concepts::Expected auto value) const -> concepts::Sender auto
Definition just_or_error.h:80
constexpr friend void tag_invoke(types::Tag< di::execution::start >, Type &self)
Definition just_or_error.h:32
Type(R &&value_, Rec receiver_)
Definition just_or_error.h:26
constexpr friend auto tag_invoke(types::Tag< di::execution::connect >, Type &&self, Rec receiver)
Definition just_or_error.h:70
void is_sender
Definition just_or_error.h:53
constexpr friend auto tag_invoke(types::Tag< di::execution::connect >, Type const &self, Rec receiver)
Definition just_or_error.h:65
R value
Definition just_or_error.h:60
types::CompletionSignatures< meta::AsLanguageFunction< SetValue, meta::Conditional< concepts::LanguageVoid< meta::ExpectedValue< R > >, meta::List<>, meta::List< meta::ExpectedValue< R > > > >, SetError(vocab::Error)> CompletionSignatures
Definition just_or_error.h:55
Definition just_or_error.h:50
Definition list.h:77
Definition completion_signuatures.h:7
Definition immovable.h:4