Molassembler  1.0.0
Molecule graph and conformer library
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
TupleType.h
Go to the documentation of this file.
1 
8 #ifndef INCLUDE_MOLASSEMBLER_TEMPLE_CONSTEXPR_TUPLE_TYPE_H
9 #define INCLUDE_MOLASSEMBLER_TEMPLE_CONSTEXPR_TUPLE_TYPE_H
10 
12 
13 #include <tuple>
14 
15 namespace Scine {
16 namespace Molassembler {
17 namespace Temple {
18 
20 namespace Tuples {
21 namespace Detail {
22 
24 template<typename T>
25 constexpr auto handleValueVariants(
26  std::enable_if_t<
27  std::is_function<decltype(T::value)>::value,
28  int
29  >* /* enableIfPtr */ = nullptr
30 ) {
31  return T::value();
32 }
33 
35 template<typename T>
36 constexpr auto handleValueVariants(
37  std::enable_if_t<
38  !std::is_function<decltype(T::value)>::value,
39  int
40  >* /* enableIfPtr */ = nullptr
41 ) {
42  return T::value;
43 }
44 
50 template<
51  typename Tuple,
52  template<typename ...> class TemplateFunction,
53  std::size_t... I
54 > constexpr auto unpackHelper(std::index_sequence<I...> /* inds */) {
55  /* Convert the indices parameter pack into a parameter pack containing all
56  * types of the tuple, and return the evaluated template function instantiated
57  * with all those types
58  */
59  return handleValueVariants<
60  TemplateFunction<
61  std::tuple_element_t<I, Tuple>...
62  >
63  >();
64 }
65 
71 template<
72  typename TupleType,
73  template<typename> class TemplateFunction,
74  std::size_t... Inds
75 > constexpr auto mapHelper(std::index_sequence<Inds...> /* inds */) {
76  return makeArray(
77  handleValueVariants<
78  TemplateFunction<
79  std::tuple_element_t<Inds, TupleType>
80  >
81  >()...
82  );
83 }
84 
89 template<
90  typename TupleType,
91  typename T,
92  std::size_t ... Inds
93 > constexpr unsigned countTypeHelper(
94  std::index_sequence<Inds...> /* inds */
95 ) {
96  constexpr std::array<unsigned, sizeof...(Inds)> trues {{
97  static_cast<unsigned>(
98  std::is_same<
99  std::tuple_element_t<Inds, TupleType>,
100  T
101  >::value
102  )...
103  }};
104 
105  unsigned sum = 0;
106 
107  for(unsigned long i = 0; i < sizeof...(Inds); ++i) {
108  sum += trues.at(i);
109  }
110 
111  return sum;
112 }
113 
114 template<typename T>
115 struct RepeatTypeHelper {
116  using BaseType = std::tuple<T>;
117 
118  template<std::size_t ... Inds>
119  static constexpr auto value(std::index_sequence<Inds...> /* inds */)
120  -> std::tuple<std::tuple_element_t<Inds * 0, BaseType>...> {}
121 };
122 
123 } // namespace Detail
124 
130 template<
131  typename Tuple,
132  template<typename ...> class TemplateFunction
133 > constexpr auto unpackToFunction() {
134  return Detail::unpackHelper<Tuple, TemplateFunction>(
135  std::make_index_sequence<
136  std::tuple_size<Tuple>::value
137  >()
138  );
139 }
140 
146 template<
147  typename TupleType,
148  template<typename> class TemplateFunction
149 > constexpr auto map() {
150  return Detail::mapHelper<TupleType, TemplateFunction>(
151  std::make_index_sequence<
152  std::tuple_size<TupleType>::value
153  >()
154  );
155 }
156 
158 template<
159  typename TupleType,
160  typename T
161 > constexpr unsigned countType() {
162  return Detail::countTypeHelper<TupleType, T>(
163  std::make_index_sequence<
164  std::tuple_size<TupleType>::value
165  >()
166  );
167 }
168 
176 template<
177  typename TupleType,
178  template<typename> class UnaryPredicate
179 > constexpr bool allOf() {
180  constexpr size_t N = std::tuple_size<TupleType>::value;
181  constexpr auto mapped = map<TupleType, UnaryPredicate>();
182  for(unsigned i = 0; i < N; ++i) {
183  if(!mapped.at(i)) {
184  return false;
185  }
186  }
187 
188  return true;
189 }
190 
191 template<typename T, unsigned repeats>
192 struct RepeatType {
193  using type = decltype(
194  Detail::RepeatTypeHelper<T>::value(
195  std::make_index_sequence<repeats>()
196  )
197  );
198 };
199 
200 } // namespace Tuples
201 } // namespace Temple
202 } // namespace Molassembler
203 } // namespace Scine
204 
205 #endif
constexpr auto unpackToFunction()
Definition: TupleType.h:133
constexpr auto map()
Definition: TupleType.h:149
std::array-like class
constexpr bool allOf()
all_of with tuple types and template metafunctions
Definition: TupleType.h:179
constexpr unsigned countType()
Counts how often a type is contained in a tuple type.
Definition: TupleType.h:161
constexpr T sum(const ArrayType< T, size > &array)
Sum up all elements of an array-like class.
Definition: Containers.h:111