All Classes Files Functions Variables Typedefs Pages
VariadicTools.hpp
1 #pragma once
2 
3 namespace lumina {
4 
5 struct LogicalAnd {
6  static constexpr bool combine(bool a, bool b) { return a && b; }
7 };
8 
9 struct LogicalOr {
10  static constexpr bool combine(bool a, bool b) { return a || b; }
11 };
12 
13 template <typename T, typename... Ts>
14 struct VariadicTools {
15  using first = T;
16  using last = VariadicTools<Ts...>;
17 
18  template <typename LogicFunc, template <typename> class ValueFunc>
19  static constexpr bool valueUnaryForEach() {
20  return LogicFunc::combine(
21  ValueFunc<T>::value,
22  VariadicTools<Ts...>::template valueUnaryForEach<LogicFunc, ValueFunc>());
23  }
24 
25  template <typename LogicFunc,
26  template <typename, typename> class ValueFunc,
27  typename U>
28  static constexpr bool valueBinaryForEach() {
29  return LogicFunc::combine(
30  ValueFunc<T, U>::value,
31  VariadicTools<Ts...>::template valueBinaryForEach<LogicFunc,
32  ValueFunc,
33  U>());
34  }
35 };
36 
37 template <typename T>
38 struct VariadicTools<T> {
39  using first = T;
40  using last = T;
41 
42  template <typename LogicFunc,
43  template <typename> class ValueFunc,
44  typename... Vs>
45  static constexpr bool valueUnaryForEach() {
46  return ValueFunc<T>::value;
47  }
48  template <typename LogicFunc,
49  template <typename, typename> class ValueFunc,
50  typename U>
51  static constexpr bool valueBinaryForEach() {
52  return ValueFunc<T, U>::value;
53  }
54 };
55 
56 template <typename T, T Needle, T Head, T... Tail>
57 struct HeadInTail {
58  static constexpr bool value = (Needle == Head)
60 };
61 
62 template <typename T, T Needle, T Head>
63 struct HeadInTail<T, Needle, Head> {
64  static constexpr bool value = (Needle == Head);
65 };
66 
67 }
Definition: VariadicTools.hpp:14
Definition: VariadicTools.hpp:9
Definition: VariadicTools.hpp:5
Definition: VariadicTools.hpp:57