diff --git a/include/morse_types.h b/include/morse_types.h index 80449afe3c8e512c37c3ef3514832b4784a1910d..e072302dfa93c0347550fddbae72be01e4bded1e 100644 --- a/include/morse_types.h +++ b/include/morse_types.h @@ -54,7 +54,9 @@ typedef long MORSE_size; /** **************************************************************************** * MORSE Complex numbers **/ + #define MORSE_HAS_COMPLEX_H 1 + #if defined(_WIN32) # include <float.h> # if defined(__INTEL_COMPILER) @@ -64,32 +66,53 @@ typedef long MORSE_size; #include <math.h> #undef _Complex #undef complex - typedef float _Complex MORSE_Complex32_t; - typedef double _Complex MORSE_Complex64_t; -# else /* __INTEL_COMPILER */ - /* Use MS VC complex class */ - #include <complex> - typedef std::complex<float> MORSE_Complex32_t; - typedef std::complex<double> MORSE_Complex64_t; - /* For LAPACKE lapacke.h force usage of Windows C++ Complex types */ - #define LAPACK_COMPLEX_CUSTOM - #define lapack_complex_float std::complex<float> - #define lapack_complex_double std::complex<double> - #undef MORSE_HAS_COMPLEX_H +# elif defined(_MSC_VER) && !defined(__INTEL_COMPILER) + #undef MORSE_COMPLEX_CPP + #define MORSE_COMPLEX_CPP +# else + #error "Supported compilers on WIN32 are MSVC and Intel Compiler." # endif /* __INTEL_COMPILER */ + # define isnan _isnan # define isinf !_finite -#else /* _WIN32 */ - typedef float _Complex MORSE_Complex32_t; - typedef double _Complex MORSE_Complex64_t; #endif /* _WIN32 */ - /* Sun doesn't ship the complex.h header. Sun Studio doesn't have it and older GCC compilers don't have it either. */ #if defined(__SUNPRO_C) || defined(__SUNPRO_CC) || defined(sun) || defined(__sun) #undef MORSE_HAS_COMPLEX_H #endif /* __SUNPRO_C */ +#ifndef __cplusplus + #undef MORSE_COMPLEX_CPP +#endif + +#if defined(MORSE_COMPLEX_CPP) + #ifndef LAPACK_COMPLEX_CPP + # define LAPACK_COMPLEX_CPP + # warning "MORSE_COMPLEX_CPP was defined, but not LAPACK_COMPLEX_CPP. Maybe you want to set both." + #endif + #include <complex> // needed for std::complex declaration + #define MORSE_Complex32_t std::complex<float> + #define MORSE_Complex64_t std::complex<double> +#else /* MORSE_COMPLEX_CPP */ + /* not using cplusplus complex type: */ + + #if defined(__STDC_NO_COMPLEX__) + # error "Compiler support for complex number is required." + #endif + + #define MORSE_Complex32_t float _Complex + #define MORSE_Complex64_t double _Complex + + #if MORSE_HAS_COMPLEX_H + # include <complex.h> + #endif +#endif /* MORSE_COMPLEX_CPP */ + +/******************************************************************************* + * MORSE Deprecated attribute + **/ + #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) #define MORSE_DEPRECATED __attribute__((__deprecated__)) #else @@ -97,29 +120,6 @@ typedef long MORSE_size; #endif /* __GNUC__ */ -#ifdef MORSE_HAS_COMPLEX_H -#include <complex.h> -#else /* MORSE_HAS_COMPLEX_H*/ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* These declarations will not clash with what C++ provides because the names in C++ are name-mangled. */ -#if !defined(_WIN32) -extern double cabs(MORSE_Complex64_t z); -extern MORSE_Complex64_t conj(MORSE_Complex64_t z); -#endif /* _WIN32 */ -extern float cabsf(MORSE_Complex32_t z); -extern double cimag(MORSE_Complex64_t z); -extern double creal(MORSE_Complex64_t z); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* MORSE_HAS_COMPLEX_H*/ - /******************************************************************************* * Global utilities **/