1#ifndef AMPGEN_METAUTILS_H
2#define AMPGEN_METAUTILS_H
19 std::string name = abi::__cxa_demangle(
typeid(TYPE).name(),
nullptr,
nullptr, &status);
20 if(std::is_const<
typename std::remove_reference<TYPE>::type>::value) name =
"const " + name;
21 if(std::is_reference<TYPE>()) name = name +
"&";
28 template <
typename T,
typename... args>
struct zeroType {
32 template <
int N,
typename... args>
using nthType =
typename std::tuple_element<N, std::tuple<args...>>::type;
36 template <std::size_t
I = 0,
typename FuncT,
typename... Tp>
typename std::enable_if_t<
I ==
sizeof...(Tp),
void>
for_each(std::tuple<Tp...> &, FuncT) {}
38 template <std::size_t
I = 0,
typename FuncT,
typename... Tp>
39 inline typename std::enable_if_t <
I<
sizeof...(Tp),
void>
for_each(std::tuple<Tp...> &t, FuncT f) {
43 template <
typename iterator,
typename... transform_types>
void for_each_sequence(iterator begin, iterator end, transform_types... transforms) {
44 for_each(std::tuple<transform_types...>(transforms...), [&](
auto &transform) { std::for_each(begin, end, transform); });
47 template <std::size_t
I = 0,
typename FuncT,
typename... Tp>
typename std::enable_if_t<
I ==
sizeof...(Tp),
void>
for_each(
const std::tuple<Tp...> &, FuncT) {}
49 template <std::size_t
I = 0,
typename FuncT,
typename... Tp>
50 inline typename std::enable_if_t <
I<
sizeof...(Tp),
void>
for_each(
const std::tuple<Tp...> &t, FuncT f) {
55 template <std::size_t
I = 0,
typename FuncT,
typename... Tp>
56 typename std::enable_if_t<
I ==
sizeof...(Tp),
void> for_each_with_counter(
const std::tuple<Tp...> &, FuncT) {}
58 template <std::size_t
I = 0,
typename FuncT,
typename... Tp>
59 inline typename std::enable_if_t <
I<
sizeof...(Tp),
void> for_each_with_counter(
const std::tuple<Tp...> &t, FuncT f) {
61 for_each_with_counter<
I + 1, FuncT, Tp...>(t, f);
64 template <
typename R,
typename RT,
typename ARGS,
bool result = std::is_same<decltype(((*(R *)
nullptr))(ARGS())), RT>::value>
constexpr bool typeHelper(
int) {
68 template <
typename R,
typename RT,
typename ARGS>
constexpr bool typeHelper(...) {
return false; }
70 template <
typename R,
typename RT,
typename ARGS>
constexpr bool hasReturnType() {
return typeHelper<R, RT, ARGS>(0); }
71 template <
typename T,
typename... R>
constexpr bool hasConstructor() {
72 return std::is_constructible<T, R...>::value && (
false == std::is_same<T, R...>::value);
75 template <
typename arg = void,
typename... args> std::vector<std::string> typelist() {
76 std::vector<std::string> rt;
79 auto rtp = typelist<args...>();
80 std::copy(rtp.begin(), rtp.end(), std::back_inserter(rt));
85 template <
typename>
struct isTuple : std::false_type {};
86 template <
typename... T>
struct isTuple<std::tuple<T...>> : std::true_type {};
87 template <
typename>
struct isVector : std::false_type {};
88 template <
typename T>
struct isVector<std::vector<T>> : std::true_type {};
89 template <
typename>
struct is_array : std::false_type {};
90 template <
typename T, std::
size_t N>
struct is_array<std::array<T, N>> : std::true_type {};
92#define def_has_function(function_name) \
93 template <typename T> struct has_##function_name { \
94 template <typename U> static auto test(int) -> decltype(std::declval<U>().function_name() == 1, std::true_type()); \
95 template <typename> static std::false_type test(...); \
96 static constexpr bool value = std::is_same<decltype(test<T>(0)), std::true_type>::value; \
99 template <
typename... T>
struct is_functor : std::false_type {};
101 template <
typename T,
typename rt,
typename... args>
struct is_functor<T, rt(args...)> {
102 template <
typename U>
static constexpr auto test(U *) ->
decltype(std::declval<U>().operator()(std::declval<args>()...), std::true_type());
103 template <
typename>
static constexpr std::false_type test(...);
104 static constexpr bool value = std::is_same<decltype(test<T>(0)), std::true_type>::value;
107 template <
int A,
int B>
struct get_power {
108 static const int value = A * get_power<A, B - 1>::value;
110 template <
int A>
struct get_power<A, 0> {
111 static const int value = 1;
typename detail::zeroType< args... >::type zeroType
std::string type_string()
Utility classes for compile-time metaprogramming, such as identifying the types of arguments for gene...
typename std::tuple_element< N, std::tuple< args... > >::type nthType
std::enable_if_t< I==sizeof...(Tp), void > for_each(std::tuple< Tp... > &, FuncT)