23 #include "openPMD/Datatype.hpp" 26 #include <type_traits> 43 template <
typename T,
typename =
void>
46 static constexpr
bool value =
false;
52 static constexpr
bool value =
true;
66 template <
int n,
typename ReturnType,
typename Action,
typename... Args>
69 static ReturnType call(Args &&...args)
73 throw std::runtime_error(
74 "[" + std::string(Action::errorMsg) +
75 "] Unknown Datatype.");
79 return Action::template call<n>(std::forward<Args>(args)...);
81 throw std::runtime_error(
"Unreachable!");
100 template <
typename Action,
typename... Args>
102 -> decltype(Action::template call<char>(std::forward<Args>(args)...))
105 decltype(Action::template call<char>(std::forward<Args>(args)...));
109 return Action::template call<char>(std::forward<Args>(args)...);
110 case Datatype::UCHAR:
111 return Action::template call<unsigned char>(
112 std::forward<Args>(args)...);
113 case Datatype::SCHAR:
114 return Action::template call<signed char>(std::forward<Args>(args)...);
115 case Datatype::SHORT:
116 return Action::template call<short>(std::forward<Args>(args)...);
118 return Action::template call<int>(std::forward<Args>(args)...);
120 return Action::template call<long>(std::forward<Args>(args)...);
121 case Datatype::LONGLONG:
122 return Action::template call<long long>(std::forward<Args>(args)...);
123 case Datatype::USHORT:
124 return Action::template call<unsigned short>(
125 std::forward<Args>(args)...);
127 return Action::template call<unsigned int>(std::forward<Args>(args)...);
128 case Datatype::ULONG:
129 return Action::template call<unsigned long>(
130 std::forward<Args>(args)...);
131 case Datatype::ULONGLONG:
132 return Action::template call<unsigned long long>(
133 std::forward<Args>(args)...);
134 case Datatype::FLOAT:
135 return Action::template call<float>(std::forward<Args>(args)...);
136 case Datatype::DOUBLE:
137 return Action::template call<double>(std::forward<Args>(args)...);
138 case Datatype::LONG_DOUBLE:
139 return Action::template call<long double>(std::forward<Args>(args)...);
140 case Datatype::CFLOAT:
141 return Action::template call<std::complex<float> >(
142 std::forward<Args>(args)...);
143 case Datatype::CDOUBLE:
144 return Action::template call<std::complex<double> >(
145 std::forward<Args>(args)...);
146 case Datatype::CLONG_DOUBLE:
147 return Action::template call<std::complex<long double> >(
148 std::forward<Args>(args)...);
149 case Datatype::STRING:
150 return Action::template call<std::string>(std::forward<Args>(args)...);
151 case Datatype::VEC_CHAR:
152 return Action::template call<std::vector<char> >(
153 std::forward<Args>(args)...);
154 case Datatype::VEC_SHORT:
155 return Action::template call<std::vector<short> >(
156 std::forward<Args>(args)...);
157 case Datatype::VEC_INT:
158 return Action::template call<std::vector<int> >(
159 std::forward<Args>(args)...);
160 case Datatype::VEC_LONG:
161 return Action::template call<std::vector<long> >(
162 std::forward<Args>(args)...);
163 case Datatype::VEC_LONGLONG:
164 return Action::template call<std::vector<long long> >(
165 std::forward<Args>(args)...);
166 case Datatype::VEC_UCHAR:
167 return Action::template call<std::vector<unsigned char> >(
168 std::forward<Args>(args)...);
169 case Datatype::VEC_SCHAR:
170 return Action::template call<std::vector<signed char> >(
171 std::forward<Args>(args)...);
172 case Datatype::VEC_USHORT:
173 return Action::template call<std::vector<unsigned short> >(
174 std::forward<Args>(args)...);
175 case Datatype::VEC_UINT:
176 return Action::template call<std::vector<unsigned int> >(
177 std::forward<Args>(args)...);
178 case Datatype::VEC_ULONG:
179 return Action::template call<std::vector<unsigned long> >(
180 std::forward<Args>(args)...);
181 case Datatype::VEC_ULONGLONG:
182 return Action::template call<std::vector<unsigned long long> >(
183 std::forward<Args>(args)...);
184 case Datatype::VEC_FLOAT:
185 return Action::template call<std::vector<float> >(
186 std::forward<Args>(args)...);
187 case Datatype::VEC_DOUBLE:
188 return Action::template call<std::vector<double> >(
189 std::forward<Args>(args)...);
190 case Datatype::VEC_LONG_DOUBLE:
191 return Action::template call<std::vector<long double> >(
192 std::forward<Args>(args)...);
193 case Datatype::VEC_CFLOAT:
194 return Action::template call<std::vector<std::complex<float> > >(
195 std::forward<Args>(args)...);
196 case Datatype::VEC_CDOUBLE:
197 return Action::template call<std::vector<std::complex<double> > >(
198 std::forward<Args>(args)...);
199 case Datatype::VEC_CLONG_DOUBLE:
200 return Action::template call<std::vector<std::complex<long double> > >(
201 std::forward<Args>(args)...);
202 case Datatype::VEC_STRING:
203 return Action::template call<std::vector<std::string> >(
204 std::forward<Args>(args)...);
205 case Datatype::ARR_DBL_7:
206 return Action::template call<std::array<double, 7> >(
207 std::forward<Args>(args)...);
209 return Action::template call<bool>(std::forward<Args>(args)...);
210 case Datatype::UNDEFINED:
212 CallUndefinedDatatype<0, ReturnType, Action, Args &&...>::call(
213 std::forward<Args>(args)...);
215 throw std::runtime_error(
216 "Internal error: Encountered unknown datatype (switchType) ->" +
217 std::to_string(static_cast<int>(dt)));
236 template <
typename Action,
typename... Args>
238 -> decltype(Action::template call<char>(std::forward<Args>(args)...))
241 decltype(Action::template call<char>(std::forward<Args>(args)...));
245 return Action::template call<char>(std::forward<Args>(args)...);
246 case Datatype::UCHAR:
247 return Action::template call<unsigned char>(
248 std::forward<Args>(args)...);
249 case Datatype::SCHAR:
250 return Action::template call<signed char>(std::forward<Args>(args)...);
251 case Datatype::SHORT:
252 return Action::template call<short>(std::forward<Args>(args)...);
254 return Action::template call<int>(std::forward<Args>(args)...);
256 return Action::template call<long>(std::forward<Args>(args)...);
257 case Datatype::LONGLONG:
258 return Action::template call<long long>(std::forward<Args>(args)...);
259 case Datatype::USHORT:
260 return Action::template call<unsigned short>(
261 std::forward<Args>(args)...);
263 return Action::template call<unsigned int>(std::forward<Args>(args)...);
264 case Datatype::ULONG:
265 return Action::template call<unsigned long>(
266 std::forward<Args>(args)...);
267 case Datatype::ULONGLONG:
268 return Action::template call<unsigned long long>(
269 std::forward<Args>(args)...);
270 case Datatype::FLOAT:
271 return Action::template call<float>(std::forward<Args>(args)...);
272 case Datatype::DOUBLE:
273 return Action::template call<double>(std::forward<Args>(args)...);
274 case Datatype::LONG_DOUBLE:
275 return Action::template call<long double>(std::forward<Args>(args)...);
276 case Datatype::CFLOAT:
277 return Action::template call<std::complex<float> >(
278 std::forward<Args>(args)...);
279 case Datatype::CDOUBLE:
280 return Action::template call<std::complex<double> >(
281 std::forward<Args>(args)...);
282 case Datatype::CLONG_DOUBLE:
283 return Action::template call<std::complex<long double> >(
284 std::forward<Args>(args)...);
285 case Datatype::STRING:
286 return Action::template call<std::string>(std::forward<Args>(args)...);
288 return Action::template call<bool>(std::forward<Args>(args)...);
289 case Datatype::UNDEFINED:
291 CallUndefinedDatatype<0, ReturnType, Action, Args &&...>::call(
292 std::forward<Args>(args)...);
294 throw std::runtime_error(
295 "Internal error: Encountered unknown datatype (switchType) ->" +
296 std::to_string(static_cast<int>(dt)));
auto switchType(Datatype dt, Args &&...args) -> decltype(Action::template call< char >(std::forward< Args >(args)...))
Generalizes switching over an openPMD datatype.
Definition: DatatypeHelpers.hpp:101
Purpose of this struct is to detect at compile time whether Action::template operator()<0>() exists...
Definition: DatatypeHelpers.hpp:67
Datatype
Concrete datatype of an object available at runtime.
Definition: Datatype.hpp:45
auto switchNonVectorType(Datatype dt, Args &&...args) -> decltype(Action::template call< char >(std::forward< Args >(args)...))
Generalizes switching over an openPMD datatype.
Definition: DatatypeHelpers.hpp:237
Definition: Container.cpp:51
Definition: DatatypeHelpers.hpp:44
Public definitions of openPMD-api.