26 template <
typename T1,
typename... Ts>
using first_type = T1;
27 template <
typename T1,
typename T2,
typename... Ts>
using second_type = T2;
28 template <
typename T1,
typename T2,
typename T3,
typename... Ts>
using third_type = T3;
32 template <
size_t ID,
typename T,
typename... Ts>
35 template <
typename T,
typename... Ts>
39 template <
size_t ID,
typename... Ts>
49 template <typename TEST> constexpr
bool has_type() {
return false; }
50 template <
typename TEST,
typename FIRST,
typename... OTHERS>
51 constexpr
bool has_type() {
return std::is_same<TEST, FIRST>() || has_type<TEST,OTHERS...>(); }
54 template <
typename TEST> constexpr
size_t count_type() {
return 0; }
55 template <
typename TEST,
typename FIRST,
typename... OTHERS>
61 template <
typename TEST_T,
typename T1,
typename... Ts>
63 if (std::is_same<TEST_T, T1>())
return 0;
65 if (next_id < 0)
return -1;
69 template <
typename TEST_T,
typename... Ts>
79 template <
typename TYPE1,
typename TYPE2,
typename... TYPE_LIST>
84 template <
typename TYPE1,
typename TYPE2,
typename... TYPE_LIST>
87 && has_unique_types<TYPE2, TYPE_LIST...>();
93 template <
typename REAL_TYPE,
typename EVAL_TYPE>
using sfinae_decoy = REAL_TYPE;
94 template <
typename REAL_TYPE,
typename EVAL_TYPE>
using type_decoy = REAL_TYPE;
96 template <
typename EVAL_TYPE>
using int_decoy = int;
99 #define emp_bool_decoy(TEST) emp::sfinae_decoy<bool, decltype(TEST)> 100 #define emp_int_decoy(TEST) emp::sfinae_decoy<int, decltype(TEST)> 111 template <
template <
typename...>
class FILTER,
typename T>
113 template <
template <
typename...>
class FILTER,
typename T>
117 template <
template <
typename...>
class TEST,
typename T>
120 template <
template <
typename...>
class TEST,
typename T>
125 template <
typename RESULT,
bool value_exist>
128 template <
typename RESULT>
133 template <
template <
typename...>
class TEST,
typename T,
bool exist>
136 using result_t = TEST<T>;
137 constexpr
bool has_value = test_type_exist<value_member, result_t>();
142 template <
template <
typename...>
class TEST,
typename T>
147 template <
template <
typename...>
class TEST,
typename T>
157 template <
typename... PARAMS>
159 template <
typename FUN_T,
typename... EXTRA>
160 static auto call(FUN_T fun, PARAMS... args, EXTRA...) {
167 template <
typename R,
typename... PARAMS,
typename... ARGS>
173 template <
typename R,
typename... ARGS>
175 template <
typename... EXTRA_ARGS>
176 static auto Expand(
const std::function<R(ARGS...)> & fun) {
177 return [fun](ARGS... args, EXTRA_ARGS...){
return fun(args...); };
184 template <
typename T>
185 auto Hash_impl(
const T & x,
bool) -> decltype(x.GetHash()) {
return x.GetHash(); }
188 template <
typename T>
189 auto Hash_impl(
const T & x,
int) -> decltype(std::hash<T>()(x)) {
return std::hash<T>()(x); }
192 template <
typename T>
201 template <
typename T>
205 template <
typename T>
209 template<
typename T1,
typename T2,
typename... EXTRA>
210 std::size_t
CombineHash(
const T1 & x1,
const T2 & x2,
const EXTRA &... x_extra) {
211 const std::size_t hash2 =
CombineHash(x2, x_extra...);
213 return Hash<T1>(x1) + 0x9e3779b9 + (hash2 << 19) + (hash2 >> 13);
226 template<
template <
typename...>
class T,
typename... V,
typename... U>
232 template<
typename T,
typename... U>
243 template<
template <
typename...>
class T,
typename X,
typename ...V,
typename U>
250 template<
typename T,
typename U>
261 static constexpr
int Sum() {
return I; }
268 template <
typename Function>
273 template <
typename ClassType,
typename ReturnType,
typename... Args>
276 typedef ReturnType (*pointer)(Args...);
277 typedef std::function<ReturnType(Args...)>
function;
280 template <
typename Function>
287 template <
typename Function>
T< U... > type
Definition: meta.h:228
static constexpr bool Test()
Definition: meta.h:143
REAL_TYPE sfinae_decoy
Definition: meta.h:93
static constexpr bool Test()
Definition: meta.h:135
REAL_TYPE type_decoy
Definition: meta.h:94
static constexpr int Sum()
Definition: meta.h:261
std::size_t Hash_impl(const T &x,...)
Definition: meta.h:193
T type
Definition: meta.h:223
run_and_ignore(T &&...)
Definition: meta.h:23
std::size_t CombineHash(const T &x)
Definition: meta.h:207
constexpr bool tt_exist_impl(...)
Definition: meta.h:114
bool bool_decoy
Definition: meta.h:95
constexpr bool test_type_exist()
Definition: meta.h:118
constexpr bool has_unique_first_type()
Definition: meta.h:76
static constexpr int Product()
Definition: meta.h:262
typename internal::AdaptTemplateHelper_Arg1< T, U >::type AdaptTemplate_Arg1
Definition: meta.h:251
ID
Definition: struct.h:26
typename internal::AdaptTemplateHelper< T, U... >::type AdaptTemplate
Definition: meta.h:233
auto Hash_impl(const T &x, bool) -> decltype(x.GetHash())
Definition: meta.h:185
static constexpr bool Test()
Definition: meta.h:126
static constexpr int Sum()
Definition: meta.h:256
constexpr int get_type_index_impl()
Definition: meta.h:62
typename internal::pack_id_impl< ID, Ts... >::type pack_id
Definition: meta.h:40
pack_id< sizeof...(Ts)-1, Ts... > last_type
Definition: meta.h:43
decltype(T::value) value_member
Definition: meta.h:131
std::size_t Hash(const T &x)
Definition: meta.h:202
static auto Expand(const std::function< R(ARGS...)> &fun)
Definition: meta.h:176
auto TruncateCall(std::function< R(PARAMS...)> fun, ARGS &&...args)
Definition: meta.h:168
constexpr bool has_unique_types()
Definition: meta.h:77
T type
Definition: meta.h:240
T1 first_type
Definition: meta.h:26
T type
Definition: meta.h:36
If we are in emscripten, make sure to include the header.
Definition: array.h:37
static auto call(FUN_T fun, PARAMS...args, EXTRA...)
Definition: meta.h:160
static constexpr int Product()
Definition: meta.h:257
Definition: GenericFunction.h:47
function_traits< Function >::pointer to_function_pointer(Function &lambda)
Definition: meta.h:282
static constexpr bool Test()
Definition: meta.h:129
constexpr int get_type_index()
Definition: meta.h:70
typename pack_id_impl< ID-1, Ts... >::type type
Definition: meta.h:33
T< U, V... > type
Definition: meta.h:246
constexpr bool test_type_value()
Definition: meta.h:121
constexpr int get_type_index_impl()
Definition: meta.h:60
T2 second_type
Definition: meta.h:27
constexpr bool test_type()
Definition: meta.h:148
constexpr size_t count_type()
Definition: meta.h:54
T3 third_type
Definition: meta.h:28
int int_decoy
Definition: meta.h:96
constexpr bool has_type()
Definition: meta.h:49
function_traits< Function >::function to_function(Function &lambda)
Definition: meta.h:289