1 #ifndef LOCARNA_NAMED_ARGUMENTS_HH
2 #define LOCARNA_NAMED_ARGUMENTS_HH
19 #include <type_traits>
24 template <
typename T,
typename Tuple>
28 struct has_type<T, std::tuple<>> : std::false_type {};
30 template <
typename T,
typename U,
typename... Ts>
34 template <
typename T,
typename... Ts>
35 struct has_type<T, std::tuple<T, Ts...>> : std::true_type {};
38 template <
typename T,
typename... Us>
42 struct contains<T, std::tuple<>> : std::false_type {};
44 template <
typename T,
typename U,
typename... Us>
48 template <
typename T,
typename... Us>
49 struct contains<T, std::tuple<T, Us...>> : std::true_type {};
51 template <
typename T,
typename... Us>
52 using contains_t =
typename contains<T, Us...>::type;
55 template <
typename Tuple1,
typename Tuple2>
58 template <
typename... Ts>
61 template <
typename... Us>
64 template <
typename T,
typename... Ts,
typename... Us>
66 static constexpr
bool value =
68 contains<T, std::tuple<Us...>>::value;
76 std::enable_if_t<!
has_type<T, std::tuple<Args...>>::value> * =
nullptr>
78 get_def(
const std::tuple<Args...> &t,
const T &def) noexcept {
85 std::enable_if_t<has_type<T, std::tuple<Args...>>::value> * =
nullptr>
87 get_def(
const std::tuple<Args...> &t,
const T &def) noexcept {
88 return std::get<T>(t);
109 # define DEFINE_NAMED_ARG(name, type) \
110 struct name : public NamedArgument<type> { \
111 name(type value) : NamedArgument<type>(value) {} \
115 # define DEFINE_NAMED_ARG_DEFAULT(name, type, default_value) \
116 struct name : public NamedArgument<type> { \
117 name() : NamedArgument<type>(default_value) {} \
118 name(type value) : NamedArgument<type>(value) {} \
123 template <
typename name,
typename ArgTuple>
127 "Required named argument missing.");
128 return std::get<name>(args).value();
144 template <
typename name,
typename ArgsTuple>
147 return get_def<name>(args,
153 # define DEFINE_NAMED_ARG_FEATURE(name, type) \
155 DEFINE_NAMED_ARG(name, type)
159 # define DEFINE_NAMED_ARG_DEFAULT_FEATURE(name, type, default_value) \
161 DEFINE_NAMED_ARG_DEFAULT(name, type, default_value)
Definition: named_arguments.hh:92
Definition: aligner.cc:15
auto get_named_arg(const ArgTuple &args)
get a mandatory named argument from argument pack; ensure that argument is given
Definition: named_arguments.hh:125
auto get_named_arg_opt(const ArgsTuple &args)
Definition: named_arguments.hh:146
Definition: named_arguments.hh:39
Definition: named_arguments.hh:25
Definition: named_arguments.hh:56