// C++ informative line for the emacs editor: -*- C++ -*-
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Copyright by The HDF Group.                                               *
 * 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 COPYING file, which can be found at the root of the source code       *
 * distribution tree, or in https://www.hdfgroup.org/licenses.               *
 * If you do not have access to either file, you may request a copy from     *
 * help@hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#ifndef H5PredType_H
#define H5PredType_H

namespace H5 {

/*! \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.
*/
//  Inheritance: AtomType -> DataType -> H5Object -> H5Location -> IdComponent
class H5_DLLCPP PredType : public AtomType {
  public:
    ///\brief Returns this class name.
    virtual H5std_string
    fromClass() const override
    {
        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: same as the original PredType.
    PredType(const PredType &original);

    // Noop destructor
    virtual ~PredType() override;

    /*! \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
    static const PredType &NATIVE_INT_LEAST8;
    static const PredType &NATIVE_UINT_LEAST8;

    static const PredType &NATIVE_INT_LEAST16;
    static const PredType &NATIVE_UINT_LEAST16;

    static const PredType &NATIVE_INT_LEAST32;
    static const PredType &NATIVE_UINT_LEAST32;

    static const PredType &NATIVE_INT_LEAST64;
    static const PredType &NATIVE_UINT_LEAST64;

    // FAST types
    static const PredType &NATIVE_INT_FAST8;
    static const PredType &NATIVE_UINT_FAST8;

    static const PredType &NATIVE_INT_FAST16;
    static const PredType &NATIVE_UINT_FAST16;

    static const PredType &NATIVE_INT_FAST32;
    static const PredType &NATIVE_UINT_FAST32;

    static const PredType &NATIVE_INT_FAST64;
    static const PredType &NATIVE_UINT_FAST64;

#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
    static PredType *NATIVE_INT_LEAST8_;
    static PredType *NATIVE_UINT_LEAST8_;

    static PredType *NATIVE_INT_LEAST16_;
    static PredType *NATIVE_UINT_LEAST16_;

    static PredType *NATIVE_INT_LEAST32_;
    static PredType *NATIVE_UINT_LEAST32_;

    static PredType *NATIVE_INT_LEAST64_;
    static PredType *NATIVE_UINT_LEAST64_;

    // FAST types
    static PredType *NATIVE_INT_FAST8_;
    static PredType *NATIVE_UINT_FAST8_;

    static PredType *NATIVE_INT_FAST16_;
    static PredType *NATIVE_UINT_FAST16_;

    static PredType *NATIVE_INT_FAST32_;
    static PredType *NATIVE_UINT_FAST32_;

    static PredType *NATIVE_INT_FAST64_;
    static PredType *NATIVE_UINT_FAST64_;

#endif // DOXYGEN_SHOULD_SKIP_THIS

}; // end of PredType
} // namespace H5

#endif // H5PredType_H
