2 #include "hmbdc/Compile.hpp" 7 #define HMBDC_CLASS_HAS_DECLARE(member_name) \ 8 template <typename T> \ 9 class has_##member_name \ 11 typedef char yes_type; \ 12 typedef long no_type; \ 13 template <typename U> static yes_type test(decltype(&U::member_name)); \ 14 template <typename U> static no_type test(...); \ 16 enum {value = sizeof(test<T>(0)) == sizeof(yes_type)}; \ 24 template <
typename ClassType,
typename ReturnType,
typename ...Args>
26 enum { arity =
sizeof...(Args) };
27 typedef ReturnType result_type;
31 using type =
typename std::tuple_element<i, std::tuple<Args...>>::type;
35 template <
typename ClassType,
typename ReturnType,
typename ...Args>
37 enum { arity =
sizeof...(Args) };
39 typedef ReturnType result_type;
43 using type =
typename std::tuple_element<i, std::tuple<Args...>>::type;
47 template <
typename T,
typename Tuple>
50 template <
typename T,
typename ...Types>
52 static constexpr std::size_t value = 0;
57 static constexpr std::size_t value = 0;
60 template <
typename T,
typename U,
typename ...Types>
62 static constexpr std::size_t value = 1 +
index_in_tuple<T, std::tuple<Types...>>::value;
66 template <
typename T,
typename Tuple>
68 using type = std::tuple<T>;
71 template <
typename T,
typename ...Types>
74 using Tuple = std::tuple<Types ...>;
76 using type =
typename std::conditional<
78 , std::tuple<Types ..., T>
83 template <
typename Tuple1,
typename Tuple2>
86 template <
typename Tuple1>
91 template <
typename Tuple1,
typename T,
typename ...Types>
94 using step1 =
typename add_if_not_in_tuple<T, Tuple1>::type;
99 template <
typename Tuple>
101 static constexpr std::size_t value = 0;
104 template <
typename T,
typename ...Ts>
107 static constexpr std::size_t step1 =
max_size_in_tuple<std::tuple<Ts...>>::value;
109 static constexpr std::size_t value = step1 >
sizeof(T) ? step1 :
sizeof(T);
111 template <
typename Tuple0,
typename Tuple1>
114 template <
typename ...T,
typename ...U>
116 using type = std::tuple<T..., U...>;
119 template <
template <
class,
class>
class pred,
typename T,
typename ...Ts>
121 using type = std::tuple<T>;
123 template <
template <
class,
class>
class pred,
typename T
124 ,
typename T0,
typename ...Ts>
126 using type =
typename std::conditional<
128 , std::tuple<T, T0, Ts...>
132 pred, T, std::tuple<Ts...>
138 template <
template <
class,
class>
class pred,
typename Tuple>
141 template <
template <
class,
class>
class pred>
143 using type = std::tuple<>;
146 template <
template <
class,
class>
class pred,
typename T,
typename ...Ts>
151 ,
typename sort_tuple<pred, std::tuple<Ts...>>::type
155 template <typename Tuple, size_t from = 0, size_t to = std::tuple_size<Tuple>::value>
158 template <
typename ...Ts,
size_t from,
size_t to>
160 template <
typename comp>
161 bool operator()(comp&& c) {
162 if constexpr (from >= to) {
165 constexpr
auto at = (from + to) / 2;
166 using atType =
typename std::tuple_element<at, std::tuple<Ts...>>::type;
171 else if (comp_res < 0)
173 std::forward<comp>(c));
176 std::forward<comp>(c));
181 template <
template <
class>
class target_template,
typename M>
182 constexpr
bool is_template =
false;
184 template <
template <
class>
class target_template,
typename N>
185 constexpr
bool is_template<target_template, target_template<N>> =
true;
187 template <
template <
class>
class target_template,
typename Tuple>
189 using type = std::tuple<>;
192 template <
template <
class>
class target_template,
typename T,
typename ...Ts>
198 template <
template <
class>
class target_template,
typename T,
typename ...Ts>
205 template <
template <
class>
class target_template,
typename Tuple>
207 using type = std::tuple<>;
210 template <
template <
class>
class target_template,
typename T,
typename ...Ts>
217 template <
template <
class>
class target_template,
typename T,
typename ...Ts>
222 template<
typename T,
size_t sz>
223 size_t length_of(T (&)[sz]) {
return sz; }
225 template <
typename Base,
typename MTuple>
227 using type = std::tuple<>;
230 template <
typename Base,
typename M,
typename ...Ms>
232 using type =
typename std::conditional<std::is_base_of<Base, M>::value
238 template <
typename Base,
typename MTuple>
240 using type = std::tuple<>;
243 template <
typename Base,
typename M,
typename ...Ms>
245 using type =
typename std::conditional<!std::is_base_of<Base, M>::value
251 template <
template <
class>
class target_pred_template,
typename MTuple>
253 using type = std::tuple<>;
256 template <
template <
class>
class target_pred_template,
typename M,
typename ...Ms>
258 using type =
typename std::conditional<target_pred_template<M>::value
260 ,
typename filter_in_tuple<target_pred_template, std::tuple<Ms...>>::type
264 template <
template <
class>
class target_pred_template,
typename MTuple>
266 using type = std::tuple<>;
269 template <
template <
class>
class target_pred_template,
typename M,
typename ...Ms>
271 using type =
typename std::conditional<target_pred_template<M>::value
277 template <
template <
class>
class apply,
typename Tuple>
279 using type = std::tuple<>;
282 template <
template <
class>
class apply,
typename T,
typename ...Ts>
289 template <
typename Tuple>
294 template <
typename TupleSub,
typename TupleSup>
297 value = std::tuple_size<
298 typename remove_duplicate<TupleSup>::type>::value
Definition: MetaUtils.hpp:84
Definition: MetaUtils.hpp:252
Definition: MetaUtils.hpp:156
Definition: MetaUtils.hpp:120
Definition: MetaUtils.hpp:139
Definition: TypedString.hpp:84
Definition: MetaUtils.hpp:48
Definition: MetaUtils.hpp:290
Definition: MetaUtils.hpp:295
Definition: MetaUtils.hpp:239
Definition: MetaUtils.hpp:206
Definition: MetaUtils.hpp:112
Definition: MetaUtils.hpp:265
Definition: MetaUtils.hpp:67
Definition: MetaUtils.hpp:278
Definition: MetaUtils.hpp:100
Definition: MetaUtils.hpp:226
Definition: MetaUtils.hpp:188
Definition: MetaUtils.hpp:21