23 #include "openPMD/Datatype.hpp" 26 #include <type_traits> 32 #if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__clang__) 33 #define OPENPMD_TEMPLATE_OPERATOR operator 35 #define OPENPMD_TEMPLATE_OPERATOR template operator 50 template <
typename T,
typename =
void>
53 static constexpr
bool value =
false;
59 void_t<decltype(
std::string(std::declval<T>().errorMsg))> >
61 static constexpr
bool value =
true;
84 static ReturnType call(Action action, Args &&...)
88 "[switchType] Action needs either an errorMsg member of type " 89 "std::string or operator()<unsigned>() overloads.");
90 throw std::runtime_error(
91 "[" + std::string(action.errorMsg) +
"] Unknown Datatype.");
95 template <
int n,
typename ReturnType,
typename Action,
typename... Args>
102 typename
std::enable_if<!HasErrorMessageMember<Action>::value>::type,
105 static ReturnType call(Action action, Args &&...args)
107 return action.OPENPMD_TEMPLATE_OPERATOR()<n>(
108 std::forward<Args>(args)...);
130 template <
typename Action,
typename... Args>
132 -> decltype(action.OPENPMD_TEMPLATE_OPERATOR() <
char > (std::forward<Args>(args)...))
135 decltype(action.OPENPMD_TEMPLATE_OPERATOR() <
char > (std::forward<Args>(args)...));
139 return action.OPENPMD_TEMPLATE_OPERATOR()<
char>(
140 std::forward<Args>(args)...);
141 case Datatype::UCHAR:
142 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned char>(
143 std::forward<Args>(args)...);
144 case Datatype::SHORT:
145 return action.OPENPMD_TEMPLATE_OPERATOR()<
short>(
146 std::forward<Args>(args)...);
148 return action.OPENPMD_TEMPLATE_OPERATOR()<
int>(
149 std::forward<Args>(args)...);
151 return action.OPENPMD_TEMPLATE_OPERATOR()<
long>(
152 std::forward<Args>(args)...);
153 case Datatype::LONGLONG:
154 return action.OPENPMD_TEMPLATE_OPERATOR()<
long long>(
155 std::forward<Args>(args)...);
156 case Datatype::USHORT:
157 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned short>(
158 std::forward<Args>(args)...);
160 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned int>(
161 std::forward<Args>(args)...);
162 case Datatype::ULONG:
163 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned long>(
164 std::forward<Args>(args)...);
165 case Datatype::ULONGLONG:
166 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned long long>(
167 std::forward<Args>(args)...);
168 case Datatype::FLOAT:
169 return action.OPENPMD_TEMPLATE_OPERATOR()<
float>(
170 std::forward<Args>(args)...);
171 case Datatype::DOUBLE:
172 return action.OPENPMD_TEMPLATE_OPERATOR()<
double>(
173 std::forward<Args>(args)...);
174 case Datatype::LONG_DOUBLE:
175 return action.OPENPMD_TEMPLATE_OPERATOR()<
long double>(
176 std::forward<Args>(args)...);
177 case Datatype::CFLOAT:
178 return action.OPENPMD_TEMPLATE_OPERATOR()<std::complex<float> >(
179 std::forward<Args>(args)...);
180 case Datatype::CDOUBLE:
181 return action.OPENPMD_TEMPLATE_OPERATOR()<std::complex<double> >(
182 std::forward<Args>(args)...);
183 case Datatype::CLONG_DOUBLE:
184 return action.OPENPMD_TEMPLATE_OPERATOR()<std::complex<long double> >(
185 std::forward<Args>(args)...);
186 case Datatype::STRING:
187 return action.OPENPMD_TEMPLATE_OPERATOR()<std::string>(
188 std::forward<Args>(args)...);
189 case Datatype::VEC_CHAR:
190 return action.OPENPMD_TEMPLATE_OPERATOR()<std::vector<char> >(
191 std::forward<Args>(args)...);
192 case Datatype::VEC_SHORT:
193 return action.OPENPMD_TEMPLATE_OPERATOR()<std::vector<short> >(
194 std::forward<Args>(args)...);
195 case Datatype::VEC_INT:
196 return action.OPENPMD_TEMPLATE_OPERATOR()<std::vector<int> >(
197 std::forward<Args>(args)...);
198 case Datatype::VEC_LONG:
199 return action.OPENPMD_TEMPLATE_OPERATOR()<std::vector<long> >(
200 std::forward<Args>(args)...);
201 case Datatype::VEC_LONGLONG:
202 return action.OPENPMD_TEMPLATE_OPERATOR()<std::vector<long long> >(
203 std::forward<Args>(args)...);
204 case Datatype::VEC_UCHAR:
205 return action.OPENPMD_TEMPLATE_OPERATOR()<std::vector<unsigned char> >(
206 std::forward<Args>(args)...);
207 case Datatype::VEC_USHORT:
208 return action.OPENPMD_TEMPLATE_OPERATOR()<std::vector<unsigned short> >(
209 std::forward<Args>(args)...);
210 case Datatype::VEC_UINT:
211 return action.OPENPMD_TEMPLATE_OPERATOR()<std::vector<unsigned int> >(
212 std::forward<Args>(args)...);
213 case Datatype::VEC_ULONG:
214 return action.OPENPMD_TEMPLATE_OPERATOR()<std::vector<unsigned long> >(
215 std::forward<Args>(args)...);
216 case Datatype::VEC_ULONGLONG:
218 .OPENPMD_TEMPLATE_OPERATOR()<std::vector<unsigned long long> >(
219 std::forward<Args>(args)...);
220 case Datatype::VEC_FLOAT:
221 return action.OPENPMD_TEMPLATE_OPERATOR()<std::vector<float> >(
222 std::forward<Args>(args)...);
223 case Datatype::VEC_DOUBLE:
224 return action.OPENPMD_TEMPLATE_OPERATOR()<std::vector<double> >(
225 std::forward<Args>(args)...);
226 case Datatype::VEC_LONG_DOUBLE:
227 return action.OPENPMD_TEMPLATE_OPERATOR()<std::vector<long double> >(
228 std::forward<Args>(args)...);
229 case Datatype::VEC_CFLOAT:
231 .OPENPMD_TEMPLATE_OPERATOR()<std::vector<std::complex<float> > >(
232 std::forward<Args>(args)...);
233 case Datatype::VEC_CDOUBLE:
235 .OPENPMD_TEMPLATE_OPERATOR()<std::vector<std::complex<double> > >(
236 std::forward<Args>(args)...);
237 case Datatype::VEC_CLONG_DOUBLE:
238 return action.OPENPMD_TEMPLATE_OPERATOR()<
239 std::vector<std::complex<long double> > >(
240 std::forward<Args>(args)...);
241 case Datatype::VEC_STRING:
242 return action.OPENPMD_TEMPLATE_OPERATOR()<std::vector<std::string> >(
243 std::forward<Args>(args)...);
244 case Datatype::ARR_DBL_7:
245 return action.OPENPMD_TEMPLATE_OPERATOR()<std::array<double, 7> >(
246 std::forward<Args>(args)...);
248 return action.OPENPMD_TEMPLATE_OPERATOR()<
bool>(
249 std::forward<Args>(args)...);
250 case Datatype::DATATYPE:
256 Args &&...>::call(std::move(action), std::forward<Args>(args)...);
257 case Datatype::UNDEFINED:
263 Args &&...>::call(std::move(action), std::forward<Args>(args)...);
265 throw std::runtime_error(
266 "Internal error: Encountered unknown datatype (switchType) ->" +
267 std::to_string(static_cast<int>(dt)));
289 template <
typename Action,
typename... Args>
291 -> decltype(action.OPENPMD_TEMPLATE_OPERATOR() <
char > (std::forward<Args>(args)...))
294 decltype(action.OPENPMD_TEMPLATE_OPERATOR() <
char > (std::forward<Args>(args)...));
298 return action.OPENPMD_TEMPLATE_OPERATOR()<
char>(
299 std::forward<Args>(args)...);
300 case Datatype::UCHAR:
301 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned char>(
302 std::forward<Args>(args)...);
303 case Datatype::SHORT:
304 return action.OPENPMD_TEMPLATE_OPERATOR()<
short>(
305 std::forward<Args>(args)...);
307 return action.OPENPMD_TEMPLATE_OPERATOR()<
int>(
308 std::forward<Args>(args)...);
310 return action.OPENPMD_TEMPLATE_OPERATOR()<
long>(
311 std::forward<Args>(args)...);
312 case Datatype::LONGLONG:
313 return action.OPENPMD_TEMPLATE_OPERATOR()<
long long>(
314 std::forward<Args>(args)...);
315 case Datatype::USHORT:
316 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned short>(
317 std::forward<Args>(args)...);
319 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned int>(
320 std::forward<Args>(args)...);
321 case Datatype::ULONG:
322 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned long>(
323 std::forward<Args>(args)...);
324 case Datatype::ULONGLONG:
325 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned long long>(
326 std::forward<Args>(args)...);
327 case Datatype::FLOAT:
328 return action.OPENPMD_TEMPLATE_OPERATOR()<
float>(
329 std::forward<Args>(args)...);
330 case Datatype::DOUBLE:
331 return action.OPENPMD_TEMPLATE_OPERATOR()<
double>(
332 std::forward<Args>(args)...);
333 case Datatype::LONG_DOUBLE:
334 return action.OPENPMD_TEMPLATE_OPERATOR()<
long double>(
335 std::forward<Args>(args)...);
336 case Datatype::CFLOAT:
337 return action.OPENPMD_TEMPLATE_OPERATOR()<std::complex<float> >(
338 std::forward<Args>(args)...);
339 case Datatype::CDOUBLE:
340 return action.OPENPMD_TEMPLATE_OPERATOR()<std::complex<double> >(
341 std::forward<Args>(args)...);
342 case Datatype::CLONG_DOUBLE:
343 return action.OPENPMD_TEMPLATE_OPERATOR()<std::complex<long double> >(
344 std::forward<Args>(args)...);
345 case Datatype::STRING:
346 return action.OPENPMD_TEMPLATE_OPERATOR()<std::string>(
347 std::forward<Args>(args)...);
349 return action.OPENPMD_TEMPLATE_OPERATOR()<
bool>(
350 std::forward<Args>(args)...);
351 case Datatype::DATATYPE:
357 Args &&...>::call(std::move(action), std::forward<Args>(args)...);
358 case Datatype::UNDEFINED:
364 Args &&...>::call(std::move(action), std::forward<Args>(args)...);
366 throw std::runtime_error(
367 "Internal error: Encountered unknown datatype (switchType) ->" +
368 std::to_string(static_cast<int>(dt)));
371 #undef OPENPMD_TEMPLATE_OPERATOR auto switchType(Datatype dt, Action action, Args &&...args) -> decltype(action. template operator()< char >(std::forward< Args >(args)...))
Generalizes switching over an openPMD datatype.
Definition: DatatypeHelpers.hpp:131
Purpose of this struct is to detect at compile time whether Action::template operator()<0>() exists...
Definition: DatatypeHelpers.hpp:82
Datatype
Concrete datatype of an object available at runtime.
Definition: Datatype.hpp:45
Definition: Container.cpp:50
auto switchNonVectorType(Datatype dt, Action action, Args &&...args) -> decltype(action. template operator()< char >(std::forward< Args >(args)...))
Generalizes switching over an openPMD datatype.
Definition: DatatypeHelpers.hpp:290
Definition: DatatypeHelpers.hpp:51
Public definitions of openPMD-api.
Definition: Date.cpp:28