6 #ifndef XENIUM_PARAMETER_HPP
7 #define XENIUM_PARAMETER_HPP
11 namespace xenium::parameter {
16 struct is_set : std::true_type {};
18 struct is_set<nil> : std::false_type {};
20 template <
class... Args>
25 template <
template <
class>
class Policy,
class Pack,
class Default = nil>
28 template <
template <
class>
class Policy,
class Default,
class Arg,
class... Args>
29 struct type_param<Policy, pack<Arg, Args...>, Default> {
30 using type =
typename type_param<Policy, pack<Args...>, Default>::type;
33 template <
template <
class>
class Policy,
class T,
class Default,
class... Args>
34 struct type_param<Policy, pack<Policy<T>, Args...>, Default> {
38 template <
template <
class>
class Policy,
class Default>
39 struct type_param<Policy, pack<>, Default> {
43 template <
template <
class>
class Policy,
class Default,
class... Args>
44 using type_param_t =
typename type_param<Policy, pack<Args...>, Default>::type;
48 template <
class ValueType,
template <ValueType>
class Policy,
class Pack, ValueType Default>
51 template <
class ValueType,
template <ValueType>
class Policy, ValueType Default,
class Arg,
class... Args>
52 struct value_param<ValueType, Policy, pack<Arg, Args...>, Default> {
53 static constexpr ValueType value = value_param<ValueType, Policy, pack<Args...>, Default>::value;
56 template <
class ValueType,
template <ValueType>
class Policy, ValueType Value, ValueType Default,
class... Args>
57 struct value_param<ValueType, Policy, pack<Policy<Value>, Args...>, Default> {
58 static constexpr ValueType value = Value;
61 template <
class ValueType,
template <ValueType>
class Policy, ValueType Default>
62 struct value_param<ValueType, Policy, pack<>, Default> {
63 static constexpr ValueType value = Default;
66 template <
class ValueType,
template <ValueType>
class Policy, ValueType Default,
class... Args>
67 using value_param_t = value_param<ValueType, Policy, pack<Args...>, Default>;