// 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 COPYING file, which can be found at the root of the source code       *
 * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.  *
 * If you do not have access to either file, you may request a copy from     *
 * help@hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#ifndef __H5DSetMemXferPropList_H
#define __H5DSetMemXferPropList_H

namespace H5 {

/*! \class DSetMemXferPropList
    \brief Class DSetCreatPropList inherits from PropList and provides
    wrappers for the HDF5 dataset memory and transfer property list.
*/
//  Inheritance: PropList -> IdComponent
class H5_DLLCPP DSetMemXferPropList : public PropList {
   public:
        ///\brief Default dataset memory and transfer property list.
        static const DSetMemXferPropList& DEFAULT;

        // Creates a dataset memory and transfer property list.
        DSetMemXferPropList();

        // Creates a dataset transform property list.
        DSetMemXferPropList(const char* expression);

        // Sets type conversion and background buffers.
        void setBuffer(size_t size, void* tconv, void* bkg) const;

        // Reads buffer settings.
        size_t getBuffer(void** tconv, void** bkg) const;

        // Sets B-tree split ratios for a dataset transfer property list.
        void setBtreeRatios(double left, double middle, double right) const;

        // Gets B-tree split ratios for a dataset transfer property list.
        void getBtreeRatios(double& left, double& middle, double& right) const;

        // Sets data transform expression.
        void setDataTransform(const char* expression) const;
        void setDataTransform(const H5std_string& expression) const;

        // Gets data transform expression.
        ssize_t getDataTransform(char* exp, size_t buf_size=0) const;
        H5std_string getDataTransform() const;

        // Sets the dataset transfer property list status to TRUE or FALSE.
        void setPreserve(bool status) const;

        // Checks status of the dataset transfer property list.
        bool getPreserve() const;

        // Sets an exception handling callback for datatype conversion.
        void setTypeConvCB(H5T_conv_except_func_t op, void *user_data) const;

        // Gets the exception handling callback for datatype conversion.
        void getTypeConvCB(H5T_conv_except_func_t *op, void **user_data) const;

        // Sets the memory manager for variable-length datatype
        // allocation in H5Dread and H5Dvlen_reclaim.
        void setVlenMemManager(H5MM_allocate_t alloc, void* alloc_info,
                               H5MM_free_t free, void* free_info) const;

        // alloc and free are set to NULL, indicating that system
        // malloc and free are to be used.
        void setVlenMemManager() const;

        // Gets the memory manager for variable-length datatype
        // allocation in H5Dread and H5Tvlen_reclaim.
        void getVlenMemManager(H5MM_allocate_t& alloc, void** alloc_info,
                               H5MM_free_t& free, void** free_info) const;

        // Sets the size of a contiguous block reserved for small data.
        void setSmallDataBlockSize(hsize_t size) const;

        // Returns the current small data block size setting.
        hsize_t getSmallDataBlockSize() const;

        // Sets number of I/O vectors to be read/written in hyperslab I/O.
        void setHyperVectorSize(size_t vector_size) const;

        // Returns the number of I/O vectors to be read/written in
        // hyperslab I/O.
        size_t getHyperVectorSize() const;

        // Enables or disables error-detecting for a dataset reading
        // process.
        void setEDCCheck(H5Z_EDC_t check) const;

        // Determines whether error-detection is enabled for dataset reads.
        H5Z_EDC_t getEDCCheck() const;

        ///\brief Returns this class name.
        virtual H5std_string fromClass () const { return("DSetMemXferPropList"); }

        // Copy constructor - same as the original DSetMemXferPropList.
        DSetMemXferPropList(const DSetMemXferPropList& orig);

        // Creates a copy of an existing dataset memory and transfer
        // property list using the property list id.
        DSetMemXferPropList(const hid_t plist_id);

        // Noop destructor
        virtual ~DSetMemXferPropList();

#ifndef DOXYGEN_SHOULD_SKIP_THIS

        // Deletes the global constant, should only be used by the library
        static void deleteConstants();

    private:
        static DSetMemXferPropList* DEFAULT_;

        // Creates the global constant, should only be used by the library
        static DSetMemXferPropList* getConstant();

#endif // DOXYGEN_SHOULD_SKIP_THIS

}; // end of DSetMemXferPropList
} // namespace H5

#endif // __H5DSetMemXferPropList_H
