di 0.1.0
Loading...
Searching...
No Matches
get_completion_signatures.h
Go to the documentation of this file.
1#pragma once
2
8#include "di/meta/core.h"
9#include "di/meta/util.h"
11
12namespace di::execution {
13namespace detail {
14 struct GetCompletionSignaturesFunction {
15 template<typename Sender, typename Env>
16 requires(concepts::TagInvocable<GetCompletionSignaturesFunction, Sender, Env> ||
17 requires { typename meta::RemoveCVRef<Sender>::CompletionSignatures; } ||
18 concepts::IsAwaitable<Sender, EnvPromise<Env>>)
19 constexpr auto operator()(Sender&&, Env&&) const {
22 static_assert(
23 concepts::InstanceOf<Result, types::CompletionSignatures>,
24 "A customized get_completion_signatures() must return an instance of di::CompletionSignatures.");
25 return Result {};
26 } else if constexpr (requires { typename meta::RemoveCVRef<Sender>::CompletionSignatures; }) {
27 using Result = meta::RemoveCVRef<Sender>::CompletionSignatures;
28 static_assert(
29 concepts::InstanceOf<Result, types::CompletionSignatures>,
30 "A sender's CompletionSignatures typedef must be an instance of di::CompletionSignatures.");
31 return Result {};
32 } else if constexpr (concepts::IsAwaitable<Sender, EnvPromise<Env>>) {
33 if constexpr (concepts::LanguageVoid<meta::AwaitResult<Sender, EnvPromise<Env>>>) {
34 return types::CompletionSignatures<SetValue(), SetError(Error), SetStopped()> {};
35 } else {
36 return types::CompletionSignatures<SetValue(meta::AwaitResult<Sender, EnvPromise<Env>>),
37 SetError(Error), SetStopped()> {};
38 }
39 }
40 }
41 };
42}
43
44constexpr inline auto get_completion_signatures = detail::GetCompletionSignaturesFunction {};
45}
meta::Type< SenderT< meta::RemoveCVRef< Send >, meta::Decay< Shape >, meta::Decay< Function > > > Sender
Definition bulk.h:155
MakeEnv< EmptyEnv, With< Tag< get_stop_token >, StopToken > > Env
Definition ensure_started.h:52
Definition bulk.h:30
constexpr auto get_completion_signatures
Definition get_completion_signatures.h:44
decltype(concepts::detail::get_awaiter(util::declval< Awaitable >(), util::declval< Promise * >()).await_resume()) AwaitResult
Definition await_result.h:9
decltype(di::function::tag_invoke(util::declval< Tag >(), util::declval< Args >()...)) TagInvokeResult
Definition tag_invoke.h:40
Expected< T, Error > Result
Definition result.h:8
StatusCode< Erased< long > > Error
Definition error.h:8