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
115 #if __cplusplus >= 201402L 123 template<
typename T >
125 #if __cplusplus >= 201402L 145 else if(
decay_equiv<
T, std::complex< float > >::value ){
return DT::CFLOAT; }
146 else if(
decay_equiv<
T, std::complex< double > >::value ){
return DT::CDOUBLE; }
147 else if(
decay_equiv<
T, std::complex< long double > >::value ){
return DT::CLONG_DOUBLE; }
149 else if(
decay_equiv<
T, std::vector< char > >::value ){
return DT::VEC_CHAR; }
150 else if(
decay_equiv<
T, std::vector< short > >::value ){
return DT::VEC_SHORT; }
151 else if(
decay_equiv<
T, std::vector< int > >::value ){
return DT::VEC_INT; }
152 else if(
decay_equiv<
T, std::vector< long > >::value ){
return DT::VEC_LONG; }
153 else if(
decay_equiv<
T, std::vector< long long > >::value ){
return DT::VEC_LONGLONG; }
154 else if(
decay_equiv<
T, std::vector< unsigned char > >::value ){
return DT::VEC_UCHAR; }
155 else if(
decay_equiv<
T, std::vector< unsigned short > >::value ){
return DT::VEC_USHORT; }
156 else if(
decay_equiv<
T, std::vector< unsigned int > >::value ){
return DT::VEC_UINT; }
157 else if(
decay_equiv<
T, std::vector< unsigned long > >::value ){
return DT::VEC_ULONG; }
158 else if(
decay_equiv<
T, std::vector< unsigned long long > >::value ){
return DT::VEC_ULONGLONG; }
159 else if(
decay_equiv<
T, std::vector< float > >::value ){
return DT::VEC_FLOAT; }
160 else if(
decay_equiv<
T, std::vector< double > >::value ){
return DT::VEC_DOUBLE; }
161 else if(
decay_equiv<
T, std::vector< long double > >::value ){
return DT::VEC_LONG_DOUBLE; }
162 else if(
decay_equiv<
T, std::vector< std::complex< float > > >::value ){
return DT::VEC_CFLOAT; }
163 else if(
decay_equiv<
T, std::vector< std::complex< double > > >::value ){
return DT::VEC_CDOUBLE; }
164 else if(
decay_equiv<
T, std::vector< std::complex< long double > > >::value ){
return DT::VEC_CLONG_DOUBLE; }
165 else if(
decay_equiv<
T, std::vector< std::string > >::value ){
return DT::VEC_STRING; }
166 else if(
decay_equiv<
T, std::array< double, 7 > >::value ){
return DT::ARR_DBL_7; }
168 else return Datatype::UNDEFINED;
171 template<
typename T >
173 #if __cplusplus >= 201402L 177 determineDatatype(std::shared_ptr< T >)
193 else if(
decay_equiv<
T, std::complex< float > >::value ){
return DT::CFLOAT; }
194 else if(
decay_equiv<
T, std::complex< double > >::value ){
return DT::CDOUBLE; }
195 else if(
decay_equiv<
T, std::complex< long double > >::value ){
return DT::CLONG_DOUBLE; }
197 else if(
decay_equiv<
T, std::vector< char > >::value ){
return DT::VEC_CHAR; }
198 else if(
decay_equiv<
T, std::vector< short > >::value ){
return DT::VEC_SHORT; }
199 else if(
decay_equiv<
T, std::vector< int > >::value ){
return DT::VEC_INT; }
200 else if(
decay_equiv<
T, std::vector< long > >::value ){
return DT::VEC_LONG; }
201 else if(
decay_equiv<
T, std::vector< long long > >::value ){
return DT::VEC_LONGLONG; }
202 else if(
decay_equiv<
T, std::vector< unsigned char > >::value ){
return DT::VEC_UCHAR; }
203 else if(
decay_equiv<
T, std::vector< unsigned short > >::value ){
return DT::VEC_USHORT; }
204 else if(
decay_equiv<
T, std::vector< unsigned int > >::value ){
return DT::VEC_UINT; }
205 else if(
decay_equiv<
T, std::vector< unsigned long > >::value ){
return DT::VEC_ULONG; }
206 else if(
decay_equiv<
T, std::vector< unsigned long long > >::value ){
return DT::VEC_ULONGLONG; }
207 else if(
decay_equiv<
T, std::vector< float > >::value ){
return DT::VEC_FLOAT; }
208 else if(
decay_equiv<
T, std::vector< double > >::value ){
return DT::VEC_DOUBLE; }
209 else if(
decay_equiv<
T, std::vector< long double > >::value ){
return DT::VEC_LONG_DOUBLE; }
210 else if(
decay_equiv<
T, std::vector< std::complex< float > > >::value ){
return DT::VEC_CFLOAT; }
211 else if(
decay_equiv<
T, std::vector< std::complex< double > > >::value ){
return DT::VEC_CDOUBLE; }
212 else if(
decay_equiv<
T, std::vector< std::complex< long double > > >::value ){
return DT::VEC_CLONG_DOUBLE; }
213 else if(
decay_equiv<
T, std::vector< std::string > >::value ){
return DT::VEC_STRING; }
214 else if(
decay_equiv<
T, std::array< double, 7 > >::value ){
return DT::ARR_DBL_7; }
216 else return DT::UNDEFINED;
237 return sizeof(
unsigned char);
244 return sizeof(short);
252 case DT::VEC_LONGLONG:
253 return sizeof(
long long);
256 return sizeof(
unsigned short);
259 return sizeof(
unsigned int);
262 return sizeof(
unsigned long);
264 case DT::VEC_ULONGLONG:
265 return sizeof(
unsigned long long);
268 return sizeof(float);
272 return sizeof(double);
273 case DT::LONG_DOUBLE:
274 case DT::VEC_LONG_DOUBLE:
275 return sizeof(
long double);
279 return sizeof(float) * 2;
282 case DT::VEC_CDOUBLE:
283 return sizeof(double) * 2;
285 case DT::CLONG_DOUBLE:
286 case DT::VEC_CLONG_DOUBLE:
287 return sizeof(
long double) * 2;
294 throw std::runtime_error(
"toBytes: Invalid datatype!");
306 return toBytes( d ) * CHAR_BIT;
325 case DT::VEC_LONGLONG:
330 case DT::VEC_ULONGLONG:
333 case DT::VEC_LONG_DOUBLE:
335 case DT::VEC_CDOUBLE:
336 case DT::VEC_CLONG_DOUBLE:
362 case DT::LONG_DOUBLE:
363 case DT::VEC_LONG_DOUBLE:
390 case DT::VEC_CDOUBLE:
391 case DT::CLONG_DOUBLE:
392 case DT::VEC_CLONG_DOUBLE:
406 template<
typename T >
410 Datatype dtype = determineDatatype< T >();
422 template<
typename T >
426 Datatype dtype = determineDatatype< T >();
439 inline std::tuple< bool, bool >
453 case DT::VEC_LONGLONG:
454 return std::make_tuple(
true,
true );
462 case DT::VEC_ULONGLONG:
463 return std::make_tuple(
true,
false );
465 return std::make_tuple(
false,
false );
477 template<
typename T >
478 inline std::tuple< bool, bool >
481 Datatype dtype = determineDatatype< T >();
492 template<
typename T_FP >
497 bool tt_is_fp = isFloatingPoint< T_FP >();
518 template<
typename T_CFP >
523 bool tt_is_cfp = isComplexFloatingPoint< T_CFP >();
544 template<
typename T_Int >
549 bool tt_is_int, tt_is_sig;
550 std::tie(tt_is_int, tt_is_sig) = isInteger< T_Int >();
553 bool dt_is_int, dt_is_sig;
554 std::tie(dt_is_int, dt_is_sig) =
isInteger( d );
559 tt_is_sig == dt_is_sig &&
577 if( static_cast<int>(d) == static_cast<int>(e) )
584 bool d_is_int, d_is_sig;
585 std::tie(d_is_int, d_is_sig) =
isInteger( d );
586 bool e_is_int, e_is_sig;
587 std::tie(e_is_int, e_is_sig) =
isInteger( e );
591 d_is_vec == e_is_vec &&
592 d_is_sig == e_is_sig &&
604 d_is_vec == e_is_vec &&
616 d_is_vec == e_is_vec &&
624 #if defined(_MSC_VER) && !defined(__INTEL_COMPILER) 625 #define OPENPMD_TEMPLATE_OPERATOR operator 627 #define OPENPMD_TEMPLATE_OPERATOR template operator 647 template <
typename ReturnType = void,
typename Action,
typename... Args >
653 return action.OPENPMD_TEMPLATE_OPERATOR( )<
char >(
654 std::forward< Args >( args )... );
655 case Datatype::UCHAR:
656 return action.OPENPMD_TEMPLATE_OPERATOR( )<
unsigned char >(
657 std::forward< Args >( args )... );
658 case Datatype::SHORT:
659 return action.OPENPMD_TEMPLATE_OPERATOR( )<
short >(
660 std::forward< Args >( args )... );
662 return action.OPENPMD_TEMPLATE_OPERATOR( )<
int >(
663 std::forward< Args >( args )... );
665 return action.OPENPMD_TEMPLATE_OPERATOR( )<
long >(
666 std::forward< Args >( args )... );
667 case Datatype::LONGLONG:
668 return action.OPENPMD_TEMPLATE_OPERATOR( )<
long long >(
669 std::forward< Args >( args )... );
670 case Datatype::USHORT:
671 return action.OPENPMD_TEMPLATE_OPERATOR( )<
unsigned short >(
672 std::forward< Args >( args )... );
674 return action.OPENPMD_TEMPLATE_OPERATOR( )<
unsigned int >(
675 std::forward< Args >( args )... );
676 case Datatype::ULONG:
677 return action.OPENPMD_TEMPLATE_OPERATOR( )<
unsigned long >(
678 std::forward< Args >( args )... );
679 case Datatype::ULONGLONG:
680 return action.OPENPMD_TEMPLATE_OPERATOR( )<
unsigned long long >(
681 std::forward< Args >( args )... );
682 case Datatype::FLOAT:
683 return action.OPENPMD_TEMPLATE_OPERATOR( )<
float >(
684 std::forward< Args >( args )... );
685 case Datatype::DOUBLE:
686 return action.OPENPMD_TEMPLATE_OPERATOR( )<
double >(
687 std::forward< Args >( args )... );
688 case Datatype::LONG_DOUBLE:
689 return action.OPENPMD_TEMPLATE_OPERATOR( )<
long double >(
690 std::forward< Args >( args )... );
691 case Datatype::CFLOAT:
692 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::complex< float > >(
693 std::forward< Args >( args )... );
694 case Datatype::CDOUBLE:
695 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::complex< double > >(
696 std::forward< Args >( args )... );
697 case Datatype::CLONG_DOUBLE:
698 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::complex< long double > >(
699 std::forward< Args >( args )... );
700 case Datatype::STRING:
701 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::string >(
702 std::forward< Args >( args )... );
703 case Datatype::VEC_CHAR:
704 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< char > >(
705 std::forward< Args >( args )... );
706 case Datatype::VEC_SHORT:
707 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< short > >(
708 std::forward< Args >( args )... );
709 case Datatype::VEC_INT:
710 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< int > >(
711 std::forward< Args >( args )... );
712 case Datatype::VEC_LONG:
713 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< long > >(
714 std::forward< Args >( args )... );
715 case Datatype::VEC_LONGLONG:
716 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< long long > >(
717 std::forward< Args >( args )... );
718 case Datatype::VEC_UCHAR:
720 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< unsigned char > >(
721 std::forward< Args >( args )... );
722 case Datatype::VEC_USHORT:
724 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< unsigned short > >(
725 std::forward< Args >( args )... );
726 case Datatype::VEC_UINT:
728 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< unsigned int > >(
729 std::forward< Args >( args )... );
730 case Datatype::VEC_ULONG:
732 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< unsigned long > >(
733 std::forward< Args >( args )... );
734 case Datatype::VEC_ULONGLONG:
736 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< unsigned long long > >(
737 std::forward< Args >( args )... );
738 case Datatype::VEC_FLOAT:
739 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< float > >(
740 std::forward< Args >( args )... );
741 case Datatype::VEC_DOUBLE:
742 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< double > >(
743 std::forward< Args >( args )... );
744 case Datatype::VEC_LONG_DOUBLE:
746 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< long double > >(
747 std::forward< Args >( args )... );
748 case Datatype::VEC_CFLOAT:
749 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< std::complex< float > > >(
750 std::forward< Args >( args )... );
751 case Datatype::VEC_CDOUBLE:
752 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::vector< std::complex< double > > >(
753 std::forward< Args >( args )... );
754 case Datatype::VEC_CLONG_DOUBLE:
756 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< std::complex< long double > > >(
757 std::forward< Args >( args )... );
758 case Datatype::VEC_STRING:
760 .OPENPMD_TEMPLATE_OPERATOR( )< std::vector< std::string > >(
761 std::forward< Args >( args )... );
762 case Datatype::ARR_DBL_7:
763 return action.OPENPMD_TEMPLATE_OPERATOR( )< std::array< double, 7 > >(
764 std::forward< Args >( args )... );
766 return action.OPENPMD_TEMPLATE_OPERATOR( )<
bool >(
767 std::forward< Args >( args )... );
768 case Datatype::DATATYPE:
769 return action.OPENPMD_TEMPLATE_OPERATOR( )< 1000 >(
770 std::forward< Args >( args )... );
771 case Datatype::UNDEFINED:
772 return action.OPENPMD_TEMPLATE_OPERATOR( )< 0 >(
773 std::forward< Args >( args )... );
775 throw std::runtime_error(
776 "Internal error: Encountered unknown datatype (switchType) ->" +
777 std::to_string( static_cast< int >( dt ) ) );
781 #undef OPENPMD_TEMPLATE_OPERATOR 786 Datatype m_dt = determineDatatype<T>();
794 template<
typename T,
long n>
800 template <
typename T>
817 std::string datatypeToString(
Datatype dt );
819 Datatype stringToDatatype( std::string s );
821 std::string datatypeToString(
Datatype dt );
823 Datatype stringToDatatype( std::string s );
826 warnWrongDtype(std::string
const& key,
835 #if !defined(_MSC_VER) bool isVector(Datatype d)
Compare if a Datatype is a vector type.
Definition: Datatype.hpp:315
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:494
bool isSameComplexFloatingPoint(Datatype d)
Compare if a Datatype is equivalent to a complex floating point type.
Definition: Datatype.hpp:520
bool isSameInteger(Datatype d)
Compare if a Datatype is equivalent to an integer type.
Definition: Datatype.hpp:546
std::tuple< bool, bool > isInteger(Datatype d)
Compare if a Datatype is an integer type.
Definition: Datatype.hpp:440
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:381
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:304
Definition: Datatype.hpp:785
ReturnType switchType(Datatype dt, Action action, Args &&... args)
Generalizes switching over an openPMD datatype.
Definition: Datatype.hpp:648
Public definitions of openPMD-api.
Definition: Date.cpp:28
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:225
Definition: Datatype.hpp:799
bool isFloatingPoint(Datatype d)
Compare if a Datatype is a floating point type.
Definition: Datatype.hpp:352
bool isSame(openPMD::Datatype const d, openPMD::Datatype const e)
Comparison for two Datatypes.
Definition: Datatype.hpp:574