00001
00035 #if !defined(INC_OSKI_MANGLE_H)
00036
00037 #define INC_OSKI_MANGLE_H
00038
00039
00040
00041
00042
00043 #if !defined(IND_TAG_CHAR)
00044 #error "ERROR: Must instantiate scalar integer index type."
00045 #endif
00046
00047 #if !defined(VAL_TAG_CHAR)
00048 #error "ERROR: Must instantiate scalar non-zero value types."
00049 #endif
00050
00051
00052
00053
00054 #if IND_TAG_CHAR == 'i'
00055
00056
00057 # undef IND_T
00058 # define IND_T int
00059 # undef IND_TAG
00060 # define IND_TAG i
00061 # undef IND_TAG_CAPS
00062 # define IND_TAG_CAPS I
00063 # undef IND_TYPE_ID
00064 # define IND_TYPE_ID INT
00065
00066 #elif IND_TAG_CHAR == 'l'
00067
00068
00069 # undef IND_T
00070 # define IND_T long
00071 # undef IND_TAG
00072 # define IND_TAG l
00073 # undef IND_TAG_CAPS
00074 # define IND_TAG_CAPS L
00075 # undef IND_TYPE_ID
00076 # define IND_TYPE_ID LONG
00077
00078 #elif !defined(IND_T) || !defined(IND_TAG) || !defined(IND_TAG_CAPS) || !defined(IND_TYPE_ID)
00079 #error "Integer index type specification is incomplete: must define IND_T, IND_TAG, IND_TAG_CAPS, and IND_TYPE_ID"
00080 #endif
00081
00082 #if VAL_TAG_CHAR == 's'
00083
00084
00085 # undef VAL_T
00086 # define VAL_T float
00087 # undef VAL_TAG
00088 # define VAL_TAG s
00089 # undef VAL_TAG_CAPS
00090 # define VAL_TAG_CAPS S
00091 # undef VAL_TYPE_ID
00092 # define VAL_TYPE_ID SINGLE
00093
00094 #elif VAL_TAG_CHAR == 'd'
00095
00096
00097 # undef VAL_T
00098 # define VAL_T double
00099 # undef VAL_TAG
00100 # define VAL_TAG d
00101 # undef VAL_TAG_CAPS
00102 # define VAL_TAG_CAPS D
00103 # undef VAL_TYPE_ID
00104 # define VAL_TYPE_ID DOUBLE
00105
00106 #elif VAL_TAG_CHAR == 'c'
00107
00108
00109 # undef VAL_T
00110 # define VAL_T complex_t
00111 # undef VAL_TAG
00112 # define VAL_TAG c
00113 # undef VAL_TAG_CAPS
00114 # define VAL_TAG_CAPS C
00115 # undef VAL_TYPE_ID
00116 # define VAL_TYPE_ID COMPLEX
00117
00118 #elif VAL_TAG_CHAR == 'z'
00119
00120
00121 # undef VAL_T
00122 # define VAL_T doublecomplex_t
00123 # undef VAL_TAG
00124 # define VAL_TAG z
00125 # undef VAL_TAG_CAPS
00126 # define VAL_TAG_CAPS Z
00127 # undef VAL_TYPE_ID
00128 # define VAL_TYPE_ID DOUBLECOMPLEX
00129
00130 #elif !defined(VAL_T) || !defined(VAL_TAG) || !defined(VAL_TAG_CAPS) || !defined(VAL_TYPE_ID)
00131 # error "Non-zero value type specification is incomplete: must define VAL_T, VAL_TAG, VAL_TAG_CAPS, and VAL_TYPE_ID"
00132 #endif
00133
00134
00135
00142 #define IS_VAL_COMPLEX ((VAL_TAG_CHAR=='c') || (VAL_TAG_CHAR=='z'))
00143
00147 #define IS_VALPREC_SINGLE ((VAL_TAG_CHAR=='s') || (VAL_TAG_CHAR=='c'))
00148
00152 #define IS_VALPREC_DOUBLE ((VAL_TAG_CHAR=='d') || (VAL_TAG_CHAR=='z'))
00153
00154 #if IS_VALPREC_DOUBLE
00155 # if HAVE_EPS_DOUBLE
00156 # include <float.h>
00157 # define VAL_EPS DBL_EPSILON
00158 # else
00159 # define VAL_EPS 1e-15
00160 # endif
00161 #elif IS_VALPREC_SINGLE
00162 # if HAVE_EPS_FLOAT
00163 # include <float.h>
00164 # define VAL_EPS FLT_EPSILON
00165 # else
00166 # define VAL_EPS 1e-7
00167 # endif
00168 #else
00169 # warning "WARNING: Not sure how to define machine epsilon..."
00170 # define VAL_EPS 1e-7
00171 #endif
00172
00173 #define VAL_ZERO (0.0)
00174 #define VAL_ONE (1.0)
00175 #define VAL_NEG_ONE (-1.0)
00177 #include <math.h>
00178
00179 # if HAVE_C99_FPCLASSIFY
00180
00181 # define IS_REAL_ZERO(x) (fpclassify(x) == FP_ZERO)
00182 # else
00183
00184 # define IS_REAL_ZERO(x) ((x) == VAL_ZERO)
00185 # endif
00186
00187 #if !(IS_VAL_COMPLEX)
00188
00189 # if HAVE_C99_FPCLASSIFY
00190
00191 # define IS_VAL_ZERO(x) (fpclassify(x) == FP_ZERO)
00192
00193 # define IS_VAL_ONE(x) (fpclassify((x)-1.0) == FP_ZERO)
00194
00195 # define IS_VAL_NEG_ONE(x) (fpclassify((x)+1.0) == FP_ZERO)
00196 # else
00197
00198 # define IS_VAL_ZERO(x) ((x) == VAL_ZERO)
00199
00200 # define IS_VAL_ONE(x) ((x) == VAL_ONE)
00201
00202 # define IS_VAL_NEG_ONE(x) ((x) == VAL_NEG_ONE)
00203 # endif
00204
00206 # define VAL_ABS(x) fabs(x)
00207
00209 # define VAL_SET_ZERO(x) (x) = 0.0
00210
00212 # define VAL_SET_ONE(x) (x) = 1.0
00213
00215 # define VAL_CONJ(x)
00216
00218 # define VAL_ASSIGN(y, x) (y) = (x)
00219
00221 # define VAL_ASSIGN_CONJ(y, x) VAL_ASSIGN(y, x)
00222
00224 # define VAL_ASSIGN_NEG(y, x) (y) = -(x)
00225
00227 # define VAL_ASSIGN_NEG_CONJ(y, x) VAL_ASSIGN_NEG(y, x)
00228
00230 # define MAKE_VAL_COMPLEX(x, y) (x)
00231
00236 # define VAL_SCALE(x, alpha) (x) *= (alpha)
00237
00242 # define VAL_SCALE_CONJ(x, alpha) VAL_SCALE(x, alpha)
00243
00248 # define VAL_MAC(y, alpha, x) (y) += (alpha) * (x)
00249
00254 # define VAL_MAC_CONJ(y, alpha, x) VAL_MAC(y, alpha, x)
00255
00260 # define VAL_MSUB(y, alpha, x) (y) -= (alpha) * (x)
00261
00266 # define VAL_MSUB_CONJ(y, alpha, x) VAL_MSUB(y, alpha, x)
00267
00272 # define VAL_DEC(x, a) (x) -= (a)
00273
00278 # define VAL_DEC_CONJ(x, a) VAL_DEC(x, a)
00279
00284 # define VAL_INC(x, a) (x) += (a)
00285
00290 # define VAL_INC_CONJ(x, a) VAL_INC(x, a)
00291
00296 # define VAL_MUL(z, x, y) (z) = (x) * (y)
00297
00302 # define VAL_MUL_CONJ(z, x, y) VAL_MUL(z, x, y)
00303
00308 # define VAL_TRIAD(z, y, alpha, x) (z) = (y) + (alpha) * (x)
00309
00314 # define VAL_TRIAD_CONJ(z, y, alpha, x) VAL_TRIAD(z, y, alpha, x)
00315
00320 # define VAL_DIVEQ(x, a) (x) /= (a)
00321
00326 # define VAL_DIVEQ_CONJ(x, a) VAL_DIVEQ(x, a)
00327
00332 # define VAL_INV(y, x) (y) = 1.0/(x)
00333
00334 #else
00335
00336 # if HAVE_C99_FPCLASSIFY
00337
00338 # define IS_VAL_ZERO(x) \
00339 (fpclassify(_RE(x)) == FP_ZERO && fpclassify(_IM(x)) == FP_ZERO)
00340
00341 # define IS_VAL_ONE(x) \
00342 (fpclassify(_RE(x)-1.0) == FP_ZERO && fpclassify(_IM(x)) == FP_ZERO)
00343
00344 # define IS_VAL_NEG_ONE(x) \
00345 (fpclassify(_RE(x)+1.0) == FP_ZERO && fpclassify(_IM(x)) == FP_ZERO)
00346 # else
00347
00348 # define IS_VAL_ZERO(x) \
00349 ((_RE(x) == VAL_ZERO) && (_IM(x) == VAL_ZERO))
00350
00351 # define IS_VAL_ONE(x) \
00352 ((_RE(x) == VAL_ONE) && (_IM(x) == VAL_ZERO))
00353
00354 # define IS_VAL_NEG_ONE(x) \
00355 ((_RE(x) == VAL_NEG_ONE) && (_IM(x) == VAL_ZERO))
00356 # endif
00357
00359 # define VAL_ABS(x) sqrt(_RE(x)*_RE(x)+_IM(x)*_IM(x))
00360
00362 # define VAL_ASSIGN(y, x) _RE(y) = _RE(x), _IM(y) = _IM(x)
00363
00365 # define VAL_ASSIGN_CONJ(y, x) _RE(y) = _RE(x), _IM(y) = -_IM(x)
00366
00368 # define VAL_ASSIGN_NEG(y, x) _RE(y) = -_RE(x), _IM(y) = -_IM(x)
00369
00371 # define VAL_ASSIGN_NEG_CONJ(y, x) _RE(y) = -_RE(x), _IM(y) = _IM(x)
00372
00374 # define VAL_SET_ZERO(x) _RE(x) = 0.0, _IM(x) = 0.0
00375
00377 # define VAL_SET_ONE(x) _RE(x) = 1.0, _IM(x) = 0.0
00378
00380 # define VAL_CONJ(x) _IM(x) = -_IM(x)
00381
00383 # define MAKE_VAL_COMPLEX(x, y) {(x), (y)}
00384
00386 # define VAL_MUL_RE(x, a) (_RE(x)*_RE(a) - _IM(x)*_IM(a))
00387
00389 # define VAL_MUL_CONJ_RE(x, a) (_RE(x)*_RE(a) + _IM(x)*_IM(a))
00390
00392 # define VAL_MUL_IM(x, a) (_RE(x)*_IM(a) + _IM(x)*_RE(a))
00393
00395 # define VAL_MUL_CONJ_IM(x, a) (_RE(x)*_IM(a) - _IM(x)*_RE(a))
00396
00401 # define VAL_MUL(z, x, y) \
00402 _RE(z) = VAL_MUL_RE(x, y), _IM(z) = VAL_MUL_IM(x, y)
00403
00408 # define VAL_MUL_CONJ(z, x, y) \
00409 _RE(z) = VAL_MUL_CONJ_RE(x, y), _IM(z) = VAL_MUL_CONJ_IM(x, y)
00410
00415 # define VAL_SCALE(x, a) { \
00416 oski_value_t y = x; \
00417 _RE(x) = VAL_MUL_RE(y, a); \
00418 _IM(x) = VAL_MUL_IM(y, a); \
00419 }
00420
00425 # define VAL_SCALE_CONJ(x, a) { \
00426 oski_value_t y = x; \
00427 _RE(x) = VAL_MUL_CONJ_RE(a, y); \
00428 _IM(x) = VAL_MUL_CONJ_IM(a, y); \
00429 }
00430
00435 # define VAL_INC(x, a) _RE(x) += _RE(a), _IM(x) += _IM(a)
00436
00441 # define VAL_INC_CONJ(x, a) _RE(x) += _RE(a), _IM(x) -= _IM(a)
00442
00447 # define VAL_DEC(x, a) _RE(x) -= _RE(a), _IM(x) -= _IM(a)
00448
00453 # define VAL_DEC_CONJ(x, a) _RE(x) -= _RE(a), _IM(x) += _IM(a)
00454
00459 # define VAL_MAC(y, alpha, x) \
00460 _RE(y) += VAL_MUL_RE(alpha, x), _IM(y) += VAL_MUL_IM(alpha, x)
00461
00466 # define VAL_MAC_CONJ(y, alpha, x) \
00467 _RE(y) += VAL_MUL_CONJ_RE(alpha, x), _IM(y) += VAL_MUL_CONJ_IM(alpha, x)
00468
00473 # define VAL_MSUB(y, alpha, x) \
00474 _RE(y) -= VAL_MUL_RE(alpha, x), \
00475 _IM(y) -= VAL_MUL_IM(alpha, x)
00476
00481 # define VAL_MSUB_CONJ(y, alpha, x) \
00482 _RE(y) -= VAL_MUL_CONJ_RE(alpha, x), \
00483 _IM(y) -= VAL_MUL_CONJ_IM(alpha, x)
00484
00489 # define VAL_TRIAD(z, y, alpha, x) \
00490 _RE(z) = _RE(y), _IM(z) = _IM(y), VAL_MAC(z, alpha, x)
00491
00496 # define VAL_TRIAD_CONJ(z, y, alpha, x) \
00497 _RE(z) = _RE(y), _IM(z) = _IM(y), VAL_MAC_CONJ(z, alpha, x)
00498
00507 # define VAL_DIVEQ(x, a) { \
00508 oski_value_t t = (x); \
00509 _RE(x) = _RE(t)*_RE(a) + _IM(t)*_IM(a); \
00510 _IM(x) = _IM(t)*_RE(a) - _RE(t)*_IM(a); \
00511 _RE(x) /= _RE(a)*_RE(a) + _IM(a)*_IM(a); \
00512 _IM(x) /= _RE(a)*_RE(a) + _IM(a)*_IM(a); \
00513 }
00514
00523 # define VAL_DIVEQ_CONJ(x, a) { \
00524 oski_value_t t = (x); \
00525 _RE(x) = _RE(t)*_RE(a) - _IM(t)*_IM(a); \
00526 _IM(x) = _IM(t)*_RE(a) + _RE(t)*_IM(a); \
00527 _RE(x) /= _RE(a)*_RE(a) + _IM(a)*_IM(a); \
00528 _IM(x) /= _RE(a)*_RE(a) + _IM(a)*_IM(a); \
00529 }
00530
00535 # define VAL_INV(y, x) \
00536 _RE(y) = _RE(x) / (_RE(x)*_RE(x) + _IM(x)*_IM(x)), \
00537 _IM(y) = -_IM(x) / (_RE(x)*_RE(x) + _IM(x)*_IM(x))
00538
00539 #endif
00540
00542 #define MAKE_VAL_REAL(x) MAKE_VAL_COMPLEX((x), VAL_ZERO)
00543
00549 #define MAKE_VAL_GENERAL MAKE_VAL_COMPLEX(-9, -9)
00550
00555 #define CATEGORIZE_VAL(alpha) ( \
00556 (IS_VAL_ONE(alpha) || IS_VAL_ZERO(alpha) || IS_VAL_NEG_ONE(alpha)) \
00557 ? (alpha) : MAKE_VAL_GENERAL \
00558 )
00559
00560 #if !defined(MOD_NAME) && defined(OSKI_BUILD_TIME)
00561 #pragma WARNING "Should instantiate a module name explicitly."
00562
00569 #define MOD_NAME self
00570 #endif
00571
00572
00588 #define MAKETYPENAME0(base, ind, val) base ## _T ## ind ## val
00589
00601 #define MAKETYPENAME1(base, ind, val) MAKETYPENAME0(base, ind, val)
00602
00615 #define MAKEMODNAME0(mod, base, ind, val) \
00616 mod ## _T ## ind ## val ## _LTX_ ## base
00617
00627 #define MAKEMODNAME1(mod, base, ind, val) MAKEMODNAME0(mod, base, ind, val)
00628
00647 #define MANGLE_(base) MAKETYPENAME1(base, IND_TAG, VAL_TAG)
00648
00659 #define MANGLE_MOD_(base) MAKEMODNAME1(MOD_NAME, base, IND_TAG, VAL_TAG)
00660
00666 #define MANGLE_CONCAT0(a, b) a ## b
00667
00675 #define MANGLE_CONCAT(a, b) MANGLE_CONCAT0(a, b)
00676
00678 #define OSKI_IND_ID MANGLE_CONCAT(OSKI_SCALIND_, IND_TYPE_ID)
00679
00681 #define OSKI_VAL_ID MANGLE_CONCAT(OSKI_SCALVAL_, VAL_TYPE_ID)
00682
00688 #define OSKI_MAKENAME_FUNCPT(name) oski_ ## name ## _funcpt
00689
00690 #if 0
00691 #if defined(DO_NAME_MANGLING)
00692 #define oski_index_t MANGLE_(oski_index_t)
00693 #define oski_value_t MANGLE_(oski_value_t)
00694 #endif
00695 #endif
00696 #define oski_index_t IND_T
00697 #define oski_value_t VAL_T
00698
00704 #if 0
00705 typedef IND_T oski_index_t;
00706 typedef VAL_T oski_value_t;
00707 #endif
00708
00712 #define TVAL_ZERO MANGLE_(TVAL_ZERO)
00713 #define TVAL_ONE MANGLE_(TVAL_ONE)
00714 #define TVAL_NEG_ONE MANGLE_(TVAL_NEG_ONE)
00715 #define TVAL_IMAG MANGLE_(TVAL_IMAG)
00716 #define TVAL_NEG_IMAG MANGLE_(TVAL_NEG_IMAG)
00717
00718 extern const oski_value_t TVAL_ZERO;
00719 extern const oski_value_t TVAL_ONE;
00720 extern const oski_value_t TVAL_NEG_ONE;
00721 extern const oski_value_t TVAL_IMAG;
00722 extern const oski_value_t TVAL_NEG_IMAG;
00725 #endif
00726
00727 #if defined(OSKI_UNBIND)
00728 # undef INC_OSKI_MANGLE_H
00729 # undef IS_VAL_COMPLEX
00730 # undef IS_VALPREC_SINGLE
00731 # undef IS_VALPREC_DOUBLE
00732 # undef VAL_EPS
00733 # undef VAL_ZERO
00734 # undef VAL_ONE
00735 # undef VAL_NEG_ONE
00736 # undef IS_VAL_ZERO
00737 # undef IS_VAL_ONE
00738 # undef IS_VAL_NEG_ONE
00739 # undef IS_REAL_ZERO
00740 # undef VAL_ABS
00741 # undef VAL_SET_ZERO
00742 # undef VAL_SET_ONE
00743 # undef VAL_CONJ
00744 # undef VAL_ASSIGN
00745 # undef VAL_ASSIGN_CONJ
00746 # undef VAL_ASSIGN_NEG
00747 # undef VAL_ASSIGN_NEG_CONJ
00748 # undef MAKE_VAL_COMPLEX
00749 # undef VAL_SCALE
00750 # undef VAL_SCALE_CONJ
00751 # undef VAL_MAC
00752 # undef VAL_MAC_CONJ
00753 # undef VAL_MSUB
00754 # undef VAL_MSUB_CONJ
00755 # undef VAL_DEC
00756 # undef VAL_DEC_CONJ
00757 # undef VAL_INC
00758 # undef VAL_INC_CONJ
00759 # undef VAL_MUL
00760 # undef VAL_MUL_CONJ
00761 # undef VAL_TRIAD
00762 # undef VAL_TRIAD_CONJ
00763 # undef VAL_DIVEQ
00764 # undef VAL_DIVEQ_CONJ
00765 # undef VAL_INV
00766 # undef MAKE_VAL_REAL
00767 # undef MAKE_VAL_GENERAL
00768 # undef CATEGORIZE_VAL
00769 # undef MAKETYPENAME0
00770 # undef MAKETYPENAME1
00771 # undef MAKEMODNAME0
00772 # undef MAKEMODNAME1
00773 # undef MANGLE_
00774 # undef MANGLE_MOD_
00775 # undef MANGLE_CONCAT0
00776 # undef MANGLE_CONCAT
00777 # undef OSKI_IND_ID
00778 # undef OSKI_VAL_ID
00779 # undef OSKI_MAKENAME_FUNCPT
00780 # undef TVAL_ZERO
00781 # undef TVAL_ONE
00782 # undef TVAL_NEG_ONE
00783 # undef TVAL_IMAG
00784 # undef TVAL_NEG_IMAG
00785 #endif
00786
00787