Iros
 
Loading...
Searching...
No Matches
named_arguments.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/meta/algorithm.h"
4#include "di/meta/constexpr.h"
5#include "di/meta/core.h"
6#include "di/meta/function.h"
7#include "di/meta/language.h"
8#include "di/meta/list.h"
10#include "di/meta/util.h"
11#include "di/types/in_place.h"
12#include "di/util/get.h"
14
15namespace di::util {
25template<typename Tag_, typename T>
27public:
28 using Tag = Tag_;
29 using Type = T;
30
31 constexpr static bool is_named_argument = true;
32
33 explicit NamedArgument()
35 = default;
36
37 template<typename U>
39 // NOLINTNEXTLINE(bugprone-forwarding-reference-overload)
40 constexpr explicit(!concepts::ConvertibleTo<U, T>) NamedArgument(U&& value) : m_value(di::forward<U>(value)) {}
41
42 template<typename... Args>
43 requires(concepts::ConstructibleFrom<T, Args...>)
44 constexpr explicit NamedArgument(InPlace, Args&&... args) : m_value(di::forward<Args>(args)...) {}
45
46 constexpr auto value() & -> T& { return m_value; }
47 constexpr auto value() const& -> T const& { return m_value; }
48 constexpr auto value() && -> T&& { return di::move(m_value); }
49 constexpr auto value() const&& -> T const&& { return di::move(m_value); }
50
51private:
52 T m_value;
53};
54
72template<typename... Args>
75 sizeof...(Args))
77public:
78 constexpr explicit NamedArguments(Args&&... args) : m_arguments(di::forward<Args>(args)...) {}
79
81
82 constexpr auto arguments() & -> Tuple<Args&&...>& { return m_arguments; }
83 constexpr auto arguments() const& -> Tuple<Args&&...> const& { return m_arguments; }
84 constexpr auto arguments() && -> Tuple<Args&&...>&& { return di::move(m_arguments); }
85 constexpr auto arguments() const&& -> Tuple<Args&&...> const&& { return di::move(m_arguments); }
86
87private:
88 Tuple<Args&&...> m_arguments;
89};
90
91template<typename... Args>
92NamedArguments(Args&&...) -> NamedArguments<Args&&...>;
93
94namespace detail {
95 template<typename Tag>
97 template<concepts::RemoveCVRefInstanceOf<NamedArguments> Args>
99 constexpr auto operator()(Args&& args) const -> decltype(auto) {
100 constexpr auto index = meta::Lookup<Tag&&, meta::Type<meta::RemoveCVRef<Args>>>;
101 return di::get<index>(di::forward<Args>(args).arguments()).value();
102 }
103 };
104}
105
125template<typename Arg>
127
128namespace detail {
129 template<typename Tag>
131 template<concepts::RemoveCVRefInstanceOf<NamedArguments> Args, typename Val = meta::Type<Tag>,
132 concepts::ConvertibleTo<Val> U>
134 constexpr auto operator()(Args&& args, U&& fallback) const -> Val {
136 return get_named_argument<Tag>(args);
137 } else {
138 return di::forward<U>(fallback);
139 }
140 }
141 };
142
143 template<typename Tag>
146 template<concepts::RemoveCVRefInstanceOf<NamedArguments> Args, typename U>
147 constexpr auto operator()(Args&& args, U&& fallback) const -> decltype(auto) {
149 return get_named_argument<Tag>(args);
150 } else {
151 return di::forward<U>(fallback);
152 }
153 }
154 };
155}
156
178template<typename Arg>
180}
181
182namespace di::meta {
192template<typename Args, typename Tag>
194
203template<typename Args, typename Tag>
205
216template<typename Args, typename Tag, typename Fallback>
218
228template<typename Args, typename Tag, typename Fallback>
230}
231
232namespace di::concepts {
241template<typename Args, typename Tag>
243
244namespace detail {
245 struct ContainsF {
246 template<typename List, typename T>
248 };
249}
250
260template<typename Allowed, typename... Args>
265}
266
267namespace di {
274}
A helper class to simulate a single named argument.
Definition named_arguments.h:26
Tag_ Tag
Definition named_arguments.h:28
constexpr auto value() const &-> T const &
Definition named_arguments.h:47
T Type
Definition named_arguments.h:29
constexpr auto value() const &&-> T const &&
Definition named_arguments.h:49
constexpr auto value() &-> T &
Definition named_arguments.h:46
static constexpr bool is_named_argument
Definition named_arguments.h:31
constexpr NamedArgument(InPlace, Args &&... args)
Definition named_arguments.h:44
constexpr auto value() &&-> T &&
Definition named_arguments.h:48
A helper class for simulation named arguments in c++.
Definition named_arguments.h:76
constexpr auto arguments() const &-> Tuple< Args &&... > const &
Definition named_arguments.h:83
constexpr auto arguments() &&-> Tuple< Args &&... > &&
Definition named_arguments.h:84
constexpr auto arguments() &-> Tuple< Args &&... > &
Definition named_arguments.h:82
constexpr NamedArguments(Args &&... args)
Definition named_arguments.h:78
constexpr auto arguments() const &&-> Tuple< Args &&... > const &&
Definition named_arguments.h:85
meta::List< meta::Like< Args &&, typename meta::RemoveCVRef< Args >::Tag >... > Type
Definition named_arguments.h:80
Definition tuple_forward_declaration.h:5
Definition operations.h:11
Definition operations.h:99
Definition util.h:59
Definition operations.h:24
A concept to check if a named argument is present.
Definition named_arguments.h:242
Definition core.h:161
Definition core.h:139
A concept to check if a list of named arguments is valid.
Definition named_arguments.h:261
Definition list.h:119
Definition strong_int.h:23
Definition impl.h:7
Definition any_storable.h:9
Definition json_deserializer.h:532
Definition merge_interfaces.h:6
constexpr bool All
Definition algorithm.h:20
Conditional< concepts::LanguageArray< RemoveReference< T > >, RemoveExtent< RemoveReference< T > > *, Conditional< concepts::LanguageFunction< RemoveReference< T > >, AddPointer< RemoveReference< T > >, RemoveCVRef< T > > > Decay
Definition language.h:574
RemoveCV< RemoveReference< T > > RemoveCVRef
Definition core.h:74
constexpr usize Size
Definition list.h:106
Type< detail::LikeHelper< T, U > > Like
Definition language.h:468
meta::Decay< NamedArgument< Args, Tag > > NamedArgumentValue
A metafunction to get the value type of a named argument.
Definition named_arguments.h:204
detail::TransformHelper< List, Function >::Type Transform
Definition algorithm.h:186
decltype(util::get_named_argument< Tag >(declval< Args >())) NamedArgument
A metafunction to the type of a named argument.
Definition named_arguments.h:193
decltype(util::get_named_argument_or< Tag >(declval< Args >(), declval< Fallback >())) NamedArgumentOr
A metafunction to get the type of a named argument with fallback.
Definition named_arguments.h:217
meta::Decay< NamedArgumentOr< Args, Tag, Fallback > > NamedArgumentValueOr
A metafunction to get the value type of a named argument with fallback.
Definition named_arguments.h:229
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
Definition clamp.h:9
Definition vocab.h:96
constexpr auto get_named_argument
A helper function to access a named argument.
Definition named_arguments.h:126
constexpr auto get_named_argument_or
A helper function to access a named argument or a fallback value.
Definition named_arguments.h:179
NamedArguments(Args &&...) -> NamedArguments< Args &&... >
Definition zstring_parser.h:9
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
auto declval() -> meta::AddRValueReference< T >
Definition declval.h:8
Definition named_arguments.h:245
meta::Constexpr< meta::Contains< List, T > > Invoke
Definition named_arguments.h:247
Definition function.h:64
A wrapper for a constexpr value.
Definition core.h:77
Definition core.h:5
Definition function.h:30
Definition in_place.h:4
Definition named_arguments.h:96
Definition named_arguments.h:130
constexpr auto operator()(Args &&args, U &&fallback) const -> decltype(auto)
Definition named_arguments.h:147