#if !defined(PS_TYPES_H)
#define PS_TYPES_H

/** \file psTypes.h
 *  \brief Support for different types
 *  \ingroup DataGroup
 */

/** Types of the elements of vectors, images, etc. */
typedef enum {
    PS_TYPE_S8,				///< Character
    PS_TYPE_S16,			///< Short integer
    PS_TYPE_S32,			///< Integer
    PS_TYPE_S64,			///< Long integer
    PS_TYPE_U8,				///< Unsigned character
    PS_TYPE_U16,			///< Unsigned short integer
    PS_TYPE_U32,			///< Unsigned integer
    PS_TYPE_U64,			///< Unsigned long integer
    PS_TYPE_F32,			///< Floating point
    PS_TYPE_F64,			///< Double-precision floating point
    PS_TYPE_C32,			///< Complex numbers consisting of floating point
    PS_TYPE_C64,                        ///< Complex numbers consisting of doubles
    PS_TYPE_OTHER			///< Something else that's not supported for arithmetic
} psElemType;

/** Dimensions of a data type */
typedef enum {
    PS_DIMEN_SCALAR,			///< Scalar
    PS_DIMEN_VECTOR,			///< A vector
    PS_DIMEN_TRANSV,			///< A transposed vector
    PS_DIMEN_IMAGE,			///< An image
    PS_DIMEN_OTHER			///< Something else that's not supported for arithmetic
} psDimen;

/** The type of a data type */
typedef struct {
    psDimen dimen;			///< The dimensionality
    psElemType type;			///< The type
} psType;

/************************************************************************************************************/

/**
 * ps- typedefs. These should NOT be used generally, but only where the number of bits in a type must be
 * guaranteed, or for use in macros to preserve the standard naming conventions.
 */
typedef float          psF32;		///< BITPIX -32 (float)
typedef double         psF64;		///< BITPIX -64 (double)
typedef complex float  psC32;
typedef complex double psC64;

typedef int8_t         psS8;
typedef int16_t        psS16;
typedef int32_t        psS32;
typedef int64_t        psS64;

typedef uint8_t        psU8;		///< equivalent to BITPIX 8   
typedef uint16_t       psU16;		///< equivalent to BITPIX 16  
typedef uint32_t       psU32;		///< equivalent to BITPIX 32  
typedef uint64_t       psU64;		

#endif
