Iros
 
Loading...
Searching...
No Matches
make_env.h
Go to the documentation of this file.
1#pragma once
2
7#include "di/meta/algorithm.h"
8#include "di/meta/core.h"
9#include "di/meta/function.h"
10#include "di/meta/operations.h"
11#include "di/meta/util.h"
12#include "di/util/declval.h"
13#include "di/util/forward.h"
14#include "di/util/get.h"
16
17namespace di::execution {
18namespace make_env_ns {
19 template<typename Tag, typename Val>
20 struct With {
21 using Type = Tag;
22
23 [[no_unique_address]] Val value;
24 };
25
26 struct WithFunction {
27 template<typename Tag, concepts::CopyConstructible Val>
28 constexpr auto operator()(Tag, Val&& value) const {
29 return With<Tag, meta::Decay<Val>> { util::forward<Val>(value) };
30 }
31 };
32
33 template<typename Tag>
34 struct Without {
35 using Type = Tag;
36 };
37
39 template<typename Tag>
40 constexpr auto operator()(Tag) const {
41 return Without<Tag> {};
42 }
43 };
44
45 template<typename T>
47
48 template<typename Tag, concepts::TypeList List>
50
51 template<typename Tag, typename List>
54
55 template<typename BaseEnv, typename Withs>
56 struct EnvT;
57
58 template<typename BaseEnv, typename... Overrides>
59 struct EnvT<BaseEnv, meta::List<Overrides...>> {
60 struct Type {
61 public:
62 template<typename... Args>
63 constexpr explicit Type(BaseEnv base_env, Overrides... overrides)
64 : m_base_env(util::move(base_env)), m_overrides(util::move(overrides)...) {}
65
66 private:
67 template<typename Tag>
68 requires(HasTag<Tag, meta::List<Overrides...>>)
69 constexpr friend auto tag_invoke(Tag, Type const& self) {
70 return util::get<LookupTag<Tag, meta::List<Overrides...>>>(self.m_overrides).value;
71 }
72
73 template<concepts::ForwardingQuery Tag>
75 constexpr friend auto tag_invoke(Tag tag, Type const& self) -> decltype(auto) {
76 return tag(self.m_base_env);
77 }
78
79 [[no_unique_address]] BaseEnv m_base_env;
80 [[no_unique_address]] vocab::Tuple<Overrides...> m_overrides;
81 };
82 };
83
84 template<typename BaseEnv, typename... Withs>
85 using Env = meta::Type<EnvT<BaseEnv, meta::List<Withs...>>>;
86
87 struct Function {
88 template<typename BaseEnv, Override... Overrides>
89 constexpr auto operator()(BaseEnv base_env, Overrides... overrides) const {
90 static_assert(meta::Size<meta::Unique<meta::List<meta::Type<Overrides>...>>> == sizeof...(Overrides),
91 "di::execution::make_env() must be called with unique overrides.");
92 return Env<BaseEnv, Overrides...> { util::move(base_env), util::move(overrides)... };
93 }
94 };
95}
96
112constexpr inline auto with = make_env_ns::WithFunction {};
113
127constexpr inline auto without = make_env_ns::WithoutFunction {};
128
147constexpr inline auto make_env = make_env_ns::Function {};
148
160template<typename Tag, typename Val>
162
173template<typename Tag>
175
188template<typename BaseEnv, typename... Withs>
190}
Definition tuple_forward_declaration.h:5
Definition core.h:139
Definition invoke.h:58
Definition make_env.h:52
Definition make_env.h:46
Definition make_env.h:18
meta::Type< EnvT< BaseEnv, meta::List< Withs... > > > Env
Definition make_env.h:85
meta::Front< meta::Filter< List, meta::Compose< meta::SameAs< Tag >, meta::Quote< meta::Type > > > > LookupTag
Definition make_env.h:49
Definition bulk.h:30
constexpr auto without
Specify a removal of an environment query override.
Definition make_env.h:127
constexpr auto make_env
Create an environment with overrides for queries.
Definition make_env.h:147
make_env_ns::Without< Tag > Without
Represent a removal of an environment query value.
Definition make_env.h:174
constexpr auto with
Specify an override for an environment query.
Definition make_env.h:112
make_env_ns::With< Tag, Val > With
Represent a override for an environment query.
Definition make_env.h:161
decltype(make_env(util::declval< BaseEnv >(), util::declval< Withs >()...)) MakeEnv
Represent an environment with overrides for queries.
Definition make_env.h:189
Definition merge_interfaces.h:6
T::Type Type
Definition core.h:26
constexpr usize Size
Definition list.h:106
T::Front Front
Definition list.h:100
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition vocab.h:96
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
Definition make_env.h:56
constexpr friend auto tag_invoke(Tag, Type const &self)
Definition make_env.h:69
constexpr Type(BaseEnv base_env, Overrides... overrides)
Definition make_env.h:63
constexpr friend auto tag_invoke(Tag tag, Type const &self) -> decltype(auto)
Definition make_env.h:75
Definition make_env.h:87
constexpr auto operator()(BaseEnv base_env, Overrides... overrides) const
Definition make_env.h:89
constexpr auto operator()(Tag, Val &&value) const
Definition make_env.h:28
Definition make_env.h:20
Val value
Definition make_env.h:23
Tag Type
Definition make_env.h:21
constexpr auto operator()(Tag) const
Definition make_env.h:40
Definition make_env.h:34
Tag Type
Definition make_env.h:35
Definition core.h:5
Definition function.h:30