di 0.1.0
Loading...
Searching...
No Matches
gather_signatures.h
Go to the documentation of this file.
1#pragma once
2
6#include "di/meta/algorithm.h"
7#include "di/meta/core.h"
8#include "di/meta/language.h"
9#include "di/meta/util.h"
10
11namespace di::meta {
12namespace detail {
13 template<bool>
14 struct IndirectMetaApply {
15 template<template<typename...> typename T, typename... Args>
16 using MetaApply = T<Args...>;
17 };
18
19 template<template<typename...> typename F, typename List>
20 struct MetaApply;
21
22 template<template<typename...> typename F, typename... Args>
23 struct MetaApply<F, meta::List<Args...>>
24 : TypeConstant<typename IndirectMetaApply<concepts::AlwaysTrue<Args...>>::template MetaApply<F, Args...>> {};
25
26 template<typename Tag, typename Completions, template<typename...> typename Tup>
27 struct GatherSignaturesHelper;
28
29 template<typename Tag, template<typename...> typename Tup>
30 struct GatherSignaturesHelper<Tag, List<>, Tup> : TypeConstant<List<>> {};
31
32 template<typename Tag, typename T, typename... Rest, template<typename...> typename Tup>
33 struct GatherSignaturesHelper<Tag, List<T, Rest...>, Tup> : GatherSignaturesHelper<Tag, List<Rest...>, Tup> {};
34
35 template<typename Tag, concepts::CompletionSignature T, typename... Rest, template<typename...> typename Tup>
36 requires(concepts::SameAs<meta::LanguageFunctionReturn<T>, Tag>)
37 struct GatherSignaturesHelper<Tag, List<T, Rest...>, Tup>
38 : TypeConstant<PushFront<Type<GatherSignaturesHelper<Tag, List<Rest...>, Tup>>,
39 meta::Type<MetaApply<Tup, meta::AsList<T>>>>> {};
40}
41
42template<typename Tag, typename S, typename E, template<typename...> typename Tuple,
43 template<typename...> typename Variant>
44requires(concepts::SenderIn<S, E>)
45using GatherSignatures = meta::Type<detail::MetaApply<
46 Variant, meta::Type<detail::GatherSignaturesHelper<Tag, meta::AsList<meta::CompletionSignaturesOf<S, E>>, Tuple>>>>;
47}
Definition tuple.h:27
Definition variant.h:30
meta::MakeCompletionSignatures< Seq, Env, types::CompletionSignatures< SetValue()>, meta::TypeConstant< types::CompletionSignatures<> >::template Invoke, ErrorsWithStopped > Completions
Definition ignore_all.h:275
Definition merge_interfaces.h:6
meta::Type< detail::MetaApply< Variant, meta::Type< detail::GatherSignaturesHelper< Tag, meta::AsList< meta::CompletionSignaturesOf< S, E > >, Tuple > > > > GatherSignatures
Definition gather_signatures.h:45
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
Concat< List< T >, L > PushFront
Definition algorithm.h:83
Type< detail::AsListHelper< T > > AsList
Definition algorithm.h:48
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Tuple(Types...) -> Tuple< Types... >