22#include "quest/include/modes.h"
23#include "quest/include/precision.h"
45 typedef std::complex<FLOAT_TYPE> qcomp;
56 #if (FLOAT_PRECISION == 1)
57 typedef _Fcomplex qcomp;
59 #elif (FLOAT_PRECISION == 2)
60 typedef _Dcomplex qcomp;
62 #elif (FLOAT_PRECISION == 4)
63 typedef _Lcomplex qcomp;
91static inline qcomp
getQcomp(qreal re, qreal im) {
93 #if defined(__cplusplus)
96 #elif defined(_MSC_VER)
97 return (qcomp) {re, im};
119 using namespace std::complex_literals;
127 static inline qcomp
operator ""_i(
long double y) {
128 return qcomp(0,
static_cast<qreal
>(y));
131 static inline qcomp
operator ""_i(
unsigned long long int y) {
132 return qcomp(0,
static_cast<qreal
>(y));
165 #ifndef DEFINE_ARITHMETIC_OVERLOADS
166 #define DEFINE_ARITHMETIC_OVERLOADS 1
179 #if DEFINE_ARITHMETIC_OVERLOADS
184 #define COMP_TO_QCOMP(a) \
186 static_cast<qreal>(std::real(a)), \
187 static_cast<qreal>(std::imag(a)))
189 #define REAL_TO_QCOMP(b) \
190 qcomp(static_cast<qreal>(b), 0)
193 #define DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_REAL(op, compprec, realtype) \
194 static inline qcomp operator op (const std::complex<compprec>& a, const realtype& b) { \
200 static inline qcomp operator op (const realtype& b, const std::complex<compprec>& a) { \
206 static inline std::complex<compprec>& operator op##= (std::complex<compprec>& a, const realtype& b) { \
212 #define DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(compprec, realtype) \
213 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_REAL(+, compprec, realtype) \
214 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_REAL(-, compprec, realtype) \
215 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_REAL(*, compprec, realtype) \
216 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_REAL(/, compprec, realtype)
219 #define DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_INTEGER(compprec) \
220 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(compprec, int) \
221 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(compprec, long int) \
222 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(compprec, long long int) \
223 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(compprec, unsigned) \
224 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(compprec, long unsigned) \
225 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(compprec, long long unsigned)
228 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_INTEGER(
float)
229 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_INTEGER(
double)
230 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_INTEGER(
long double)
233 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(
float,
double)
234 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(
float,
long double)
235 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(
double,
long double)
236 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(
double,
float)
237 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(
long double,
float)
238 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL(
long double,
double)
241 #define DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_COMPLEX(op, precA, precB) \
242 static inline qcomp operator op (const std::complex<precA>& a, const std::complex<precB>& b) { \
250 #define DEFINE_SINGLE_DIRECTION_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX(precA, precB) \
251 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_COMPLEX(+, precA, precB) \
252 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_COMPLEX(-, precA, precB) \
253 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_COMPLEX(*, precA, precB) \
254 DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_COMPLEX(/, precA, precB)
256 #define DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX(precA, precB) \
257 DEFINE_SINGLE_DIRECTION_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX(precA, precB) \
258 DEFINE_SINGLE_DIRECTION_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX(precB, precA)
261 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX(
float,
double)
262 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX(
float,
long double)
263 DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX(
double,
long double)
268 #undef DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_REAL
269 #undef DEFINE_OPERATOR_BETWEEN_COMPLEX_AND_COMPLEX
270 #undef DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_REAL
271 #undef DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_INTEGER
272 #undef DEFINE_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX
273 #undef DEFINE_SINGLE_DIRECTION_ARITHMETIC_BETWEEN_COMPLEX_AND_COMPLEX
299 extern "C" void reportStr(
const char* str);
310 extern "C" void reportScalar(
const char* label, qcomp num);
342 void _reportScalar_real(
const char* label, qreal num);
347 #define reportScalar(label, num) \
349 qcomp : reportScalar, \
350 qreal : _reportScalar_real, \
351 default : _reportScalar_real \
const int DEFINE_ARITHMETIC_OVERLOADS
void reportStr(const char *str)
static qcomp getQcomp(qreal re, qreal im)
void reportScalar(const char *label, qcomp num)