#ifndef PASTIX_INT_T_AND_SO_ON
#define PASTIX_INT_T_AND_SO_ON
#cmakedefine PASTIX_FORCE_LONG
#cmakedefine PASTIX_INT32
#cmakedefine PASTIX_INT64
#if defined(PASTIX_FORCE_LONG)
typedef long          pastix_int_t;
typedef unsigned long pastix_uint_t;
#  define MPI_PASTIX_INT   MPI_LONG
#elif defined(PASTIX_INT32)
typedef int32_t       pastix_int_t;
typedef uint32_t      pastix_uint_t;
#  define MPI_PASTIX_INT   MPI_INTEGER4
#elif defined(PASTIX_INT64)
typedef int64_t       pastix_int_t;
typedef uint64_t      pastix_uint_t;
#  define MPI_PASTIX_INT   MPI_INTEGER8
#else  /* PASTIX_INT64 */
typedef int           pastix_int_t;
typedef unsigned int  pastix_uint_t;
#  define MPI_PASTIX_INT   MPI_INT
#endif /* PASTIX_FORCE_LONG */

#define PASTIX_FLOAT_@PASTIX_FLOAT_TYPE@
#ifdef PASTIX_FLOAT_Z
#  ifdef __cplusplus
#    ifndef COMPLEXDOUBLE_
#      define COMPLEXDOUBLE_
#    endif
#    include <complex>
typedef std::complex<double>  pastix_float_t;
#  else
#    include <complex.h>
typedef double complex pastix_float_t;
#  endif /* __cplusplus */
#  define MPI_PASTIX_FLOAT MPI_DOUBLE_COMPLEX
#endif /* PASTIX_FLOAT_Z */


#ifdef PASTIX_FLOAT_C
#  ifdef __cplusplus
#    ifndef COMPLEXDOUBLE_
#      define COMPLEXDOUBLE_
#    endif
#    include <complex>
typedef std::complex<float>  pastix_float_t;
#  else
#    include <complex.h>
typedef float complex pastix_float_t;
#  endif /* __cplusplus */
#endif /* PASTIX_FLOAT_C */

#ifdef PASTIX_FLOAT_D
typedef double pastix_float_t;
#  define MPI_PASTIX_FLOAT MPI_DOUBLE
#endif /* PASTIX_FLOAT_C */


#ifdef PASTIX_FLOAT_S
typedef float pastix_float_t;
#  define MPI_PASTIX_FLOAT MPI_FLOAT
#endif /* PASTIX_FLOAT_C */
#define PASTIX_FLOAT     pastix_float_t
#define PASTIX_INT       pastix_int_t
#define PASTIX_UINT      pastix_uint_t

#cmakedefine PASTIX_WITH_MPI
#ifndef PASTIX_WITH_MPI
#  ifdef MPI_Comm
#    undef MPI_Comm
#  endif
#  define MPI_Comm int
#endif
#endif /* PASTIX_INT_T_AND_SO_ON */
