stator
A math, geometry, and utility library
template_config.hpp
Go to the documentation of this file.
1 //=======================================================================
2 // Copyright (c) 2015 Baptiste Wicht
3 // Copyright (c) 2016 Marcus Bannerman
4 // Distributed under the terms of the MIT License.
5 // (See accompanying file LICENSE or copy at
6 // http://opensource.org/licenses/MIT)
7 //=======================================================================
8 
9 #pragma once
10 
11 #include <type_traits>
12 
13 namespace stator {
14  namespace orphan {
15  template<typename ID, typename T, T value>
16  struct value_conf_t : std::integral_constant<T, value> {
17  using type_id = ID;
18  };
19 
20  template<typename ID>
21  struct basic_conf_t {
22  using type_id = ID;
23  };
24 
25  template<typename ID, typename T>
26  struct type_conf_t {
27  using type_id = ID;
28  using value = T;
29  };
30 
31  template<typename ID, template<typename> class T>
33  using type_id = ID;
34 
35  template<typename C>
36  using value = T<C>;
37  };
38 
39 
40  template<typename D, typename... Args>
41  struct get_value;
42 
43  template<typename D, typename T2, typename... Args>
44  struct get_value<D, T2, Args...> {
45  template<typename D2, typename T22, typename Enable = void>
46  struct impl
47  : std::integral_constant<decltype(D::value), get_value<D, Args...>::value> {};
48 
49  template<typename D2, typename T22>
50  struct impl <D2, T22, typename std::enable_if<std::is_same<typename D2::type_id, typename T22::type_id>::value>::type>
51  : std::integral_constant<decltype(D::value), T22::value> {};
52 
53  static constexpr const auto value = impl<D, T2>::value;
54  };
55 
56  template<typename D>
57  struct get_value<D> : std::integral_constant<decltype(D::value), D::value> {};
58 
59 
60  template<typename D, typename... Args>
61  struct get_type;
62 
63  template<typename D, typename T2, typename... Args>
64  struct get_type<D, T2, Args...> {
65  template<typename D2, typename T22, typename Enable = void>
66  struct impl {
67  using value = typename get_type<D, Args...>::value;
68  };
69 
70  template<typename D2, typename T22>
71  struct impl <D2, T22, typename std::enable_if<std::is_same<typename D2::type_id, typename T22::type_id>::value>::type> {
72  using value = typename T22::value;
73  };
74 
75  using value = typename impl<D, T2>::value;
76  };
77 
78  template<typename D>
79  struct get_type<D> {
80  using value = typename D::value;
81  };
82 
83  template<typename D, typename... Args>
85 
86  template<typename D, typename T2, typename... Args>
87  struct get_template_type<D, T2, Args...> {
88  template<typename D2, typename T22, typename Enable = void>
89  struct impl {
90  template<typename C>
91  using value = typename get_template_type<D, Args...>::template value<C>;
92  };
93 
94  template<typename D2, typename T22>
95  struct impl <D2, T22, typename std::enable_if<std::is_same<typename D2::type_id, typename T22::type_id>::value>::type> {
96  template<typename C>
97  using value = typename T22::template value<C>;
98  };
99 
100  template<typename C>
101  using value = typename impl<D, T2>::template value<C>;
102  };
103 
104  template<typename D>
105  struct get_template_type<D> {
106  template<typename C>
107  using value = typename D::template value<C>;
108  };
109 
110  template<typename T1, typename... Args>
111  struct is_present;
112 
113  template<typename T1, typename T2, typename... Args>
114  struct is_present<T1, T2, Args...> : std::integral_constant<bool, std::is_same<T1, T2>::value || is_present<T1, Args...>::value> {};
115 
116  template<typename T1>
117  struct is_present<T1> : std::false_type {};
118 
119 
120  template<typename... Valid>
121  struct tmp_list {
122  template<typename T>
123  struct contains : std::integral_constant<bool, is_present<typename T::type_id, Valid...>::value> {};
124  };
125 
126  template<typename L, typename... Args>
127  struct is_valid;
128 
129  template<typename L, typename T1, typename... Args>
130  struct is_valid <L, T1, Args...> : std::integral_constant<bool, L::template contains<T1>::value && is_valid<L, Args...>::value> {};
131 
132  template<typename L>
133  struct is_valid <L> : std::true_type {};
134  }
135 }
typename D::template value< C > value
typename impl< D, T2 >::template value< C > value
typename get_type< D, Args... >::value value
typename get_template_type< D, Args... >::template value< C > value
The stator library namespace.
Definition: frontpage.dox:243