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 >
132 else if( decay_equiv< T, unsigned char >::value ){
return DT::UCHAR; }
133 else if( decay_equiv< T, short >::value ){
return DT::SHORT; }
134 else if( decay_equiv< T, int >::value ){
return DT::INT; }
135 else if( decay_equiv< T, long >::value ){
return DT::LONG; }
136 else if( decay_equiv< T, long long >::value ){
return DT::LONGLONG; }
137 else if( decay_equiv< T, unsigned short >::value ){
return DT::USHORT; }
138 else if( decay_equiv< T, unsigned int >::value ){
return DT::UINT; }
139 else if( decay_equiv< T, unsigned long >::value ){
return DT::ULONG; }
140 else if( decay_equiv< T, unsigned long long >::value ){
return DT::ULONGLONG; }
141 else if( decay_equiv< T, float >::value ){
return DT::FLOAT; }
142 else if( decay_equiv< T, double >::value ){
return DT::DOUBLE; }
143 else if( decay_equiv< T, long double >::value ){
return DT::LONG_DOUBLE; }
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; }
147 else if( decay_equiv< T, std::string >::value ){
return DT::STRING; }
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; }
166 else if( decay_equiv< T, bool >::value ){
return DT::BOOL; }
167 else return Datatype::UNDEFINED;
170 template<
typename T >
174 determineDatatype(std::shared_ptr< T >)
177 if( decay_equiv< T, char >::value ){
return DT::CHAR; }
178 else if( decay_equiv< T, unsigned char >::value ){
return DT::UCHAR; }
179 else if( decay_equiv< T, short >::value ){
return DT::SHORT; }
180 else if( decay_equiv< T, int >::value ){
return DT::INT; }
181 else if( decay_equiv< T, long >::value ){
return DT::LONG; }
182 else if( decay_equiv< T, long long >::value ){
return DT::LONGLONG; }
183 else if( decay_equiv< T, unsigned short >::value ){
return DT::USHORT; }
184 else if( decay_equiv< T, unsigned int >::value ){
return DT::UINT; }
185 else if( decay_equiv< T, unsigned long >::value ){
return DT::ULONG; }
186 else if( decay_equiv< T, unsigned long long >::value ){
return DT::ULONGLONG; }
187 else if( decay_equiv< T, float >::value ){
return DT::FLOAT; }
188 else if( decay_equiv< T, double >::value ){
return DT::DOUBLE; }
189 else if( decay_equiv< T, long double >::value ){
return DT::LONG_DOUBLE; }
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; }
193 else if( decay_equiv< T, std::string >::value ){
return DT::STRING; }
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; }
212 else if( decay_equiv< T, bool >::value ){
return DT::BOOL; }
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)