// Instantiate type cases for all available types    -*-C++-*-
// (C) 2001 Erik Schnetter <schnetter@uni-tuebingen.de>

// Usage:
// Define the macro TYPECASE(N,T) to be a typecase for the type T with name N,
// then include this file,
// then undefine the macro TYPECASE.



// Decide which types to typecase

#ifdef CARPET_ALL
#  undef CARPET_BYTE
#  undef CARPET_INT
#  undef CARPET_REAL
#  undef CARPET_COMPLEX
#  define CARPET_BYTE
#  define CARPET_INT
#  define CARPET_REAL
#  define CARPET_COMPLEX
#endif

#ifdef CARPET_ALL_INT
#  undef CARPET_INT1
#  undef CARPET_INT2
#  undef CARPET_INT4
#  undef CARPET_INT8
#  define CARPET_INT1
#  define CARPET_INT2
#  define CARPET_INT4
#  define CARPET_INT8
#endif

#ifdef CARPET_ALL_REAL
#  undef CARPET_REAL4
#  undef CARPET_REAL8
#  undef CARPET_REAL16
#  define CARPET_REAL4
#  define CARPET_REAL8
#  define CARPET_REAL16
#endif

#ifdef CARPET_ALL_COMPLEX
#  undef CARPET_COMPLEX8
#  undef CARPET_COMPLEX16
#  undef CARPET_COMPLEX32
#  define CARPET_COMPLEX8
#  define CARPET_COMPLEX16
#  define CARPET_COMPLEX32
#endif

#if !defined(CARPET_BYTE) && !defined(CARPET_INT) && !defined(CARPET_INT1) && !defined(CARPET_INT2) && !defined(CARPET_INT4) && !defined(CARPET_INT8) && !defined(CARPET_REAL) && !defined(CARPET_REAL4) && !defined(CARPET_REAL8) && !defined(CARPET_REAL16) && !defined(CARPET_COMPLEX) && !defined(CARPET_COMPLEX8) && !defined(CARPET_COMPLEX16) && !defined(CARPET_COMPLEX32)
// Assume the user just wants INT, REAL, and COMPLEX
#  undef CARPET_INT
#  define CARPET_INT
#  undef CARPET_REAL
#  define CARPET_REAL
#  undef CARPET_COMPLEX
#  define CARPET_COMPLEX
#endif

#ifdef CARPET_INT
#  ifdef CCTK_INTEGER_PRECISION_1
#    undef CARPET_INT1
#    define CARPET_INT1
#  endif
#  ifdef CCTK_INTEGER_PRECISION_2
#    undef CARPET_INT2
#    define CARPET_INT2
#  endif
#  ifdef CCTK_INTEGER_PRECISION_4
#    undef CARPET_INT4
#    define CARPET_INT4
#  endif
#  ifdef CCTK_INTEGER_PRECISION_8
#    undef CARPET_INT8
#    define CARPET_INT8
#  endif
#endif
#ifdef CARPET_REAL
#  ifdef CCTK_REAL_PRECISION_4
#    undef CARPET_REAL4
#    define CARPET_REAL4
#  endif
#  ifdef CCTK_REAL_PRECISION_8
#    undef CARPET_REAL8
#    define CARPET_REAL8
#  endif
#  ifdef CCTK_REAL_PRECISION_16
#    undef CARPET_REAL16
#    define CARPET_REAL16
#  endif
#endif
#ifdef CARPET_COMPLEX
#  ifdef CCTK_REAL_PRECISION_4
#    undef CARPET_COMPLEX8
#    define CARPET_COMPLEX8
#  endif
#  ifdef CCTK_REAL_PRECISION_8
#    undef CARPET_COMPLEX16
#    define CARPET_COMPLEX16
#  endif
#  ifdef CCTK_REAL_PRECISION_16
#    undef CARPET_COMPLEX32
#    define CARPET_COMPLEX32
#  endif
#endif



// // Check
// #if !defined(CARPET_BYTE) && !defined(CARPET_INT1) && !defined(CARPET_INT2) && !defined(CARPET_INT4) && !defined(CARPET_INT8) && !defined(CARPET_REAL4) && !defined(CARPET_REAL8) && !defined(CARPET_REAL16) && !defined(CARPET_COMPLEX8) && !defined(CARPET_COMPLEX16) && !defined(CARPET_COMPLEX32)
// #  error "You have not defined which grid function types to instantiate."
// #endif



// Typecase the desired types

// TODO: Find a way to collapse e.g. CCTK_INT and CCTK_INT4, if both
// are the same.  Remember that the TYPECASE statements need not be
// executable.  Maybe find a way to convert CCTK_VARIABLE_INT to
// CCTK_VARIABLE_INT4?

#ifdef CARPET_BYTE
TYPECASE(CCTK_VARIABLE_BYTE, CCTK_BYTE)
#endif

#ifdef CARPET_INT
TYPECASE(CCTK_VARIABLE_INT, CCTK_INT)
#endif
#ifdef CARPET_INT1
#  ifdef HAVE_CCTK_INT1
TYPECASE(CCTK_VARIABLE_INT1, CCTK_INT1)
#  endif
#endif
#ifdef CARPET_INT2
#  ifdef HAVE_CCTK_INT2
TYPECASE(CCTK_VARIABLE_INT2, CCTK_INT2)
#  endif
#endif
#ifdef CARPET_INT4
#  ifdef HAVE_CCTK_INT4
TYPECASE(CCTK_VARIABLE_INT4, CCTK_INT4)
#  endif
#endif
#ifdef CARPET_INT8
#  ifdef HAVE_CCTK_INT8
TYPECASE(CCTK_VARIABLE_INT8, CCTK_INT8)
#  endif
#endif

#ifdef CARPET_REAL
TYPECASE(CCTK_VARIABLE_REAL, CCTK_REAL)
#endif
#ifdef CARPET_REAL4
#  ifdef HAVE_CCTK_REAL4
TYPECASE(CCTK_VARIABLE_REAL4, CCTK_REAL4)
#  endif
#endif
#ifdef CARPET_REAL8
#  ifdef HAVE_CCTK_REAL8
TYPECASE(CCTK_VARIABLE_REAL8, CCTK_REAL8)
#  endif
#endif
#ifdef CARPET_REAL16
#  ifdef HAVE_CCTK_REAL16
TYPECASE(CCTK_VARIABLE_REAL16, CCTK_REAL16)
#  endif
#endif

#ifdef CARPET_COMPLEX
TYPECASE(CCTK_VARIABLE_COMPLEX, CCTK_COMPLEX)
#endif
#ifdef CARPET_COMPLEX8
#  ifdef HAVE_CCTK_COMPLEX8
TYPECASE(CCTK_VARIABLE_COMPLEX8, CCTK_COMPLEX8)
#  endif
#endif
#ifdef CARPET_COMPLEX16
#  ifdef HAVE_CCTK_COMPLEX16
TYPECASE(CCTK_VARIABLE_COMPLEX16, CCTK_COMPLEX16)
#  endif
#endif
#ifdef CARPET_COMPLEX32
#  ifdef HAVE_CCTK_COMPLEX32
TYPECASE(CCTK_VARIABLE_COMPLEX32, CCTK_COMPLEX32)
#  endif
#endif
