24 #include "openPMD/config.hpp" 25 #if openPMD_HAVE_ADIOS2 26 #include "openPMD/Dataset.hpp" 27 #include "openPMD/Datatype.hpp" 28 #include "openPMD/DatatypeHelpers.hpp" 44 using bool_representation =
unsigned char;
49 static std::string type();
55 static std::string type();
58 template <
typename T,
size_t n>
61 static std::string type();
67 static std::string type();
73 std::string operator()();
76 std::string operator()();
85 Datatype fromADIOS2Type(std::string
const &dt,
bool verbose =
true);
87 enum class VariableOrAttribute : unsigned char
98 std::string
const &attributeName,
101 template <
int n,
typename... Params>
102 Extent operator()(Params &&...);
119 std::string
const &attributeName,
121 VariableOrAttribute voa = VariableOrAttribute::Attribute);
124 #if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__clang__) 125 #define OPENPMD_TEMPLATE_OPERATOR operator 127 #define OPENPMD_TEMPLATE_OPERATOR template operator 148 template <
typename Action,
typename... Args>
150 -> decltype(action.OPENPMD_TEMPLATE_OPERATOR() <
char > (std::forward<Args>(args)...))
153 decltype(action.OPENPMD_TEMPLATE_OPERATOR() <
char > (std::forward<Args>(args)...));
157 return action.OPENPMD_TEMPLATE_OPERATOR()<
char>(
158 std::forward<Args>(args)...);
159 case Datatype::UCHAR:
160 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned char>(
161 std::forward<Args>(args)...);
162 case Datatype::SHORT:
163 return action.OPENPMD_TEMPLATE_OPERATOR()<
short>(
164 std::forward<Args>(args)...);
166 return action.OPENPMD_TEMPLATE_OPERATOR()<
int>(
167 std::forward<Args>(args)...);
169 return action.OPENPMD_TEMPLATE_OPERATOR()<
long>(
170 std::forward<Args>(args)...);
171 case Datatype::LONGLONG:
172 return action.OPENPMD_TEMPLATE_OPERATOR()<
long long>(
173 std::forward<Args>(args)...);
174 case Datatype::USHORT:
175 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned short>(
176 std::forward<Args>(args)...);
178 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned int>(
179 std::forward<Args>(args)...);
180 case Datatype::ULONG:
181 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned long>(
182 std::forward<Args>(args)...);
183 case Datatype::ULONGLONG:
184 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned long long>(
185 std::forward<Args>(args)...);
186 case Datatype::FLOAT:
187 return action.OPENPMD_TEMPLATE_OPERATOR()<
float>(
188 std::forward<Args>(args)...);
189 case Datatype::DOUBLE:
190 return action.OPENPMD_TEMPLATE_OPERATOR()<
double>(
191 std::forward<Args>(args)...);
192 case Datatype::LONG_DOUBLE:
193 return action.OPENPMD_TEMPLATE_OPERATOR()<
long double>(
194 std::forward<Args>(args)...);
195 case Datatype::CFLOAT:
196 return action.OPENPMD_TEMPLATE_OPERATOR()<std::complex<float> >(
197 std::forward<Args>(args)...);
198 case Datatype::CDOUBLE:
199 return action.OPENPMD_TEMPLATE_OPERATOR()<std::complex<double> >(
200 std::forward<Args>(args)...);
206 case Datatype::STRING:
207 return action.OPENPMD_TEMPLATE_OPERATOR()<std::string>(
208 std::forward<Args>(args)...);
209 case Datatype::DATATYPE:
215 Args &&...>::call(std::move(action), std::forward<Args>(args)...);
216 case Datatype::UNDEFINED:
222 Args &&...>::call(std::move(action), std::forward<Args>(args)...);
224 throw std::runtime_error(
225 "Internal error: Encountered unknown datatype (switchType) ->" +
226 std::to_string(static_cast<int>(dt)));
249 template <
typename Action,
typename... Args>
251 -> decltype(action.OPENPMD_TEMPLATE_OPERATOR() <
char > (std::forward<Args>(args)...))
254 decltype(action.OPENPMD_TEMPLATE_OPERATOR() <
char > (std::forward<Args>(args)...));
258 return action.OPENPMD_TEMPLATE_OPERATOR()<
char>(
259 std::forward<Args>(args)...);
260 case Datatype::UCHAR:
261 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned char>(
262 std::forward<Args>(args)...);
263 case Datatype::SHORT:
264 return action.OPENPMD_TEMPLATE_OPERATOR()<
short>(
265 std::forward<Args>(args)...);
267 return action.OPENPMD_TEMPLATE_OPERATOR()<
int>(
268 std::forward<Args>(args)...);
270 return action.OPENPMD_TEMPLATE_OPERATOR()<
long>(
271 std::forward<Args>(args)...);
272 case Datatype::LONGLONG:
273 return action.OPENPMD_TEMPLATE_OPERATOR()<
long long>(
274 std::forward<Args>(args)...);
275 case Datatype::USHORT:
276 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned short>(
277 std::forward<Args>(args)...);
279 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned int>(
280 std::forward<Args>(args)...);
281 case Datatype::ULONG:
282 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned long>(
283 std::forward<Args>(args)...);
284 case Datatype::ULONGLONG:
285 return action.OPENPMD_TEMPLATE_OPERATOR()<
unsigned long long>(
286 std::forward<Args>(args)...);
287 case Datatype::FLOAT:
288 return action.OPENPMD_TEMPLATE_OPERATOR()<
float>(
289 std::forward<Args>(args)...);
290 case Datatype::DOUBLE:
291 return action.OPENPMD_TEMPLATE_OPERATOR()<
double>(
292 std::forward<Args>(args)...);
293 case Datatype::LONG_DOUBLE:
294 return action.OPENPMD_TEMPLATE_OPERATOR()<
long double>(
295 std::forward<Args>(args)...);
296 case Datatype::CFLOAT:
297 return action.OPENPMD_TEMPLATE_OPERATOR()<std::complex<float> >(
298 std::forward<Args>(args)...);
299 case Datatype::CDOUBLE:
300 return action.OPENPMD_TEMPLATE_OPERATOR()<std::complex<double> >(
301 std::forward<Args>(args)...);
307 case Datatype::DATATYPE:
313 Args &&...>::call(std::move(action), std::forward<Args>(args)...);
314 case Datatype::UNDEFINED:
320 Args &&...>::call(std::move(action), std::forward<Args>(args)...);
322 throw std::runtime_error(
323 "Internal error: Encountered unknown datatype (switchType) ->" +
324 std::to_string(static_cast<int>(dt)));
328 #undef OPENPMD_TEMPLATE_OPERATOR 331 #endif // openPMD_HAVE_ADIOS2 Definition: ADIOS2Auxiliary.hpp:70
Purpose of this struct is to detect at compile time whether Action::template operator()<0>() exists...
Definition: DatatypeHelpers.hpp:82
Definition: ADIOS2Auxiliary.hpp:93
auto switchAdios2AttributeType(Datatype dt, Action action, Args &&...args) -> decltype(action. template operator()< char >(std::forward< Args >(args)...))
Generalizes switching over an openPMD datatype.
Definition: ADIOS2Auxiliary.hpp:149
Datatype
Concrete datatype of an object available at runtime.
Definition: Datatype.hpp:45
Varidic datatype supporting at least all formats for attributes specified in the openPMD standard...
Definition: Attribute.hpp:51
Definition: Container.cpp:50
Public definitions of openPMD-api.
Definition: Date.cpp:28
auto switchAdios2VariableType(Datatype dt, Action action, Args &&...args) -> decltype(action. template operator()< char >(std::forward< Args >(args)...))
Generalizes switching over an openPMD datatype.
Definition: ADIOS2Auxiliary.hpp:250
Definition: ADIOS2Auxiliary.hpp:47