6 #ifndef XENIUM_PARAMETER_HPP
7 #define XENIUM_PARAMETER_HPP
11 namespace xenium {
namespace parameter {
15 template <
class T>
struct is_set : std::true_type {};
16 template <>
struct is_set<nil> : std::false_type {};
18 template <
class... Args>
23 template<
template <
class>
class Policy,
class Pack,
class Default = nil>
26 template<
template <
class>
class Policy,
class Default,
class Arg,
class... Args>
27 struct type_param<Policy, pack<Arg, Args...>, Default> {
28 using type =
typename type_param<Policy, pack<Args...>, Default>::type;
31 template<
template <
class>
class Policy,
class T,
class Default,
class... Args>
32 struct type_param<Policy, pack<Policy<T>, Args...>, Default> {
36 template<
template <
class>
class Policy,
class Default>
37 struct type_param<Policy, pack<>, Default> {
41 template<
template <
class>
class Policy,
class Default,
class... Args>
42 using type_param_t =
typename type_param<Policy, pack<Args...>, Default>::type;
46 template<
class ValueType,
template <ValueType>
class Policy,
class Pack, ValueType Default>
49 template<
class ValueType,
template <ValueType>
class Policy, ValueType Default,
class Arg,
class... Args>
50 struct value_param<ValueType, Policy, pack<Arg, Args...>, Default> {
51 static constexpr ValueType value = value_param<ValueType, Policy, pack<Args...>, Default>::value;
54 template<
class ValueType,
template <ValueType>
class Policy, ValueType Value, ValueType Default,
class... Args>
55 struct value_param<ValueType, Policy, pack<Policy<Value>, Args...>, Default> {
56 static constexpr ValueType value = Value;
59 template<
class ValueType,
template <ValueType>
class Policy, ValueType Default>
60 struct value_param<ValueType, Policy, pack<>, Default> {
61 static constexpr ValueType value = Default;
64 template<
class ValueType,
template <ValueType>
class Policy, ValueType Default,
class... Args>
65 using value_param_t = value_param<ValueType, Policy, pack<Args...>, Default>;