/*
* The info structures for all the different FFT functions
*/
static struct _pygsl_transform_func_rf_s complex_funcs, halfcomplex_funcs, real_funcs,
complex_float_funcs, halfcomplex_float_funcs, real_float_funcs;
/*
* Describes the type of the transform.
*/
#define _INIT_INFO(mode, datatype, input_array_type, output_array_type, data_offset, radix2, packed) \
{mode, datatype, \
input_array_type, output_array_type, \
data_offset, radix2, packed}
#define INIT_INFO(mode, datatype, inaugment, outaugment, data_offset, radix2, packed) \
_INIT_INFO(mode, MODE_ ## datatype, PyArray_ ## inaugment ## datatype, \
PyArray_ ## outaugment ## datatype, data_offset, radix2, packed)
static struct _pygsl_transform_info_s
complex_info = INIT_INFO(ComplexComplex, DOUBLE, C, C, 0, RADIX_FREE, PACKED_TYPE),
halfcomplex_info = INIT_INFO(HalfComplexReal, DOUBLE, C, , 0, RADIX_FREE, SINGLE_TYPE),
real_info = INIT_INFO(RealHalfcomplex, DOUBLE, , C, 1, RADIX_FREE, PACKED_TYPE),
complex_float_info = INIT_INFO(ComplexComplex, FLOAT, C, C, 0, RADIX_FREE, PACKED_TYPE),
halfcomplex_float_info = INIT_INFO(HalfComplexReal, FLOAT, C, , 0, RADIX_FREE, SINGLE_TYPE),
real_float_info = INIT_INFO(RealHalfcomplex, FLOAT, , C, 1, RADIX_FREE, PACKED_TYPE),
complex_info_radix2 = INIT_INFO(ComplexComplex, DOUBLE, C, C, 0, RADIX_TWO, PACKED_TYPE),
halfcomplex_info_radix2 = INIT_INFO(HalfComplexReal, DOUBLE, , , 0, RADIX_TWO, SINGLE_TYPE),
real_info_radix2 = INIT_INFO(RealHalfcomplex, DOUBLE, , , 0, RADIX_TWO, SINGLE_TYPE),
complex_float_info_radix2 = INIT_INFO(ComplexComplex, FLOAT, C, C, 0, RADIX_TWO, PACKED_TYPE),
halfcomplex_float_info_radix2 = INIT_INFO(HalfComplexReal, FLOAT, , , 0, RADIX_TWO, SINGLE_TYPE),
real_float_info_radix2 = INIT_INFO(RealHalfcomplex, FLOAT, , , 0, RADIX_TWO, SINGLE_TYPE);
#define PyGSL_TRANSFORM(name, mode, transformp, radix2) \
static PyObject * \
PyGSL_transform_ ## name(PyObject *self, PyObject *args)\
{\
PyObject *r; \
struct _pygsl_transform_help_s helps; \
struct _pygsl_transform_help_rf_s s; \
FUNC_MESS_BEGIN(); \
helps.transform.v = (void *) transformp;\
switch(radix2){ \
case RADIX_TWO: helps.info = &mode ## _info_radix2; helps.helpers = NULL; break;\
case RADIX_FREE: helps.info = &mode ## _info; \
helps.helpers = &s; s.func = &mode ## _funcs; \
break;\
}\
r = PyGSL_transform_(self, args, &helps); \
if(r == NULL) PyGSL_add_traceback(module, filename, __FUNCTION__, __LINE__); \
FUNC_MESS_END();\
FUNC_MESS("------------------------------------------------");\
return r;\
}
#define PyGSL_RFREE_DF(name, mode, direction) \
PyGSL_TRANSFORM(name ## direction, mode, (void *) gsl_ ## name ## direction, RADIX_FREE) \
PyGSL_TRANSFORM(name ## direction ## _float, mode ## _float, \
(void *) gsl_ ## name ## float_ ## direction, RADIX_FREE)
#define PyGSL_RTWO_DF(name, mode, direction) \
PyGSL_TRANSFORM(name ## radix2_ ## direction, mode, (void *) gsl_ ## name ## radix2_ ## direction, RADIX_TWO) \
PyGSL_TRANSFORM(name ## radix2_ ## direction ## _float, mode ## _float, \
(void *) gsl_ ## name ## float_radix2_ ## direction, RADIX_TWO)
#define PyGSL_COMPLEX(direction) \
PyGSL_RFREE_DF(fft_complex_, complex, direction)
PyGSL_COMPLEX(forward)
PyGSL_COMPLEX(backward)
PyGSL_COMPLEX(inverse)
#define PyGSL_COMPLEX_RADIX2(direction) \
PyGSL_RTWO_DF(fft_complex_, complex, direction)
PyGSL_COMPLEX_RADIX2(forward)
PyGSL_COMPLEX_RADIX2(backward)
PyGSL_COMPLEX_RADIX2(inverse)
PyGSL_COMPLEX_RADIX2(dif_forward)
PyGSL_COMPLEX_RADIX2(dif_backward)
PyGSL_COMPLEX_RADIX2(dif_inverse)
#define PyGSL_REAL_RADIX2(direction) \
PyGSL_RTWO_DF(fft_real_, real, direction)
PyGSL_REAL_RADIX2(transform)
#define PyGSL_REAL(direction) \
PyGSL_RFREE_DF(fft_real_, real, direction)
PyGSL_REAL(transform)
#define PyGSL_HALFCOMPLEX(direction) \
PyGSL_RFREE_DF(fft_halfcomplex_, halfcomplex, direction)
PyGSL_HALFCOMPLEX(transform)
PyGSL_HALFCOMPLEX(inverse)
#define PyGSL_HALFCOMPLEX_RADIX2(direction) \
PyGSL_RTWO_DF(fft_halfcomplex_, halfcomplex, direction)
PyGSL_HALFCOMPLEX_RADIX2(transform)
PyGSL_HALFCOMPLEX_RADIX2(inverse)
#define PyGSL_TRANSFORM_FD_FUNCTION(name, transform, ddoc) \
{name, PyGSL_transform_ ## transform, METH_VARARGS, (char *) ddoc}, \
{name "_float", PyGSL_transform_ ## transform ## _float, METH_VARARGS, (char *) float_doc},
syntax highlighted by Code2HTML, v. 0.9.1