// C++ informative line for the emacs editor: -*- C++ -*-
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Copyright by The HDF Group.                                               *
 * Copyright by the Board of Trustees of the University of Illinois.         *
 * All rights reserved.                                                      *
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
 * the files COPYING and Copyright.html.  COPYING can be found at the root   *
 * of the source code distribution tree; Copyright.html can be found at the  *
 * root level of an installed copy of the electronic HDF5 document set and   *
 * is linked from the top-level documents page.  It can also be found at     *
 * http://hdfgroup.org/HDF5/doc/Copyright.html.  If you do not have          *
 * access to either file, you may request a copy from help@hdfgroup.org.     *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#ifndef __H5PredType_H
#define __H5PredType_H

#ifndef H5_NO_NAMESPACE
namespace H5 {
#endif

/*! \class PredType
    \brief Class PredType holds the definition of all the HDF5 predefined
    datatypes.

    These types can only be made copy of, not created by H5Tcreate or
    closed by H5Tclose.  They are treated as constants.
*/
class H5_DLLCPP PredType : public AtomType {
   public:
	///\brief Returns this class name.
	virtual H5std_string fromClass () const { return("PredType"); }

	// Makes a copy of the predefined type and stores the new
	// id in the left hand side object.
	PredType& operator=( const PredType& rhs );

	// Copy constructor - makes copy of the original object
	PredType( const PredType& original );

	// Noop destructor
	virtual ~PredType();

	/*! \brief This dummy function do not inherit from DataType - it will
	    throw a DataTypeIException if invoked.
	*/
	void commit(H5Location& loc, const H5std_string& name );
	/*! \brief This dummy function do not inherit from DataType - it will
	    throw a DataTypeIException if invoked.
	*/
	void commit(H5Location& loc, const char* name );
	/*! \brief This dummy function do not inherit from DataType - it will
	    throw a DataTypeIException if invoked.
	*/
	bool committed();

	///\brief PredType constants
	static const PredType& STD_I8BE;
	static const PredType& STD_I8LE;
	static const PredType& STD_I16BE;
	static const PredType& STD_I16LE;
	static const PredType& STD_I32BE;
	static const PredType& STD_I32LE;
	static const PredType& STD_I64BE;
	static const PredType& STD_I64LE;
	static const PredType& STD_U8BE;
	static const PredType& STD_U8LE;
	static const PredType& STD_U16BE;
	static const PredType& STD_U16LE;
	static const PredType& STD_U32BE;
	static const PredType& STD_U32LE;
	static const PredType& STD_U64BE;
	static const PredType& STD_U64LE;
	static const PredType& STD_B8BE;
	static const PredType& STD_B8LE;
	static const PredType& STD_B16BE;
	static const PredType& STD_B16LE;
	static const PredType& STD_B32BE;
	static const PredType& STD_B32LE;
	static const PredType& STD_B64BE;
	static const PredType& STD_B64LE;
	static const PredType& STD_REF_OBJ;
	static const PredType& STD_REF_DSETREG;

	static const PredType& C_S1;
	static const PredType& FORTRAN_S1;

	static const PredType& IEEE_F32BE;
	static const PredType& IEEE_F32LE;
	static const PredType& IEEE_F64BE;
	static const PredType& IEEE_F64LE;

	static const PredType& UNIX_D32BE;
	static const PredType& UNIX_D32LE;
	static const PredType& UNIX_D64BE;
	static const PredType& UNIX_D64LE;

	static const PredType& INTEL_I8;
	static const PredType& INTEL_I16;
	static const PredType& INTEL_I32;
	static const PredType& INTEL_I64;
	static const PredType& INTEL_U8;
	static const PredType& INTEL_U16;
	static const PredType& INTEL_U32;
	static const PredType& INTEL_U64;
	static const PredType& INTEL_B8;
	static const PredType& INTEL_B16;
	static const PredType& INTEL_B32;
	static const PredType& INTEL_B64;
	static const PredType& INTEL_F32;
	static const PredType& INTEL_F64;

	static const PredType& ALPHA_I8;
	static const PredType& ALPHA_I16;
	static const PredType& ALPHA_I32;
	static const PredType& ALPHA_I64;
	static const PredType& ALPHA_U8;
	static const PredType& ALPHA_U16;
	static const PredType& ALPHA_U32;
	static const PredType& ALPHA_U64;
	static const PredType& ALPHA_B8;
	static const PredType& ALPHA_B16;
	static const PredType& ALPHA_B32;
	static const PredType& ALPHA_B64;
	static const PredType& ALPHA_F32;
	static const PredType& ALPHA_F64;

	static const PredType& MIPS_I8;
	static const PredType& MIPS_I16;
	static const PredType& MIPS_I32;
	static const PredType& MIPS_I64;
	static const PredType& MIPS_U8;
	static const PredType& MIPS_U16;
	static const PredType& MIPS_U32;
	static const PredType& MIPS_U64;
	static const PredType& MIPS_B8;
	static const PredType& MIPS_B16;
	static const PredType& MIPS_B32;
	static const PredType& MIPS_B64;
	static const PredType& MIPS_F32;
	static const PredType& MIPS_F64;

	static const PredType& NATIVE_CHAR;
	static const PredType& NATIVE_SCHAR;
	static const PredType& NATIVE_UCHAR;
	static const PredType& NATIVE_SHORT;
	static const PredType& NATIVE_USHORT;
	static const PredType& NATIVE_INT;
	static const PredType& NATIVE_UINT;
	static const PredType& NATIVE_LONG;
	static const PredType& NATIVE_ULONG;
	static const PredType& NATIVE_LLONG;
	static const PredType& NATIVE_ULLONG;
	static const PredType& NATIVE_FLOAT;
	static const PredType& NATIVE_DOUBLE;
	static const PredType& NATIVE_LDOUBLE;
	static const PredType& NATIVE_B8;
	static const PredType& NATIVE_B16;
	static const PredType& NATIVE_B32;
	static const PredType& NATIVE_B64;
	static const PredType& NATIVE_OPAQUE;
	static const PredType& NATIVE_HSIZE;
	static const PredType& NATIVE_HSSIZE;
	static const PredType& NATIVE_HERR;
	static const PredType& NATIVE_HBOOL;

	static const PredType& NATIVE_INT8;
	static const PredType& NATIVE_UINT8;
	static const PredType& NATIVE_INT16;
	static const PredType& NATIVE_UINT16;
	static const PredType& NATIVE_INT32;
	static const PredType& NATIVE_UINT32;
	static const PredType& NATIVE_INT64;
	static const PredType& NATIVE_UINT64;

// LEAST types
#if H5_SIZEOF_INT_LEAST8_T != 0
	static const PredType& NATIVE_INT_LEAST8;
#endif /* H5_SIZEOF_INT_LEAST8_T */
#if H5_SIZEOF_UINT_LEAST8_T != 0
	static const PredType& NATIVE_UINT_LEAST8;
#endif /* H5_SIZEOF_UINT_LEAST8_T */

#if H5_SIZEOF_INT_LEAST16_T != 0
	static const PredType& NATIVE_INT_LEAST16;
#endif /* H5_SIZEOF_INT_LEAST16_T */
#if H5_SIZEOF_UINT_LEAST16_T != 0
	static const PredType& NATIVE_UINT_LEAST16;
#endif /* H5_SIZEOF_UINT_LEAST16_T */

#if H5_SIZEOF_INT_LEAST32_T != 0
	static const PredType& NATIVE_INT_LEAST32;
#endif /* H5_SIZEOF_INT_LEAST32_T */
#if H5_SIZEOF_UINT_LEAST32_T != 0
	static const PredType& NATIVE_UINT_LEAST32;
#endif /* H5_SIZEOF_UINT_LEAST32_T */

#if H5_SIZEOF_INT_LEAST64_T != 0
	static const PredType& NATIVE_INT_LEAST64;
#endif /* H5_SIZEOF_INT_LEAST64_T */
#if H5_SIZEOF_UINT_LEAST64_T != 0
	static const PredType& NATIVE_UINT_LEAST64;
#endif /* H5_SIZEOF_UINT_LEAST64_T */

// FAST types
#if H5_SIZEOF_INT_FAST8_T != 0
	static const PredType& NATIVE_INT_FAST8;
#endif /* H5_SIZEOF_INT_FAST8_T */
#if H5_SIZEOF_UINT_FAST8_T != 0
	static const PredType& NATIVE_UINT_FAST8;
#endif /* H5_SIZEOF_UINT_FAST8_T */

#if H5_SIZEOF_INT_FAST16_T != 0
	static const PredType& NATIVE_INT_FAST16;
#endif /* H5_SIZEOF_INT_FAST16_T */
#if H5_SIZEOF_UINT_FAST16_T != 0
	static const PredType& NATIVE_UINT_FAST16;
#endif /* H5_SIZEOF_UINT_FAST16_T */

#if H5_SIZEOF_INT_FAST32_T != 0
	static const PredType& NATIVE_INT_FAST32;
#endif /* H5_SIZEOF_INT_FAST32_T */
#if H5_SIZEOF_UINT_FAST32_T != 0
	static const PredType& NATIVE_UINT_FAST32;
#endif /* H5_SIZEOF_UINT_FAST32_T */

#if H5_SIZEOF_INT_FAST64_T != 0
	static const PredType& NATIVE_INT_FAST64;
#endif /* H5_SIZEOF_INT_FAST64_T */
#if H5_SIZEOF_UINT_FAST64_T != 0
	static const PredType& NATIVE_UINT_FAST64;
#endif /* H5_SIZEOF_UINT_FAST64_T */

#ifndef DOXYGEN_SHOULD_SKIP_THIS

        // Deletes the PredType global constants
        static void deleteConstants();

        // Dummy constant
        static const PredType& PREDTYPE_CONST; // dummy constant

   protected:
	// Default constructor
	PredType();

	// Creates a pre-defined type using an HDF5 pre-defined constant
	PredType( const hid_t predtype_id );  // used by the library only

   private:
        // Activates the creation of the PredType global constants
        static PredType* getPredTypes();

        // Dynamically allocates PredType global constants
        static void makePredTypes();

        // Dummy constant
        static PredType* PREDTYPE_CONST_;

        // Declaration of pointers to constants
        static PredType* STD_I8BE_;
        static PredType* STD_I8LE_;
        static PredType* STD_I16BE_;
        static PredType* STD_I16LE_;
        static PredType* STD_I32BE_;
        static PredType* STD_I32LE_;
        static PredType* STD_I64BE_;
        static PredType* STD_I64LE_;
        static PredType* STD_U8BE_;
        static PredType* STD_U8LE_;
        static PredType* STD_U16BE_;
        static PredType* STD_U16LE_;
        static PredType* STD_U32BE_;
        static PredType* STD_U32LE_;
        static PredType* STD_U64BE_;
        static PredType* STD_U64LE_;
        static PredType* STD_B8BE_;
        static PredType* STD_B8LE_;
        static PredType* STD_B16BE_;
        static PredType* STD_B16LE_;
        static PredType* STD_B32BE_;
        static PredType* STD_B32LE_;
        static PredType* STD_B64BE_;
        static PredType* STD_B64LE_;
        static PredType* STD_REF_OBJ_;
        static PredType* STD_REF_DSETREG_;

        static PredType* C_S1_;
        static PredType* FORTRAN_S1_;

        static PredType* IEEE_F32BE_;
        static PredType* IEEE_F32LE_;
        static PredType* IEEE_F64BE_;
        static PredType* IEEE_F64LE_;

        static PredType* UNIX_D32BE_;
        static PredType* UNIX_D32LE_;
        static PredType* UNIX_D64BE_;
        static PredType* UNIX_D64LE_;

        static PredType* INTEL_I8_;
        static PredType* INTEL_I16_;
        static PredType* INTEL_I32_;
        static PredType* INTEL_I64_;
        static PredType* INTEL_U8_;
        static PredType* INTEL_U16_;
        static PredType* INTEL_U32_;
        static PredType* INTEL_U64_;
        static PredType* INTEL_B8_;
        static PredType* INTEL_B16_;
        static PredType* INTEL_B32_;
        static PredType* INTEL_B64_;
        static PredType* INTEL_F32_;
        static PredType* INTEL_F64_;

        static PredType* ALPHA_I8_;
        static PredType* ALPHA_I16_;
        static PredType* ALPHA_I32_;
        static PredType* ALPHA_I64_;
        static PredType* ALPHA_U8_;
        static PredType* ALPHA_U16_;
        static PredType* ALPHA_U32_;
        static PredType* ALPHA_U64_;
        static PredType* ALPHA_B8_;
        static PredType* ALPHA_B16_;
        static PredType* ALPHA_B32_;
        static PredType* ALPHA_B64_;
        static PredType* ALPHA_F32_;
        static PredType* ALPHA_F64_;

        static PredType* MIPS_I8_;
        static PredType* MIPS_I16_;
        static PredType* MIPS_I32_;
        static PredType* MIPS_I64_;
        static PredType* MIPS_U8_;
        static PredType* MIPS_U16_;
        static PredType* MIPS_U32_;
        static PredType* MIPS_U64_;
        static PredType* MIPS_B8_;
        static PredType* MIPS_B16_;
        static PredType* MIPS_B32_;
        static PredType* MIPS_B64_;
        static PredType* MIPS_F32_;
        static PredType* MIPS_F64_;

        static PredType* NATIVE_CHAR_;
        static PredType* NATIVE_SCHAR_;
        static PredType* NATIVE_UCHAR_;
        static PredType* NATIVE_SHORT_;
        static PredType* NATIVE_USHORT_;
        static PredType* NATIVE_INT_;
        static PredType* NATIVE_UINT_;
        static PredType* NATIVE_LONG_;
        static PredType* NATIVE_ULONG_;
        static PredType* NATIVE_LLONG_;
        static PredType* NATIVE_ULLONG_;
        static PredType* NATIVE_FLOAT_;
        static PredType* NATIVE_DOUBLE_;
        static PredType* NATIVE_LDOUBLE_;
        static PredType* NATIVE_B8_;
        static PredType* NATIVE_B16_;
        static PredType* NATIVE_B32_;
        static PredType* NATIVE_B64_;
        static PredType* NATIVE_OPAQUE_;
        static PredType* NATIVE_HSIZE_;
        static PredType* NATIVE_HSSIZE_;
        static PredType* NATIVE_HERR_;
        static PredType* NATIVE_HBOOL_;

        static PredType* NATIVE_INT8_;
        static PredType* NATIVE_UINT8_;
        static PredType* NATIVE_INT16_;
        static PredType* NATIVE_UINT16_;
        static PredType* NATIVE_INT32_;
        static PredType* NATIVE_UINT32_;
        static PredType* NATIVE_INT64_;
        static PredType* NATIVE_UINT64_;

// LEAST types
#if H5_SIZEOF_INT_LEAST8_T != 0
        static PredType* NATIVE_INT_LEAST8_;
#endif /* H5_SIZEOF_INT_LEAST8_T */
#if H5_SIZEOF_UINT_LEAST8_T != 0
        static PredType* NATIVE_UINT_LEAST8_;
#endif /* H5_SIZEOF_UINT_LEAST8_T */

#if H5_SIZEOF_INT_LEAST16_T != 0
        static PredType* NATIVE_INT_LEAST16_;
#endif /* H5_SIZEOF_INT_LEAST16_T */
#if H5_SIZEOF_UINT_LEAST16_T != 0
        static PredType* NATIVE_UINT_LEAST16_;
#endif /* H5_SIZEOF_UINT_LEAST16_T */

#if H5_SIZEOF_INT_LEAST32_T != 0
        static PredType* NATIVE_INT_LEAST32_;
#endif /* H5_SIZEOF_INT_LEAST32_T */
#if H5_SIZEOF_UINT_LEAST32_T != 0
        static PredType* NATIVE_UINT_LEAST32_;
#endif /* H5_SIZEOF_UINT_LEAST32_T */

#if H5_SIZEOF_INT_LEAST64_T != 0
        static PredType* NATIVE_INT_LEAST64_;
#endif /* H5_SIZEOF_INT_LEAST64_T */
#if H5_SIZEOF_UINT_LEAST64_T != 0
        static PredType* NATIVE_UINT_LEAST64_;
#endif /* H5_SIZEOF_UINT_LEAST64_T */

// FAST types
#if H5_SIZEOF_INT_FAST8_T != 0
        static PredType* NATIVE_INT_FAST8_;
#endif /* H5_SIZEOF_INT_FAST8_T */
#if H5_SIZEOF_UINT_FAST8_T != 0
        static PredType* NATIVE_UINT_FAST8_;
#endif /* H5_SIZEOF_UINT_FAST8_T */

#if H5_SIZEOF_INT_FAST16_T != 0
        static PredType* NATIVE_INT_FAST16_;
#endif /* H5_SIZEOF_INT_FAST16_T */
#if H5_SIZEOF_UINT_FAST16_T != 0
        static PredType* NATIVE_UINT_FAST16_;
#endif /* H5_SIZEOF_UINT_FAST16_T */

#if H5_SIZEOF_INT_FAST32_T != 0
        static PredType* NATIVE_INT_FAST32_;
#endif /* H5_SIZEOF_INT_FAST32_T */
#if H5_SIZEOF_UINT_FAST32_T != 0
        static PredType* NATIVE_UINT_FAST32_;
#endif /* H5_SIZEOF_UINT_FAST32_T */

#if H5_SIZEOF_INT_FAST64_T != 0
        static PredType* NATIVE_INT_FAST64_;
#endif /* H5_SIZEOF_INT_FAST64_T */
#if H5_SIZEOF_UINT_FAST64_T != 0
        static PredType* NATIVE_UINT_FAST64_;
#endif /* H5_SIZEOF_UINT_FAST64_T */
        // End of Declaration of pointers

#endif // DOXYGEN_SHOULD_SKIP_THIS

};
#ifndef H5_NO_NAMESPACE
}
#endif
#endif // __H5PredType_H
