27 #include <type_traits> 45 SHORT, INT, LONG, LONGLONG,
46 USHORT, UINT, ULONG, ULONGLONG,
47 FLOAT, DOUBLE, LONG_DOUBLE,
48 CFLOAT, CDOUBLE, CLONG_DOUBLE,
98 typename std::remove_pointer<
99 typename std::remove_cv<
101 typename std::remove_all_extents< T >::type
105 typename std::remove_pointer<
106 typename std::remove_cv<
108 typename std::remove_all_extents< U >::type
121 template<
typename T >
141 else if(
decay_equiv<
T, std::complex< float > >::value ){
return DT::CFLOAT; }
142 else if(
decay_equiv<
T, std::complex< double > >::value ){
return DT::CDOUBLE; }
143 else if(
decay_equiv<
T, std::complex< long double > >::value ){
return DT::CLONG_DOUBLE; }
145 else if(
decay_equiv<
T, std::vector< char > >::value ){
return DT::VEC_CHAR; }
146 else if(
decay_equiv<
T, std::vector< short > >::value ){
return DT::VEC_SHORT; }
147 else if(
decay_equiv<
T, std::vector< int > >::value ){
return DT::VEC_INT; }
148 else if(
decay_equiv<
T, std::vector< long > >::value ){
return DT::VEC_LONG; }
149 else if(
decay_equiv<
T, std::vector< long long > >::value ){
return DT::VEC_LONGLONG; }
150 else if(
decay_equiv<
T, std::vector< unsigned char > >::value ){
return DT::VEC_UCHAR; }
151 else if(
decay_equiv<
T, std::vector< unsigned short > >::value ){
return DT::VEC_USHORT; }
152 else if(
decay_equiv<
T, std::vector< unsigned int > >::value ){
return DT::VEC_UINT; }
153 else if(
decay_equiv<
T, std::vector< unsigned long > >::value ){
return DT::VEC_ULONG; }
154 else if(
decay_equiv<
T, std::vector< unsigned long long > >::value ){
return DT::VEC_ULONGLONG; }
155 else if(
decay_equiv<
T, std::vector< float > >::value ){
return DT::VEC_FLOAT; }
156 else if(
decay_equiv<
T, std::vector< double > >::value ){
return DT::VEC_DOUBLE; }
157 else if(
decay_equiv<
T, std::vector< long double > >::value ){
return DT::VEC_LONG_DOUBLE; }
158 else if(
decay_equiv<
T, std::vector< std::complex< float > > >::value ){
return DT::VEC_CFLOAT; }
159 else if(
decay_equiv<
T, std::vector< std::complex< double > > >::value ){
return DT::VEC_CDOUBLE; }
160 else if(
decay_equiv<
T, std::vector< std::complex< long double > > >::value ){
return DT::VEC_CLONG_DOUBLE; }
161 else if(
decay_equiv<
T, std::vector< std::string > >::value ){
return DT::VEC_STRING; }
162 else if(
decay_equiv<
T, std::array< double, 7 > >::value ){
return DT::ARR_DBL_7; }
164 else return Datatype::UNDEFINED;
167 template<
typename T >
171 determineDatatype(std::shared_ptr< T >)
187 else if(
decay_equiv<
T, std::complex< float > >::value ){
return DT::CFLOAT; }
188 else if(
decay_equiv<
T, std::complex< double > >::value ){
return DT::CDOUBLE; }
189 else if(
decay_equiv<
T, std::complex< long double > >::value ){
return DT::CLONG_DOUBLE; }
191 else if(
decay_equiv<
T, std::vector< char > >::value ){
return DT::VEC_CHAR; }
192 else if(
decay_equiv<
T, std::vector< short > >::value ){
return DT::VEC_SHORT; }
193 else if(
decay_equiv<
T, std::vector< int > >::value ){
return DT::VEC_INT; }
194 else if(
decay_equiv<
T, std::vector< long > >::value ){
return DT::VEC_LONG; }
195 else if(
decay_equiv<
T, std::vector< long long > >::value ){
return DT::VEC_LONGLONG; }
196 else if(
decay_equiv<
T, std::vector< unsigned char > >::value ){
return DT::VEC_UCHAR; }
197 else if(
decay_equiv<
T, std::vector< unsigned short > >::value ){
return DT::VEC_USHORT; }
198 else if(
decay_equiv<
T, std::vector< unsigned int > >::value ){
return DT::VEC_UINT; }
199 else if(
decay_equiv<
T, std::vector< unsigned long > >::value ){
return DT::VEC_ULONG; }
200 else if(
decay_equiv<
T, std::vector< unsigned long long > >::value ){
return DT::VEC_ULONGLONG; }
201 else if(
decay_equiv<
T, std::vector< float > >::value ){
return DT::VEC_FLOAT; }
202 else if(
decay_equiv<
T, std::vector< double > >::value ){
return DT::VEC_DOUBLE; }
203 else if(
decay_equiv<
T, std::vector< long double > >::value ){
return DT::VEC_LONG_DOUBLE; }
204 else if(
decay_equiv<
T, std::vector< std::complex< float > > >::value ){
return DT::VEC_CFLOAT; }
205 else if(
decay_equiv<
T, std::vector< std::complex< double > > >::value ){
return DT::VEC_CDOUBLE; }
206 else if(
decay_equiv<
T, std::vector< std::complex< long double > > >::value ){
return DT::VEC_CLONG_DOUBLE; }
207 else if(
decay_equiv<
T, std::vector< std::string > >::value ){
return DT::VEC_STRING; }
208 else if(
decay_equiv<
T, std::array< double, 7 > >::value ){
return DT::ARR_DBL_7; }
210 else return DT::UNDEFINED;
231 return sizeof(
unsigned char);
238 return sizeof(short);
246 case DT::VEC_LONGLONG:
247 return sizeof(
long long);
250 return sizeof(
unsigned short);
253 return sizeof(
unsigned int);
256 return sizeof(
unsigned long);
258 case DT::VEC_ULONGLONG:
259 return sizeof(
unsigned long long);
262 return sizeof(float);
266 return sizeof(double);
267 case DT::LONG_DOUBLE:
268 case DT::VEC_LONG_DOUBLE:
269 return sizeof(
long double);
273 return sizeof(float) * 2;
276 case DT::VEC_CDOUBLE:
277 return sizeof(double) * 2;
279 case DT::CLONG_DOUBLE:
280 case DT::VEC_CLONG_DOUBLE:
281 return sizeof(
long double) * 2;
288 throw std::runtime_error(
"toBytes: Invalid datatype!");
300 return toBytes( d ) * CHAR_BIT;
319 case DT::VEC_LONGLONG:
324 case DT::VEC_ULONGLONG:
327 case DT::VEC_LONG_DOUBLE:
329 case DT::VEC_CDOUBLE:
330 case DT::VEC_CLONG_DOUBLE:
356 case DT::LONG_DOUBLE:
357 case DT::VEC_LONG_DOUBLE:
384 case DT::VEC_CDOUBLE:
385 case DT::CLONG_DOUBLE:
386 case DT::VEC_CLONG_DOUBLE:
400 template<
typename T >
404 Datatype dtype = determineDatatype< T >();
416 template<
typename T >
420 Datatype dtype = determineDatatype< T >();
433 inline std::tuple< bool, bool >
447 case DT::VEC_LONGLONG:
448 return std::make_tuple(
true,
true );
456 case DT::VEC_ULONGLONG:
457 return std::make_tuple(
true,
false );
459 return std::make_tuple(
false,
false );
471 template<
typename T >
472 inline std::tuple< bool, bool >
475 Datatype dtype = determineDatatype< T >();
486 template<
typename T_FP >
491 bool tt_is_fp = isFloatingPoint< T_FP >();
512 template<
typename T_CFP >
517 bool tt_is_cfp = isComplexFloatingPoint< T_CFP >();
538 template<
typename T_Int >
543 bool tt_is_int, tt_is_sig;
544 std::tie(tt_is_int, tt_is_sig) = isInteger< T_Int >();
547 bool dt_is_int, dt_is_sig;
548 std::tie(dt_is_int, dt_is_sig) =
isInteger( d );
553 tt_is_sig == dt_is_sig &&
571 if( static_cast<int>(d) == static_cast<int>(e) )
578 bool d_is_int, d_is_sig;
579 std::tie(d_is_int, d_is_sig) =
isInteger( d );
580 bool e_is_int, e_is_sig;
581 std::tie(e_is_int, e_is_sig) =
isInteger( e );
585 d_is_vec == e_is_vec &&
586 d_is_sig == e_is_sig &&
598 d_is_vec == e_is_vec &&
610 d_is_vec == e_is_vec &&
618 #if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__clang__) 619 #define OPENPMD_TEMPLATE_OPERATOR operator 621 #define OPENPMD_TEMPLATE_OPERATOR template operator 641 template <
typename ReturnType = void,
typename Action,
typename... Args >
647 return action.OPENPMD_TEMPLATE_OPERATOR( )<
char >(
648 std::forward< Args >( args )... );
649 case Datatype::UCHAR:
650 return action.OPENPMD_TEMPLATE_OPERATOR( )<
unsigned char >(
651 std::forward< Args >( args )... );
652 case Datatype::SHORT:
653 return action.OPENPMD_TEMPLATE_OPERATOR( )<
short >(
654 std::forward< Args >( args )... );
656 return action.OPENPMD_TEMPLATE_OPERATOR( )<
int >(
657 std::forward< Args >( args )... );
659 return action.OPENPMD_TEMPLATE_OPERATOR( )<
long >(
660 std::forward< Args >( args )... );
661 case Datatype::LONGLONG:
662 return action.OPENPMD_TEMPLATE_OPERATOR( )<
long long >(
663 std::forward< Args >( args )... );
664 case Datatype::USHORT:
665 return action.OPENPMD_TEMPLATE_OPERATOR( )<
unsigned short >(
666 std::forward< Args >( args )... );
668 return action.OPENPMD_TEMPLATE_OPERATOR( )<
unsigned int >(
669 std::forward< Args >( args )... );
670 case Datatype::ULONG:
671 return action.OPENPMD_TEMPLATE_OPERATOR( )<
unsigned long >(
672 std::forward< Args >( args )... );
673 case Datatype::ULONGLONG:
674 return action.OPENPMD_TEMPLATE_OPERATOR( )<
unsigned long long >(
675 std::forward< Args >( args )... );
676 case Datatype::FLOAT:
677 return action.OPENPMD_TEMPLATE_OPERATOR( )<
float >(
678 std::forward< Args >( args )... );
679 case Datatype::DOUBLE:
680 return action.OPENPMD_TEMPLATE_OPERATOR( )<
double >(
681 std::forward< Args >( args )... );
682 case Datatype::LONG_DOUBLE:
683 return action.OPENPMD_TEMPLATE_OPERATOR( )<
long double >(
684 std::forward< Args >( args )... );
685 case Datatype::CFLOAT:
686 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::complex< float > >(
687 std::forward< Args >( args )... );
688 case Datatype::CDOUBLE:
689 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::complex< double > >(
690 std::forward< Args >( args )... );
691 case Datatype::CLONG_DOUBLE:
692 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::complex< long double > >(
693 std::forward< Args >( args )... );
694 case Datatype::STRING:
695 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::string >(
696 std::forward< Args >( args )... );
697 case Datatype::VEC_CHAR:
698 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< char > >(
699 std::forward< Args >( args )... );
700 case Datatype::VEC_SHORT:
701 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< short > >(
702 std::forward< Args >( args )... );
703 case Datatype::VEC_INT:
704 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< int > >(
705 std::forward< Args >( args )... );
706 case Datatype::VEC_LONG:
707 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< long > >(
708 std::forward< Args >( args )... );
709 case Datatype::VEC_LONGLONG:
710 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< long long > >(
711 std::forward< Args >( args )... );
712 case Datatype::VEC_UCHAR:
714 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< unsigned char > >(
715 std::forward< Args >( args )... );
716 case Datatype::VEC_USHORT:
718 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< unsigned short > >(
719 std::forward< Args >( args )... );
720 case Datatype::VEC_UINT:
722 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< unsigned int > >(
723 std::forward< Args >( args )... );
724 case Datatype::VEC_ULONG:
726 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< unsigned long > >(
727 std::forward< Args >( args )... );
728 case Datatype::VEC_ULONGLONG:
730 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< unsigned long long > >(
731 std::forward< Args >( args )... );
732 case Datatype::VEC_FLOAT:
733 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< float > >(
734 std::forward< Args >( args )... );
735 case Datatype::VEC_DOUBLE:
736 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< double > >(
737 std::forward< Args >( args )... );
738 case Datatype::VEC_LONG_DOUBLE:
740 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< long double > >(
741 std::forward< Args >( args )... );
742 case Datatype::VEC_CFLOAT:
743 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< std::complex< float > > >(
744 std::forward< Args >( args )... );
745 case Datatype::VEC_CDOUBLE:
746 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< std::complex< double > > >(
747 std::forward< Args >( args )... );
748 case Datatype::VEC_CLONG_DOUBLE:
750 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< std::complex< long double > > >(
751 std::forward< Args >( args )... );
752 case Datatype::VEC_STRING:
754 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< std::string > >(
755 std::forward< Args >( args )... );
756 case Datatype::ARR_DBL_7:
757 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::array< double, 7 > >(
758 std::forward< Args >( args )... );
760 return action.OPENPMD_TEMPLATE_OPERATOR( )<
bool >(
761 std::forward< Args >( args )... );
762 case Datatype::DATATYPE:
763 return action.OPENPMD_TEMPLATE_OPERATOR( )< 1000 >(
764 std::forward< Args >( args )... );
765 case Datatype::UNDEFINED:
766 return action.OPENPMD_TEMPLATE_OPERATOR( )< 0 >(
767 std::forward< Args >( args )... );
769 throw std::runtime_error(
770 "Internal error: Encountered unknown datatype (switchType) ->" +
771 std::to_string( static_cast< int >( dt ) ) );
775 #undef OPENPMD_TEMPLATE_OPERATOR 780 Datatype m_dt = determineDatatype<T>();
788 template<
typename T,
long n>
794 template <
typename T>
811 std::string datatypeToString(
Datatype dt );
813 Datatype stringToDatatype( std::string s );
815 std::string datatypeToString(
Datatype dt );
817 Datatype stringToDatatype( std::string s );
820 warnWrongDtype(std::string
const& key,
829 #if !defined(_MSC_VER) bool isVector(Datatype d)
Compare if a Datatype is a vector type.
Definition: Datatype.hpp:309
std::vector< Datatype > openPMD_Datatypes
All openPMD datatypes defined in Datatype, listed in order in a vector.
Definition: Datatype.cpp:345
bool isSameFloatingPoint(Datatype d)
Compare if a Datatype is equivalent to a floating point type.
Definition: Datatype.hpp:488
bool isSameComplexFloatingPoint(Datatype d)
Compare if a Datatype is equivalent to a complex floating point type.
Definition: Datatype.hpp:514
bool isSameInteger(Datatype d)
Compare if a Datatype is equivalent to an integer type.
Definition: Datatype.hpp:540
std::tuple< bool, bool > isInteger(Datatype d)
Compare if a Datatype is an integer type.
Definition: Datatype.hpp:434
Fundamental equivalence check for two given types T and U.
Definition: Datatype.hpp:96
bool isComplexFloatingPoint(Datatype d)
Compare if a Datatype is a complex floating point type.
Definition: Datatype.hpp:375
Datatype
Concrete datatype of an object available at runtime.
Definition: Datatype.hpp:42
Definition: Container.cpp:51
size_t toBits(Datatype d)
Return number of bits representing a Datatype.
Definition: Datatype.hpp:298
Definition: Datatype.hpp:779
ReturnType switchType(Datatype dt, Action action, Args &&... args)
Generalizes switching over an openPMD datatype.
Definition: Datatype.hpp:642
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:387
size_t toBytes(Datatype d)
Return number of bytes representing a Datatype.
Definition: Datatype.hpp:219
Definition: Datatype.hpp:793
bool isFloatingPoint(Datatype d)
Compare if a Datatype is a floating point type.
Definition: Datatype.hpp:346
bool isSame(openPMD::Datatype const d, openPMD::Datatype const e)
Comparison for two Datatypes.
Definition: Datatype.hpp:568