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 { namespace parameter {
12 
13  struct nil;
14 
15  template <class T> struct is_set : std::true_type {};
16  template <> struct is_set<nil> : std::false_type {};
17 
18  template <class... Args>
19  struct pack;
20 
21  // type_param
22 
23  template<template <class> class Policy, class Pack, class Default = nil>
24  struct type_param;
25 
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;
29  };
30 
31  template<template <class> class Policy, class T, class Default, class... Args>
32  struct type_param<Policy, pack<Policy<T>, Args...>, Default> {
33  using type = T;
34  };
35 
36  template<template <class> class Policy, class Default>
37  struct type_param<Policy, pack<>, Default> {
38  using type = Default;
39  };
40 
41  template<template <class> class Policy, class Default, class... Args>
42  using type_param_t = typename type_param<Policy, pack<Args...>, Default>::type;
43 
44  // value_param
45 
46  template<class ValueType, template <ValueType> class Policy, class Pack, ValueType Default>
47  struct value_param;
48 
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;
52  };
53 
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;
57  };
58 
59  template<class ValueType, template <ValueType> class Policy, ValueType Default>
60  struct value_param<ValueType, Policy, pack<>, Default> {
61  static constexpr ValueType value = Default;
62  };
63 
64  template<class ValueType, template <ValueType> class Policy, ValueType Default, class... Args>
65  using value_param_t = value_param<ValueType, Policy, pack<Args...>, Default>;
66 }}
67 
68 #endif