xenium
parameter.hpp
1 //
2 // Copyright (c) 2018-2020 Manuel Pöter.
3 // Licensed under the MIT License. See LICENSE file in the project root for full license information.
4 //
5 
6 #ifndef XENIUM_PARAMETER_HPP
7 #define XENIUM_PARAMETER_HPP
8 
9 #include <type_traits>
10 
11 namespace xenium::parameter {
12 
13 struct nil;
14 
15 template <class T>
16 struct is_set : std::true_type {};
17 template <>
18 struct is_set<nil> : std::false_type {};
19 
20 template <class... Args>
21 struct pack;
22 
23 // type_param
24 
25 template <template <class> class Policy, class Pack, class Default = nil>
26 struct type_param;
27 
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;
31 };
32 
33 template <template <class> class Policy, class T, class Default, class... Args>
34 struct type_param<Policy, pack<Policy<T>, Args...>, Default> {
35  using type = T;
36 };
37 
38 template <template <class> class Policy, class Default>
39 struct type_param<Policy, pack<>, Default> {
40  using type = Default;
41 };
42 
43 template <template <class> class Policy, class Default, class... Args>
44 using type_param_t = typename type_param<Policy, pack<Args...>, Default>::type;
45 
46 // value_param
47 
48 template <class ValueType, template <ValueType> class Policy, class Pack, ValueType Default>
49 struct value_param;
50 
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;
54 };
55 
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;
59 };
60 
61 template <class ValueType, template <ValueType> class Policy, ValueType Default>
62 struct value_param<ValueType, Policy, pack<>, Default> {
63  static constexpr ValueType value = Default;
64 };
65 
66 template <class ValueType, template <ValueType> class Policy, ValueType Default, class... Args>
67 using value_param_t = value_param<ValueType, Policy, pack<Args...>, Default>;
68 } // namespace xenium::parameter
69 
70 #endif