|
20 | 20 | */ |
21 | 21 | #pragma once |
22 | 22 |
|
| 23 | +#include "openPMD/auxiliary/TypeTraits.hpp" |
| 24 | + |
23 | 25 | #include <array> |
24 | 26 | #include <climits> |
25 | 27 | #include <complex> |
@@ -265,161 +267,32 @@ inline constexpr Datatype determineDatatype() |
265 | 267 | } |
266 | 268 |
|
267 | 269 | template <typename T> |
268 | | -inline constexpr Datatype determineDatatype(T const *) |
| 270 | +inline constexpr Datatype determineDatatype(std::shared_ptr<T>) |
269 | 271 | { |
270 | 272 | return determineDatatype<T>(); |
271 | 273 | } |
272 | 274 |
|
273 | 275 | template <typename T> |
274 | | -inline constexpr Datatype determineDatatype(std::shared_ptr<T>) |
| 276 | +inline constexpr Datatype determineDatatypeRaw(T const *) |
275 | 277 | { |
276 | | - using DT = Datatype; |
277 | | - if (decay_equiv<T, char>::value) |
278 | | - { |
279 | | - return DT::CHAR; |
280 | | - } |
281 | | - else if (decay_equiv<T, unsigned char>::value) |
282 | | - { |
283 | | - return DT::UCHAR; |
284 | | - } |
285 | | - else if (decay_equiv<T, short>::value) |
286 | | - { |
287 | | - return DT::SHORT; |
288 | | - } |
289 | | - else if (decay_equiv<T, int>::value) |
290 | | - { |
291 | | - return DT::INT; |
292 | | - } |
293 | | - else if (decay_equiv<T, long>::value) |
294 | | - { |
295 | | - return DT::LONG; |
296 | | - } |
297 | | - else if (decay_equiv<T, long long>::value) |
298 | | - { |
299 | | - return DT::LONGLONG; |
300 | | - } |
301 | | - else if (decay_equiv<T, unsigned short>::value) |
302 | | - { |
303 | | - return DT::USHORT; |
304 | | - } |
305 | | - else if (decay_equiv<T, unsigned int>::value) |
306 | | - { |
307 | | - return DT::UINT; |
308 | | - } |
309 | | - else if (decay_equiv<T, unsigned long>::value) |
310 | | - { |
311 | | - return DT::ULONG; |
312 | | - } |
313 | | - else if (decay_equiv<T, unsigned long long>::value) |
314 | | - { |
315 | | - return DT::ULONGLONG; |
316 | | - } |
317 | | - else if (decay_equiv<T, float>::value) |
318 | | - { |
319 | | - return DT::FLOAT; |
320 | | - } |
321 | | - else if (decay_equiv<T, double>::value) |
322 | | - { |
323 | | - return DT::DOUBLE; |
324 | | - } |
325 | | - else if (decay_equiv<T, long double>::value) |
326 | | - { |
327 | | - return DT::LONG_DOUBLE; |
328 | | - } |
329 | | - else if (decay_equiv<T, std::complex<float>>::value) |
330 | | - { |
331 | | - return DT::CFLOAT; |
332 | | - } |
333 | | - else if (decay_equiv<T, std::complex<double>>::value) |
334 | | - { |
335 | | - return DT::CDOUBLE; |
336 | | - } |
337 | | - else if (decay_equiv<T, std::complex<long double>>::value) |
338 | | - { |
339 | | - return DT::CLONG_DOUBLE; |
340 | | - } |
341 | | - else if (decay_equiv<T, std::string>::value) |
342 | | - { |
343 | | - return DT::STRING; |
344 | | - } |
345 | | - else if (decay_equiv<T, std::vector<char>>::value) |
346 | | - { |
347 | | - return DT::VEC_CHAR; |
348 | | - } |
349 | | - else if (decay_equiv<T, std::vector<short>>::value) |
350 | | - { |
351 | | - return DT::VEC_SHORT; |
352 | | - } |
353 | | - else if (decay_equiv<T, std::vector<int>>::value) |
354 | | - { |
355 | | - return DT::VEC_INT; |
356 | | - } |
357 | | - else if (decay_equiv<T, std::vector<long>>::value) |
358 | | - { |
359 | | - return DT::VEC_LONG; |
360 | | - } |
361 | | - else if (decay_equiv<T, std::vector<long long>>::value) |
362 | | - { |
363 | | - return DT::VEC_LONGLONG; |
364 | | - } |
365 | | - else if (decay_equiv<T, std::vector<unsigned char>>::value) |
366 | | - { |
367 | | - return DT::VEC_UCHAR; |
368 | | - } |
369 | | - else if (decay_equiv<T, std::vector<unsigned short>>::value) |
370 | | - { |
371 | | - return DT::VEC_USHORT; |
372 | | - } |
373 | | - else if (decay_equiv<T, std::vector<unsigned int>>::value) |
374 | | - { |
375 | | - return DT::VEC_UINT; |
376 | | - } |
377 | | - else if (decay_equiv<T, std::vector<unsigned long>>::value) |
378 | | - { |
379 | | - return DT::VEC_ULONG; |
380 | | - } |
381 | | - else if (decay_equiv<T, std::vector<unsigned long long>>::value) |
382 | | - { |
383 | | - return DT::VEC_ULONGLONG; |
384 | | - } |
385 | | - else if (decay_equiv<T, std::vector<float>>::value) |
386 | | - { |
387 | | - return DT::VEC_FLOAT; |
388 | | - } |
389 | | - else if (decay_equiv<T, std::vector<double>>::value) |
390 | | - { |
391 | | - return DT::VEC_DOUBLE; |
392 | | - } |
393 | | - else if (decay_equiv<T, std::vector<long double>>::value) |
394 | | - { |
395 | | - return DT::VEC_LONG_DOUBLE; |
396 | | - } |
397 | | - else if (decay_equiv<T, std::vector<std::complex<float>>>::value) |
398 | | - { |
399 | | - return DT::VEC_CFLOAT; |
400 | | - } |
401 | | - else if (decay_equiv<T, std::vector<std::complex<double>>>::value) |
402 | | - { |
403 | | - return DT::VEC_CDOUBLE; |
404 | | - } |
405 | | - else if (decay_equiv<T, std::vector<std::complex<long double>>>::value) |
406 | | - { |
407 | | - return DT::VEC_CLONG_DOUBLE; |
408 | | - } |
409 | | - else if (decay_equiv<T, std::vector<std::string>>::value) |
410 | | - { |
411 | | - return DT::VEC_STRING; |
412 | | - } |
413 | | - else if (decay_equiv<T, std::array<double, 7>>::value) |
| 278 | + return determineDatatype<T>(); |
| 279 | +} |
| 280 | + |
| 281 | +template <typename T_ContiguousContainer> |
| 282 | +inline constexpr Datatype determineDatatypeContiguous(T_ContiguousContainer &&) |
| 283 | +{ |
| 284 | + using T_ContiguousContainer_stripped = |
| 285 | + std::remove_reference_t<T_ContiguousContainer>; |
| 286 | + if constexpr (auxiliary::IsContiguousContainer_v< |
| 287 | + T_ContiguousContainer_stripped>) |
414 | 288 | { |
415 | | - return DT::ARR_DBL_7; |
| 289 | + return determineDatatype< |
| 290 | + typename T_ContiguousContainer_stripped::value_type>(); |
416 | 291 | } |
417 | | - else if (decay_equiv<T, bool>::value) |
| 292 | + else |
418 | 293 | { |
419 | | - return DT::BOOL; |
| 294 | + return Datatype::UNDEFINED; |
420 | 295 | } |
421 | | - else |
422 | | - return DT::UNDEFINED; |
423 | 296 | } |
424 | 297 |
|
425 | 298 | /** Return number of bytes representing a Datatype |
|
0 commit comments