33 #include <type_traits> 40 constexpr
int LOWEST_DATATYPE = 0;
41 constexpr
int HIGHEST_DATATYPE = 1000;
47 CHAR = LOWEST_DATATYPE, UCHAR,
48 SHORT, INT, LONG, LONGLONG,
49 USHORT, UINT, ULONG, ULONGLONG,
50 FLOAT, DOUBLE, LONG_DOUBLE,
51 CFLOAT, CDOUBLE, CLONG_DOUBLE,
74 DATATYPE = HIGHEST_DATATYPE,
101 typename std::remove_pointer<
102 typename std::remove_cv<
104 typename std::remove_all_extents< T >::type
108 typename std::remove_pointer<
109 typename std::remove_cv<
111 typename std::remove_all_extents< U >::type
124 template<
typename T >
144 else if(
decay_equiv<
T, std::complex< float > >::value ){
return DT::CFLOAT; }
145 else if(
decay_equiv<
T, std::complex< double > >::value ){
return DT::CDOUBLE; }
146 else if(
decay_equiv<
T, std::complex< long double > >::value ){
return DT::CLONG_DOUBLE; }
148 else if(
decay_equiv<
T, std::vector< char > >::value ){
return DT::VEC_CHAR; }
149 else if(
decay_equiv<
T, std::vector< short > >::value ){
return DT::VEC_SHORT; }
150 else if(
decay_equiv<
T, std::vector< int > >::value ){
return DT::VEC_INT; }
151 else if(
decay_equiv<
T, std::vector< long > >::value ){
return DT::VEC_LONG; }
152 else if(
decay_equiv<
T, std::vector< long long > >::value ){
return DT::VEC_LONGLONG; }
153 else if(
decay_equiv<
T, std::vector< unsigned char > >::value ){
return DT::VEC_UCHAR; }
154 else if(
decay_equiv<
T, std::vector< unsigned short > >::value ){
return DT::VEC_USHORT; }
155 else if(
decay_equiv<
T, std::vector< unsigned int > >::value ){
return DT::VEC_UINT; }
156 else if(
decay_equiv<
T, std::vector< unsigned long > >::value ){
return DT::VEC_ULONG; }
157 else if(
decay_equiv<
T, std::vector< unsigned long long > >::value ){
return DT::VEC_ULONGLONG; }
158 else if(
decay_equiv<
T, std::vector< float > >::value ){
return DT::VEC_FLOAT; }
159 else if(
decay_equiv<
T, std::vector< double > >::value ){
return DT::VEC_DOUBLE; }
160 else if(
decay_equiv<
T, std::vector< long double > >::value ){
return DT::VEC_LONG_DOUBLE; }
161 else if(
decay_equiv<
T, std::vector< std::complex< float > > >::value ){
return DT::VEC_CFLOAT; }
162 else if(
decay_equiv<
T, std::vector< std::complex< double > > >::value ){
return DT::VEC_CDOUBLE; }
163 else if(
decay_equiv<
T, std::vector< std::complex< long double > > >::value ){
return DT::VEC_CLONG_DOUBLE; }
164 else if(
decay_equiv<
T, std::vector< std::string > >::value ){
return DT::VEC_STRING; }
165 else if(
decay_equiv<
T, std::array< double, 7 > >::value ){
return DT::ARR_DBL_7; }
167 else return Datatype::UNDEFINED;
170 template<
typename T >
174 determineDatatype(std::shared_ptr< T >)
190 else if(
decay_equiv<
T, std::complex< float > >::value ){
return DT::CFLOAT; }
191 else if(
decay_equiv<
T, std::complex< double > >::value ){
return DT::CDOUBLE; }
192 else if(
decay_equiv<
T, std::complex< long double > >::value ){
return DT::CLONG_DOUBLE; }
194 else if(
decay_equiv<
T, std::vector< char > >::value ){
return DT::VEC_CHAR; }
195 else if(
decay_equiv<
T, std::vector< short > >::value ){
return DT::VEC_SHORT; }
196 else if(
decay_equiv<
T, std::vector< int > >::value ){
return DT::VEC_INT; }
197 else if(
decay_equiv<
T, std::vector< long > >::value ){
return DT::VEC_LONG; }
198 else if(
decay_equiv<
T, std::vector< long long > >::value ){
return DT::VEC_LONGLONG; }
199 else if(
decay_equiv<
T, std::vector< unsigned char > >::value ){
return DT::VEC_UCHAR; }
200 else if(
decay_equiv<
T, std::vector< unsigned short > >::value ){
return DT::VEC_USHORT; }
201 else if(
decay_equiv<
T, std::vector< unsigned int > >::value ){
return DT::VEC_UINT; }
202 else if(
decay_equiv<
T, std::vector< unsigned long > >::value ){
return DT::VEC_ULONG; }
203 else if(
decay_equiv<
T, std::vector< unsigned long long > >::value ){
return DT::VEC_ULONGLONG; }
204 else if(
decay_equiv<
T, std::vector< float > >::value ){
return DT::VEC_FLOAT; }
205 else if(
decay_equiv<
T, std::vector< double > >::value ){
return DT::VEC_DOUBLE; }
206 else if(
decay_equiv<
T, std::vector< long double > >::value ){
return DT::VEC_LONG_DOUBLE; }
207 else if(
decay_equiv<
T, std::vector< std::complex< float > > >::value ){
return DT::VEC_CFLOAT; }
208 else if(
decay_equiv<
T, std::vector< std::complex< double > > >::value ){
return DT::VEC_CDOUBLE; }
209 else if(
decay_equiv<
T, std::vector< std::complex< long double > > >::value ){
return DT::VEC_CLONG_DOUBLE; }
210 else if(
decay_equiv<
T, std::vector< std::string > >::value ){
return DT::VEC_STRING; }
211 else if(
decay_equiv<
T, std::array< double, 7 > >::value ){
return DT::ARR_DBL_7; }
213 else return DT::UNDEFINED;
234 return sizeof(
unsigned char);
240 return sizeof(short);
248 case DT::VEC_LONGLONG:
249 return sizeof(
long long);
252 return sizeof(
unsigned short);
255 return sizeof(
unsigned int);
258 return sizeof(
unsigned long);
260 case DT::VEC_ULONGLONG:
261 return sizeof(
unsigned long long);
264 return sizeof(float);
268 return sizeof(double);
269 case DT::LONG_DOUBLE:
270 case DT::VEC_LONG_DOUBLE:
271 return sizeof(
long double);
274 return sizeof(float) * 2;
276 case DT::VEC_CDOUBLE:
277 return sizeof(double) * 2;
278 case DT::CLONG_DOUBLE:
279 case DT::VEC_CLONG_DOUBLE:
280 return sizeof(
long double) * 2;
286 throw std::runtime_error(
"toBytes: Invalid datatype!");
298 return toBytes( d ) * CHAR_BIT;
317 case DT::VEC_LONGLONG:
322 case DT::VEC_ULONGLONG:
325 case DT::VEC_LONG_DOUBLE:
327 case DT::VEC_CDOUBLE:
328 case DT::VEC_CLONG_DOUBLE:
354 case DT::LONG_DOUBLE:
355 case DT::VEC_LONG_DOUBLE:
380 case DT::VEC_CDOUBLE:
381 case DT::CLONG_DOUBLE:
382 case DT::VEC_CLONG_DOUBLE:
396 template<
typename T >
400 Datatype dtype = determineDatatype< T >();
412 template<
typename T >
416 Datatype dtype = determineDatatype< T >();
429 inline std::tuple< bool, bool >
443 case DT::VEC_LONGLONG:
444 return std::make_tuple(
true,
true );
452 case DT::VEC_ULONGLONG:
453 return std::make_tuple(
true,
false );
455 return std::make_tuple(
false,
false );
467 template<
typename T >
468 inline std::tuple< bool, bool >
471 Datatype dtype = determineDatatype< T >();
482 template<
typename T_FP >
487 bool tt_is_fp = isFloatingPoint< T_FP >();
508 template<
typename T_CFP >
513 bool tt_is_cfp = isComplexFloatingPoint< T_CFP >();
534 template<
typename T_Int >
539 bool tt_is_int, tt_is_sig;
540 std::tie(tt_is_int, tt_is_sig) = isInteger< T_Int >();
543 bool dt_is_int, dt_is_sig;
544 std::tie(dt_is_int, dt_is_sig) =
isInteger( d );
549 tt_is_sig == dt_is_sig &&
567 if( static_cast<int>(d) == static_cast<int>(e) )
574 bool d_is_int, d_is_sig;
575 std::tie(d_is_int, d_is_sig) =
isInteger( d );
576 bool e_is_int, e_is_sig;
577 std::tie(e_is_int, e_is_sig) =
isInteger( e );
581 d_is_vec == e_is_vec &&
582 d_is_sig == e_is_sig &&
594 d_is_vec == e_is_vec &&
606 d_is_vec == e_is_vec &&
617 Datatype m_dt = determineDatatype<T>();
625 template<
typename T, std::
size_t n>
631 template <
typename T>
648 std::string datatypeToString(
Datatype dt );
650 Datatype stringToDatatype( std::string s );
653 warnWrongDtype(std::string
const& key,
662 #if !defined(_MSC_VER) bool isVector(Datatype d)
Compare if a Datatype is a vector type.
Definition: Datatype.hpp:307
std::vector< Datatype > openPMD_Datatypes
All openPMD datatypes defined in Datatype, listed in order in a vector.
Definition: Datatype.cpp:346
bool isSameFloatingPoint(Datatype d)
Compare if a Datatype is equivalent to a floating point type.
Definition: Datatype.hpp:484
bool isSameComplexFloatingPoint(Datatype d)
Compare if a Datatype is equivalent to a complex floating point type.
Definition: Datatype.hpp:510
bool isSameInteger(Datatype d)
Compare if a Datatype is equivalent to an integer type.
Definition: Datatype.hpp:536
std::tuple< bool, bool > isInteger(Datatype d)
Compare if a Datatype is an integer type.
Definition: Datatype.hpp:430
Fundamental equivalence check for two given types T and U.
Definition: Datatype.hpp:99
bool isComplexFloatingPoint(Datatype d)
Compare if a Datatype is a complex floating point type.
Definition: Datatype.hpp:371
Datatype
Concrete datatype of an object available at runtime.
Definition: Datatype.hpp:45
Definition: Container.cpp:51
size_t toBits(Datatype d)
Return number of bits representing a Datatype.
Definition: Datatype.hpp:296
Definition: Datatype.hpp:616
Public definitions of openPMD-api.
Definition: Date.cpp:29
Datatype basicDatatype(Datatype dt)
basicDatatype Strip openPMD Datatype of std::vector, std::array et.
Definition: Datatype.cpp:388
size_t toBytes(Datatype d)
Return number of bytes representing a Datatype.
Definition: Datatype.hpp:222
Definition: Datatype.hpp:630
bool isFloatingPoint(Datatype d)
Compare if a Datatype is a floating point type.
Definition: Datatype.hpp:344
bool isSame(openPMD::Datatype const d, openPMD::Datatype const e)
Comparison for two Datatypes.
Definition: Datatype.hpp:564