/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * 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.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

/*-------------------------------------------------------------------------
 *
 * Created:             H5Gpublic.h
 *
 * Purpose:             Public declarations for the H5G package
 *
 *-------------------------------------------------------------------------
 */
#ifndef H5Gpublic_H
#define H5Gpublic_H

#include "H5public.h"  /* Generic Functions                        */
#include "H5Ipublic.h" /* Identifiers                              */
#include "H5Lpublic.h" /* Links                                    */
#include "H5Opublic.h" /* Object Headers                           */

/*****************/
/* Public Macros */
/*****************/

/*******************/
/* Public Typedefs */
/*******************/

//! <!-- [H5G_storage_t_snip] -->
/**
 * Types of link storage for groups
 */
typedef enum H5G_storage_type_t {
    H5G_STORAGE_TYPE_UNKNOWN = -1, /**< Unknown link storage type	*/
    H5G_STORAGE_TYPE_SYMBOL_TABLE, /**< Links in group are stored with a "symbol table" */
                                   /**< (this is sometimes called "old-style" groups) */
    H5G_STORAGE_TYPE_COMPACT,      /**< Links are stored in object header */
    H5G_STORAGE_TYPE_DENSE         /**< Links are stored in fractal heap & indexed with v2 B-tree */
} H5G_storage_type_t;
//! <!-- [H5G_storage_t_snip] -->

//! <!-- [H5G_info_t_snip] -->
/**
 * Information struct for group for
 * H5Gget_info(), H5Gget_info_by_name(), and H5Gget_info_by_idx()
 */
typedef struct H5G_info_t {
    H5G_storage_type_t storage_type; /**< Type of storage for links in group */
    hsize_t            nlinks;       /**< Number of links in group */
    int64_t            max_corder;   /**< Current max. creation order value for group */
    hbool_t            mounted;      /**< Whether group has a file mounted on it */
} H5G_info_t;
//! <!-- [H5G_info_t_snip] -->

/********************/
/* Public Variables */
/********************/

/*********************/
/* Public Prototypes */
/*********************/
#ifdef __cplusplus
extern "C" {
#endif

/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Creates a new group and links it into the file
 *
 * \fgdta_loc_id
 * \param[in] name      Name of the group to create
 * \lcpl_id
 * \gcpl_id
 * \gapl_id
 *
 * \return \hid_t{group}
 *
 * \details H5Gcreate2() creates a new group in a file. After a
 *          group has been created, links to datasets and to other groups
 *          can be added.
 *
 *          The \p loc_id and \p name parameters specify where the group
 *          is located. \p loc_id may be a file, group, dataset, named
 *          datatype or attribute in the file. If an attribute, dataset,
 *          or named datatype is specified for \p loc_id then the group
 *          will be created at the location where the attribute, dataset,
 *          or named datatype is attached. \p name is the link to the group;
 *          \p name may be either an absolute path in the file (the links
 *          from the root group to the new group) or a relative path from
 *          \p loc_id (the link(s) from the group specified by \p loc_id
 *          to the new group).
 *
 *          \p lcpl_id, \p gcpl_id, and \p gapl_id are property list
 *          identifiers. These property lists govern how the link to the
 *          group is created, how the group is created, and how the group
 *          can be accessed in the future, respectively. #H5P_DEFAULT can
 *          be passed in if the default properties are appropriate for
 *          these property lists. Currently, there are no APIs for the
 *          group access property list; use #H5P_DEFAULT.
 *
 *          The group identifier should be closed by H5Gclose() when access
 *          is no longer required to prevent resource leaks.
 *
 * \since 1.8.0
 *
 * \see H5Gopen2()
 *
 */
H5_DLL hid_t H5Gcreate2(hid_t loc_id, const char *name, hid_t lcpl_id, hid_t gcpl_id, hid_t gapl_id);

/**
 * --------------------------------------------------------------------------
 * \ingroup ASYNC
 * \async_variant_of{H5Gcreate}
 */
#ifndef H5_DOXYGEN
H5_DLL hid_t H5Gcreate_async(const char *app_file, const char *app_func, unsigned app_line, hid_t loc_id,
                             const char *name, hid_t lcpl_id, hid_t gcpl_id, hid_t gapl_id, hid_t es_id);
#else
H5_DLL hid_t  H5Gcreate_async(hid_t loc_id, const char *name, hid_t lcpl_id, hid_t gcpl_id, hid_t gapl_id,
                              hid_t es_id);
#endif

/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Creates a new empty group without linking it into the file structure
 *
 * \fgdta_loc_id
 * \gcpl_id
 * \gapl_id
 *
 * \return \hid_t{group}
 *
 * \details H5Gcreate_anon() creates a new empty group in the file
 *          specified by \p loc_id. With default settings, H5Gcreate_anon()
 *          provides similar functionality to that provided by
 *          H5Gcreate1(), with the differences described in the list below.
 *
 *          The new group's creation and access properties are specified
 *          in \p gcpl_id and \p gapl_id, respectively.
 *
 *          H5Gcreate_anon() returns a new group identifier. This identifier
 *          must be linked into the HDF5 file structure with H5Olink()
 *          or it will be deleted from the file when the file is closed.
 *
 *          The differences between this function and H5Gcreate1() are
 *          as follows:
 *
 *          \li H5Gcreate1() does not provide for the use of custom property
 *              lists; H5Gcreate1() always uses default properties.
 *          \li H5Gcreate_anon() neither provides the new group's name
 *              nor links it into the HDF5 file structure; those actions
 *              must be performed separately through a call to H5Olink(),
 *              which offers greater control over linking.
 *          \li H5Gcreate_anon() does not directly provide a hint mechanism
 *              for the group's heap size. Comparable information can be
 *              included in the group creation property list \p gcpl_id through
 *              a H5Pset_local_heap_size_hint() call.
 *
 *          A group created with this function should be closed with
 *          H5Gclose() when the group is no longer needed so that resource
 *          leaks will not develop.
 *
 * \see H5Olink(), H5Gcreate()
 *
 * \since 1.8.0
 *
 */
H5_DLL hid_t H5Gcreate_anon(hid_t loc_id, hid_t gcpl_id, hid_t gapl_id);

/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Opens an existing group in a file
 *
 * \fgdta_loc_id
 * \param[in] name      Name of the group to open
 * \gapl_id
 *
 * \return \hid_t{group}
 *
 * \details H5Gopen2() opens an existing group, \p name, at the location
 *          specified by \p loc_id.
 *
 *          With default settings, H5Gopen2() provides similar functionality
 *          to that provided by H5Gopen(). The only difference is that
 *          H5Gopen2() can provide a group access property list, \p gapl_id.
 *
 *          H5Gopen2() returns a group identifier for the group that was
 *          opened. This group identifier should be released by H5Gclose()
 *          when it is no longer needed to prevent resource leaks.
 *
 * \since 1.8.0
 *
 * \see H5Gcreate2()
 *
 */
H5_DLL hid_t H5Gopen2(hid_t loc_id, const char *name, hid_t gapl_id);

/**
 * --------------------------------------------------------------------------
 * \ingroup ASYNC
 * \async_variant_of{H5Gopen}
 *
 * \since 1.12.0
 *
 */
#ifndef H5_DOXYGEN
H5_DLL hid_t H5Gopen_async(const char *app_file, const char *app_func, unsigned app_line, hid_t loc_id,
                           const char *name, hid_t gapl_id, hid_t es_id);
#else
H5_DLL hid_t  H5Gopen_async(hid_t loc_id, const char *name, hid_t gapl_id, hid_t es_id);
#endif

/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Gets a group creation property list identifier
 *
 * \group_id
 *
 * \return \hid_t{creation property list}
 *
 * \details H5Gget_create_plist() returns an identifier for the group creation
 *          property list associated with the group specified by \p group_id.
 *
 *          The creation property list identifier should be released with
 *          H5Pclose() to prevent resource leaks.
 *
 * \since 1.8.0
 *
 */
H5_DLL hid_t H5Gget_create_plist(hid_t group_id);

/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Retrieves information about a group
 *
 * \fgdta_loc_id
 * \param[out] ginfo Struct in which group information is returned
 *
 * \return \hid_t{group}
 *
 * \details H5Gget_info() retrieves information about the group at location
 *          specified by \p loc_id. The information is returned in the \p ginfo.
 *
 *          \p ginfo is an H5G_info_t struct and is defined (in H5Gpublic.h)
 *          as follows:
 *
 * \snippet this H5G_info_t_snip
 * Possible values of \p storage_type are:
 * \storage_type
 *
 * \since 1.8.0
 *
 */
H5_DLL herr_t H5Gget_info(hid_t loc_id, H5G_info_t *ginfo);

/**
 * --------------------------------------------------------------------------
 * \ingroup ASYNC
 * \async_variant_of{H5Gget_info}
 *
 * \since 1.12.0
 *
 */
#ifndef H5_DOXYGEN
H5_DLL herr_t H5Gget_info_async(const char *app_file, const char *app_func, unsigned app_line, hid_t loc_id,
                                H5G_info_t *ginfo /*out*/, hid_t es_id);
#else
H5_DLL herr_t H5Gget_info_async(hid_t loc_id, H5G_info_t *ginfo /*out*/, hid_t es_id);
#endif

/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Retrieves information about a group by its name
 *
 * \fgdta_loc_id
 * \param[in] name      Name of the group to query
 * \param[out] ginfo Struct in which group information is returned
 * \lapl_id
 *
 * \return \herr_t
 *
 * \details H5Gget_info_by_name() retrieves information about the group \p name
 *          at location specified by \p loc_id. The information is returned in
 *          the \p ginfo struct.
 *
 *          If \p loc_id specifies the group for which information is queried,
 *          then the group's \p name can be a dot (.).
 *
 *          \p ginfo is an H5G_info_t struct and is defined (in H5Gpublic.h)
 *          as follows:
 *
 * \snippet this H5G_info_t_snip
 * Possible values of \p storage_type are:
 * \storage_type
 *
 * \since 1.8.0
 *
 */
H5_DLL herr_t H5Gget_info_by_name(hid_t loc_id, const char *name, H5G_info_t *ginfo, hid_t lapl_id);

/**
 * --------------------------------------------------------------------------
 * \ingroup ASYNC
 * \async_variant_of{H5Gget_info_by_name}
 *
 * \since 1.12.0
 *
 */
#ifndef H5_DOXYGEN
H5_DLL herr_t H5Gget_info_by_name_async(const char *app_file, const char *app_func, unsigned app_line,
                                        hid_t loc_id, const char *name, H5G_info_t *ginfo /*out*/,
                                        hid_t lapl_id, hid_t es_id);
#else
H5_DLL herr_t H5Gget_info_by_name_async(hid_t loc_id, const char *name, H5G_info_t *ginfo /*out*/,
                                        hid_t lapl_id, hid_t es_id);
#endif

/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Retrieves information about a group, according to the group's
 *        position within an index
 *
 * \fgdta_loc_id
 * \param[in] group_name Name of the group to query
 * \param[in] idx_type   Transient index identifying object
 * \param[in] order      Transient index identifying object
 * \param[in] n          Position in the index of the group to query
 * \param[out] ginfo     Struct in which group information is returned
 * \lapl_id
 *
 * \return Returns
 *      \li The size of the object name if successful, or
 *      \li 0 if no name is associated with the group identifier, or
 *      \li negative value, if failure occurred
 *
 * \details H5Gget_info_by_idx() retrieves the same information
 *          about a group as retrieved by the function H5Gget_info(),
 *          but the means of identifying the group differs; the group is
 *          identified by position in an index rather than by name.
 *
 *          \p loc_id and \p group_name specify the group containing
 *          the group for which information is sought. The groups in \p
 *          group_name are indexed by \p idx_type; the group for which
 *          information is retrieved is identified in that index by index
 *          order, \p order, and index position, \p n.
 *
 *          If \p loc_id specifies the group containing the group for
 *          which information is queried, \p group_name can be a dot (.).
 *
 *          Valid values for \p index_type are as follows:
 * \indexes
 *          The order in which the index is to be examined, as specified
 *          by \p order, can be one of the following:
 * \orders
 *
 * \since 1.8.0
 *
 */
H5_DLL herr_t H5Gget_info_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type,
                                 H5_iter_order_t order, hsize_t n, H5G_info_t *ginfo, hid_t lapl_id);

/**
 * --------------------------------------------------------------------------
 * \ingroup ASYNC
 * \async_variant_of{H5Gget_info_by_idx}
 *
 * \since 1.12.0
 *
 */
#ifndef H5_DOXYGEN
H5_DLL herr_t H5Gget_info_by_idx_async(const char *app_file, const char *app_func, unsigned app_line,
                                       hid_t loc_id, const char *group_name, H5_index_t idx_type,
                                       H5_iter_order_t order, hsize_t n, H5G_info_t *ginfo /*out*/,
                                       hid_t lapl_id, hid_t es_id);
#else
H5_DLL herr_t H5Gget_info_by_idx_async(hid_t loc_id, const char *group_name, H5_index_t idx_type,
                                       H5_iter_order_t order, hsize_t n, H5G_info_t *ginfo /*out*/,
                                       hid_t lapl_id, hid_t es_id);
#endif

/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Flushes all buffers associated with a group to disk
 *
 * \group_id
 *
 * \return \herr_t
 *
 * \details H5Gflush() causes all buffers associated with a group to be
 *          immediately flushed to the disk without removing the data from
 *          the cache.
 *
 * \attention
 *          HDF5 does not possess full control over buffering. H5G_FLUSH
 *          flushes the internal HDF5 buffers and then asks the operating
 *          system (the OS) to flush the system buffers for the open
 *          files. After that, the OS is responsible for ensuring that
 *          the data is actually flushed to the disk.
 *
 * \since 1.8.0
 *
 */
H5_DLL herr_t H5Gflush(hid_t group_id);

/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Refreshes all buffers associated with a group
 *
 * \group_id
 *
 * \return \herr_t
 *
 * \details H5Grefresh() causes all buffers associated with a group to be
 *          cleared and immediately re-loaded with updated contents from disk.
 *
 *          This function essentially closes the group, evicts all
 *          metadata associated with it from the cache, and then reopens
 *          the group. The reopened group is automatically re-registered
 *          with the same identifier.
 *
 * \since 1.8.0
 *
 */
H5_DLL herr_t H5Grefresh(hid_t group_id);

/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Closes the specified group
 *
 * \group_id
 *
 * \return \herr_t
 *
 * \details H5Gclose() releases resources used by a group that was
 *          opened by H5Gcreate() or H5Gopen().  After closing a group,
 *          \p group_id cannot be used again until another H5Gcreate()
 *          or H5Gopen() is called on it.
 *
 *          Failure to release a group with this call will result in
 *          resource leaks.
 *
 * \par Example
 * \snippet H5F_examples.c mount
 *
 * \since 1.0.0
 *
 */
H5_DLL herr_t H5Gclose(hid_t group_id);

/**
 * --------------------------------------------------------------------------
 * \ingroup ASYNC
 * \async_variant_of{H5Gclose}
 *
 * \since 1.12.0
 *
 */
#ifndef H5_DOXYGEN
H5_DLL herr_t H5Gclose_async(const char *app_file, const char *app_func, unsigned app_line, hid_t group_id,
                             hid_t es_id);
#else
H5_DLL herr_t H5Gclose_async(hid_t group_id, hid_t es_id);
#endif

/// \cond DEV
/* API Wrappers for async routines */
/* (Must be defined _after_ the function prototype) */
/* (And must only defined when included in application code, not the library) */
#ifndef H5G_MODULE
#define H5Gcreate_async(...)           H5Gcreate_async(__FILE__, __func__, __LINE__, __VA_ARGS__)
#define H5Gopen_async(...)             H5Gopen_async(__FILE__, __func__, __LINE__, __VA_ARGS__)
#define H5Gget_info_async(...)         H5Gget_info_async(__FILE__, __func__, __LINE__, __VA_ARGS__)
#define H5Gget_info_by_name_async(...) H5Gget_info_by_name_async(__FILE__, __func__, __LINE__, __VA_ARGS__)
#define H5Gget_info_by_idx_async(...)  H5Gget_info_by_idx_async(__FILE__, __func__, __LINE__, __VA_ARGS__)
#define H5Gclose_async(...)            H5Gclose_async(__FILE__, __func__, __LINE__, __VA_ARGS__)

/* Define "wrapper" versions of function calls, to allow compile-time values to
 *      be passed in by language wrapper or library layer on top of HDF5.
 */
#define H5Gcreate_async_wrap           H5_NO_EXPAND(H5Gcreate_async)
#define H5Gopen_async_wrap             H5_NO_EXPAND(H5Gopen_async)
#define H5Gget_info_async_wrap         H5_NO_EXPAND(H5Gget_info_async)
#define H5Gget_info_by_name_async_wrap H5_NO_EXPAND(H5Gget_info_by_name_async)
#define H5Gget_info_by_idx_async_wrap  H5_NO_EXPAND(H5Gget_info_by_idx_async)
#define H5Gclose_async_wrap            H5_NO_EXPAND(H5Gclose_async)
#endif /* H5G_MODULE */
/// \endcond

/* Symbols defined for compatibility with previous versions of the HDF5 API.
 *
 * Use of these symbols is deprecated.
 */
#ifndef H5_NO_DEPRECATED_SYMBOLS

/* Macros */

/* Link definitions */
#define H5G_SAME_LOC   H5L_SAME_LOC
#define H5G_LINK_ERROR H5L_TYPE_ERROR
#define H5G_LINK_HARD  H5L_TYPE_HARD
#define H5G_LINK_SOFT  H5L_TYPE_SOFT
#define H5G_link_t     H5L_type_t

/* Macros for types of objects in a group (see H5G_obj_t definition) */
#define H5G_NTYPES      256 /* Max possible number of types	*/
#define H5G_NLIBTYPES   8   /* Number of internal types	*/
#define H5G_NUSERTYPES  (H5G_NTYPES - H5G_NLIBTYPES)
#define H5G_USERTYPE(X) (8 + (X)) /* User defined types		*/

/* Typedefs */

//! <!-- [H5G_obj_t_snip] -->
/**
 * An object has a certain type. The first few numbers are reserved for use
 * internally by HDF5. Users may add their own types with higher values.  The
 * values are never stored in the file -- they only exist while an application
 * is running.  An object may satisfy the `isa' function for more than one type.
 *
 * \deprecated
 */
typedef enum H5G_obj_t {
    H5G_UNKNOWN = -1, /**< Unknown object type		*/
    H5G_GROUP,        /**< Object is a group		*/
    H5G_DATASET,      /**< Object is a dataset		*/
    H5G_TYPE,         /**< Object is a named data type	*/
    H5G_LINK,         /**< Object is a symbolic link	*/
    H5G_UDLINK,       /**< Object is a user-defined link */
    H5G_RESERVED_5,   /**< Reserved for future use	*/
    H5G_RESERVED_6,   /**< Reserved for future use	*/
    H5G_RESERVED_7    /**< Reserved for future use	*/
} H5G_obj_t;
//! <!-- [H5G_obj_t_snip] -->

//! <!-- [H5G_iterate_t_snip] -->
/**
 * Callback for H5Giterate()
 *
 * \deprecated
 */
typedef herr_t (*H5G_iterate_t)(hid_t group, const char *name, void *op_data);
//! <!-- [H5G_iterate_t_snip] -->

//! <!-- [H5G_stat_t_snip] -->
/**
 * Information about an object
 *
 * \deprecated
 */
typedef struct H5G_stat_t {
    unsigned long fileno[2]; /**< file number			*/
    unsigned long objno[2];  /**< object number			*/
    unsigned      nlink;     /**< number of hard links to object*/
    H5G_obj_t     type;      /**< basic object type		*/
    time_t        mtime;     /**< modification time		*/
    size_t        linklen;   /**< symbolic link value length	*/
    H5O_stat_t    ohdr;      /**< Object header information    */
} H5G_stat_t;
//! <!-- [H5G_stat_t_snip] -->

/* Function prototypes */
/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Creates a new group and links it into the file
 *
 * \fgdta_loc_id
 * \param[in] name      Name of the group to create
 * \param[in] size_hint The number of bytes to reserve for the names
 *                      that will appear in the group
 *
 * \return \hid_t{group}
 *
 * \deprecated This function is deprecated in favor of H5Gcreate2().
 *
 * \details H5Gcreate1() creates a new group with the specified name at the
 *          specified location, \p loc_id.  \p loc_id may be a file, group,
 *          dataset, named datatype or attribute.  If an attribute, dataset, or
 *          named datatype is specified for \p loc_id then the group will be
 *          created at the location where the attribute, dataset, or named
 *          datatype is attached. The name, name, must not already be taken by
 *          some other object and all parent groups must already exist.
 *
 *          \p name can be a relative path based at \p loc_id or an absolute
 *          path from the root of the file. Use of this function requires that
 *          any intermediate groups specified in the path already exist.
 *
 *          The length of a group name, or of the name of any object within a
 *          group, is not limited.
 *
 *          \p size_hint is a hint for the number of bytes to reserve to store
 *          the names which will be eventually added to the new group. This
 *          value must be between 0 and UINT32_MAX (inclusive). If this
 *          parameter is zero, a default value will be used.
 *
 *          The return value is a group identifier for the open group. This
 *          group identifier should be closed by calling H5Gclose() when it is
 *          no longer needed.
 *
 *          See H5Gcreate_anon() for a discussion of the differences between
 *          H5Gcreate1() and H5Gcreate_anon().
 *
 * \par Example
 * \snippet H5F_examples.c mount
 *
 * \version 1.8.0 Function H5Gcreate() renamed to H5Gcreate1() and deprecated
 *                in this release.
 * \since 1.0.0
 *
 */
H5_DLL hid_t H5Gcreate1(hid_t loc_id, const char *name, size_t size_hint);
/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Opens an existing group for modification and returns a group
 *        identifier for that group
 *
 * \fgdta_loc_id
 * \param[in] name      Name of the group to open
 *
 * \return \hid_t{group}
 *
 * \deprecated This function is deprecated in favor of H5Gopen2().
 *
 * \details H5Gopen1() opens an existing group, \p name, at the location
 *          specified by \p loc_id.
 *
 *          H5Gopen1() returns a group identifier for the group that was
 *          opened. This group identifier should be released by calling
 *          H5Gclose() when it is no longer needed.
 *
 * \version 1.8.0 The function H5Gopen() was renamed to H5Gopen1()
 *                and deprecated in this release.
 * \since 1.0.0
 *
 */
H5_DLL hid_t H5Gopen1(hid_t loc_id, const char *name);
/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Creates a link of the specified type from \p new_name to \p
 *        cur_name
 *
 * \fg_loc_id{cur_loc_id}
 * \param[in] type Link type
 * \param[in] cur_name Name of the existing object
 * \param[in] new_name New name for the object
 *
 * \return \herr_t
 *
 * \deprecated This function is deprecated.
 *
 * \details H5Glink() creates a new name for an object that has some current
 *          name, possibly one of many names it currently has.
 *
 *          If \p link_type is #H5G_LINK_HARD, then \p cur_name must specify
 *          the name of an existing object and both names are interpreted
 *          relative to \p cur_loc_id, which is either a file identifier or a
 *          group identifier.
 *
 *          If \p link_type is #H5G_LINK_SOFT, then \p cur_name can be anything
 *          and is interpreted at lookup time relative to the group which
 *          contains the final component of \p new_name. For instance, if \p
 *          cur_name is \Code{./foo}, \p new_name is \Code{./x/y/bar}, and a
 *          request is made for \Code{./x/y/bar}, then the actual object looked
 *          up is \Code{./x/y/./foo}.

 * \version 1.8.0 Function deprecated in this release.
 *
 * \since 1.0.0
 *
 */
H5_DLL herr_t H5Glink(hid_t cur_loc_id, H5G_link_t type, const char *cur_name, const char *new_name);
/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Creates a link of the specified type from \p cur_name to \p
 *        new_name
 *
 * \fg_loc_id{cur_loc_id}
 * \param[in] cur_name Name of the existing object
 * \param[in] type Link type
 * \fg_loc_id{new_loc_id}
 * \param[in] new_name New name for the object
 *
 * \return \herr_t
 *
 * \deprecated This function is deprecated.
 *
 * \details H5Glink2() creates a new name for an object that has some current
 *          name, possibly one of many names it currently has.
 *
 *          If \p link_type is #H5G_LINK_HARD, then \p cur_name must specify the
 *          name of an existing object and both names are interpreted relative
 *          to \p cur_loc_id and \p new_loc_id, respectively, which are either
 *          file identifiers or group identifiers.
 *
 *          If \p link_type is #H5G_LINK_SOFT, then \p cur_name can be anything
 *          and is interpreted at lookup time relative to the group which
 *          contains the final component of \p new_name. For instance, if \p
 *          current_name is \Code{./foo}, \p new_name is \Code{./x/y/bar}, and a
 *          request is made for \Code{./x/y/bar}, then the actual object looked
 *          up is \Code{./x/y/./foo}.
 *
 * \version 1.8.0 Function deprecated in this release.
 *
 * \since 1.6.0
 *
 */
H5_DLL herr_t H5Glink2(hid_t cur_loc_id, const char *cur_name, H5G_link_t type, hid_t new_loc_id,
                       const char *new_name);
/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Renames an object within an HDF5 file
 *
 * \fg_loc_id{src_loc_id}
 * \param[in] src_name Object's original name
 * \param[in] dst_name Object's new name
 *
 * \return \herr_t
 *
 * \deprecated This function is deprecated.
 *
 * \details H5Gmove() renames an object within an HDF5 file. The original name,
 *          \p src_name, is unlinked from the group graph and the new name, \p
 *          dst_name, is inserted as an atomic operation. Both names are
 *          interpreted relative to \p loc_id, which is either a file or a group
 *          identifier.
 *
 * \attention Exercise care in moving groups as it is possible to render data in
 *            a file inaccessible with H5Gmove(). See The Group Interface in the
 *            \ref UG.
 *
 * \version 1.8.0 Function deprecated in this release.
 *
 * \since 1.0.0
 *
 */
H5_DLL herr_t H5Gmove(hid_t src_loc_id, const char *src_name, const char *dst_name);
/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Renames an object within an HDF5 file
 *
 * \fg_loc_id{src_loc_id}
 * \param[in] src_name Object's original name
 * \fg_loc_id{dst_loc_id}
 * \param[in] dst_name Object's new name
 *
 * \return \herr_t
 *
 * \deprecated This function is deprecated.
 *
 * \details H5Gmove2() renames an object within an HDF5 file. The original name,
 *          \p src_name, is unlinked from the group graph and the new name, \p
 *          dst_name, is inserted as an atomic operation.
 *
 *          \p src_name and \p dst_name are interpreted relative to \p
 *          src_loc_id and \p dst_loc_id, respectively, which are either file or
 *          group identifiers.
 *
 * \attention Exercise care in moving groups as it is possible to render data in
 *            a file inaccessible with H5Gmove2(). See The Group Interface in the
 *            \ref UG.
 *
 * \version 1.8.0 Function deprecated in this release.
 *
 * \since 1.6.0
 *
 */
H5_DLL herr_t H5Gmove2(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, const char *dst_name);
/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Removes the link to an object from a group
 *
 * \fg_loc_id{loc_id}
 * \param[in] name Name of the object to unlink
 *
 * \return \herr_t
 *
 * \deprecated This function is deprecated in favor of the function H5Ldelete().
 *
 * \details H5Gunlink() removes the object specified by \p name from the group
 *          graph and decrements the link count for the object to which \p name
 *          points. This action eliminates any association between name and the
 *          object to which name pointed.
 *
 *          Object headers keep track of how many hard links refer to an object;
 *          when the link count reaches zero, the object can be removed from the
 *          file. Objects which are open are not removed until all identifiers
 *          to the object are closed.
 *
 *          If the link count reaches zero, all file space associated with the
 *          object will be released, i.e., identified in memory as freespace. If
 *          any object identifier is open for the object, the space will not be
 *          released until after the object identifier is closed.
 *
 *          Note that space identified as freespace is available for reuse only
 *          as long as the file remains open; once a file has been closed, the
 *          HDF5 library loses track of freespace. See “Freespace Management” in
 *          the \ref UG for further details.
 *
 * \attention Exercise care in moving groups as it is possible to render data in
 *            a file inaccessible with H5Gunlink(). See The Group Interface in the
 *            \ref UG.
 *
 * \version 1.8.0 Function deprecated in this release.
 *
 * \since 1.0.0
 *
 */
H5_DLL herr_t H5Gunlink(hid_t loc_id, const char *name);
/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Returns the name of the object that the symbolic link points to
 *
 * \fg_loc_id{loc_id}
 * \param[in] name Symbolic link to the object whose name is to be returned
 * \param[in] size Maximum number of characters of value to be returned
 * \param[out] buf A buffer to hold the name of the object being sought
 *
 * \return \herr_t
 *
 * \deprecated This function is deprecated in favor of the function H5Lget_val().
 *
 * \details H5Gget_linkval() returns up to size characters of the name of the
 *          object that the symbolic link name points to.
 *
 *          The parameter \p loc_id is a file or group identifier.
 *
 *          The parameter \p name must be a symbolic link pointing to the
 *          desired object and must be defined relative to \p loc_id.
 *
 *          If size is smaller than the size of the returned object name, then
 *          the name stored in the buffer value will not be \c NULL terminated.
 *
 *          This function fails if \p name is not a symbolic link. The presence
 *          of a symbolic link can be tested by passing zero for \p size and \p
 *          NULL for value.
 *
 *          This function should be used only after H5Lget_info1() (or the
 *          deprecated function H5Gget_objinfo()) has been called to verify that
 *          name is a symbolic link.
 *
 * \version 1.8.0 Function deprecated in this release.
 *
 * \since 1.0.0
 *
 */
H5_DLL herr_t H5Gget_linkval(hid_t loc_id, const char *name, size_t size, char *buf /*out*/);
/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Sets comment for specified object
 *
 * \fgdt_loc_id
 * \param[in] name Name of the object whose comment is to be set or reset
 *                 name must be \Code{'.'} (dot) if \p loc_id fully specifies
 *                 the object for which the comment is to be set.
 * \param[in] comment The new comment
 *
 * \return \herr_t
 *
 * \deprecated This function is deprecated in favor of the function
 *             H5Oset_comment().
 *
 * \details H5Gset_comment() sets the comment for the object specified by \p
 *          loc_id and name to comment. Any previously existing comment is
 *          overwritten.
 *
 *          \p loc_id can specify any object in the file. name can be one of the
 *          following:
 *          \li The name of the object relative to \p loc_id
 *          \li An absolute name of the object, starting from \c /, the file's
 *              root group
 *          \li A dot (\c .), if \p loc_id fully specifies the object
 *
 *          If \p comment is the empty string or a null pointer, the comment
 *          message is removed from the object.
 *
 *          Comments should be relatively short, null-terminated, ASCII strings.
 *
 *          Comments can be attached to any object that has an object header,
 *          e.g., datasets, groups, and named datatypes, but not symbolic links.
 *
 * \version 1.8.0 Function deprecated in this release.
 *
 * \since 1.0.0
 *
 */
H5_DLL herr_t H5Gset_comment(hid_t loc_id, const char *name, const char *comment);
/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Retrieves comment for specified object
 *
 * \fgdt_loc_id
 * \param[in] name Name of the object whose comment is to be set or reset
 *                 name must be \Code{'.'} (dot) if \p loc_id fully specifies
 *                 the object for which the comment is to be set.
 * \param[in] bufsize Maximum number of comment characters to be returned in \p buf.
 * \param[in] buf The comment
 *
 * \return Returns the number of characters in the comment, counting the \c NULL
 *         terminator, if successful; the value returned may be larger than
 *         \p bufsize. Otherwise returns a negative value.
 *
 * \deprecated This function is deprecated in favor of the function
 *             H5Oget_comment().
 *
 * \details H5Gget_comment() retrieves the comment for the object specified
 *          by \p loc_id and \p name. The comment is returned in the buffer \p
 *          buf.
 *
 *          \p loc_id can specify any object in the file. name can be one of the
 *          following:
 *          \li The name of the object relative to \p loc_id
 *          \li An absolute name of the object, starting from \c /, the file's
 *              root group
 *          \li A dot (\c .), if \p loc_id fully specifies the object
 *
 *          At most bufsize characters, including a null-terminator, are
 *          returned in \p buf. The returned value is not null-terminated if the
 *          comment is longer than the supplied buffer. If the size of the
 *          comment is unknown, a preliminary \p H5Gget_comment() call will
 *          return the size of the comment, including space for the
 *          null-terminator.
 *
 *          If an object does not have a comment, the empty string is returned
 *          in comment.
 *
 * \version 1.8.0 Function deprecated in this release.
 *
 * \since 1.0.0
 *
 */
H5_DLL int H5Gget_comment(hid_t loc_id, const char *name, size_t bufsize, char *buf);
/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Iterates over the entries of a group invoking a callback for each
 *        entry encountered
 *
 * \fg_loc_id
 * \param[in] name Group over which the iteration is performed
 * \param[in,out] idx Location at which to begin the iteration
 * \param[in] op Operation to be performed on an object at each step of the
 *               iteration
 * \param[in,out] op_data Data associated with the operation
 *
 * \return \herr_t
 *
 * \deprecated This function is deprecated in favor of the function
 *             H5Literate1().
 *
 * \details H5Giterate() iterates over the members of name in the file or group
 *          specified with \p loc_id. For each object in the group, the \p
 *          op_data and some additional information, specified below, are passed
 *          to the operator function. The iteration begins with the \p idx
 *          object in the group and the next element to be processed by the
 *          operator is returned in \p idx. If \p idx is NULL, then the iterator
 *          starts at the first group member; since no stopping point is
 *          returned in this case, the iterator cannot be restarted if one of
 *          the calls to its operator returns non-zero. H5Giterate() does not
 *          recursively follow links into subgroups of the specified group.
 *
 *          The prototype for \ref H5G_iterate_t is:
 *          \snippet this H5G_iterate_t_snip
 *
 *          The operation receives the group identifier for the group being
 *          iterated over, \p group, the name of the current object within
 *          the group, \p name, and the pointer to the operator data
 *          passed into H5Giterate(), \p op_data.
 *
 *          The return values from an operator are:
 *          \li Zero causes the iterator to continue, returning zero when all
 *              group members have been processed.
 *          \li Positive causes the iterator to immediately return that positive
 *              value, indicating short-circuit success. The iterator can be
 *              restarted at the next group member.
 *          \li Negative causes the iterator to immediately return that value,
 *              indicating failure. The iterator can be restarted at the next
 *              group member.
 *
 *          H5Giterate() assumes that the membership of the group identified by
 *          \p name remains unchanged through the iteration. If the membership
 *          changes during the iteration, the function's behavior is undefined.
 *
 *          H5Giterate() is not recursive. In particular, if a member of \p name
 *          is found to be a group, call it \c subgroup_a, H5Giterate() does not
 *          examine the members of \c subgroup_a. When recursive iteration is
 *          required, the application must handle the recursion, explicitly
 *          calling H5Giterate() on discovered subgroups.
 *
 * \warning  Adding or removing members to the group during iteration
 *           will lead to undefined behavior.
 *
 * \version 1.8.0 Function deprecated in this release.
 *
 * \since 1.0.0
 *
 */
H5_DLL herr_t H5Giterate(hid_t loc_id, const char *name, int *idx, H5G_iterate_t op, void *op_data);
/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Returns number of objects in the group specified by its identifier
 *
 * \fg_loc_id
 * \param[out] num_objs Number of objects in the group
 *
 * \return \herr_t
 *
 * \deprecated This function is deprecated in favor of the function H5Gget_info().
 *
 * \details H5Gget_num_objs() returns number of objects in a group. Group is
 *          specified by its identifier \p loc_id. If a file identifier is
 *          passed in, then the number of objects in the root group is returned.
 *
 * \version 1.8.0 Function deprecated in this release.
 *
 * \since 1.6.0
 *
 */
H5_DLL herr_t H5Gget_num_objs(hid_t loc_id, hsize_t *num_objs);
/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Returns information about an object.
 *
 * \fgdt_loc_id
 * \param[in] name Name of the object for which status is being sought
 * \param[in] follow_link Link flag
 * \param[out] statbuf Buffer in which to return information about the object
 *
 * \return \herr_t
 *
 * \deprecated This function is deprecated in favor of the functions H5Oget_info()
 *             and H5Lget_info1().
 *
 * \details H5Gget_objinfo() returns information about the specified object
 *          through the \p statbuf argument.
 *
 *          A file or group identifier, \p loc_id, and an object name, \p name,
 *          relative to \p loc_id, are commonly used to specify the
 *          object. However, if the object identifier is already known to the
 *          application, an alternative approach is to use that identifier, \c
 *          obj_id, in place of \p loc_id, and a dot (\c .) in place of \p
 *          name. Thus, the alternative versions of the first portion of an
 *          H5Gget_objinfo() call would be as follows:
 *          \code
 *          H5Gget_objinfo (loc_id name  ...)
 *          H5Gget_objinfo (obj_id .     ...)
 *          \endcode
 *
 *          If the object is a symbolic link and follow_link is zero (0), then
 *          the information returned describes the link itself; otherwise the
 *          link is followed and the information returned describes the object
 *          to which the link points. If \p follow_link is non-zero but the
 *          final symbolic link is dangling (does not point to anything), then
 *          an error is returned. The \p statbuf fields are undefined for an
 *          error. The existence of an object can be tested by calling this
 *          function with a \c NULL \p statbuf.
 *
 *          H5Gget_objinfo() fills in the following data structure (defined in
 *          H5Gpublic.h):
 *          \snippet this H5G_stat_t_snip
 *
 *          where \ref H5O_stat_t (defined in H5Opublic.h) is:
 *          \snippet H5Opublic.h H5O_stat_t_snip
 *
 * \attention Some systems will be able to record the time accurately but unable
 *            to retrieve the correct time; such systems (e.g., Irix64) will
 *            report an \c mtime value of 0 (zero).
 *
 * \version 1.8.0 Function deprecated in this release.
 * \version 1.6.1 Two new fields were added to the \ref H5G_stat_t struct in
 *                this release.
 *
 * \since 1.0.0
 *
 */
H5_DLL herr_t H5Gget_objinfo(hid_t loc_id, const char *name, hbool_t follow_link,
                             H5G_stat_t *statbuf /*out*/);
/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Returns the name of an object specified by an index
 *
 * \fg_loc_id
 * \param[in] idx Transient index identifying object
 * \param[in,out] name Pointer to user-provided buffer the object name
 * \param[in] size Name length
 *
 * \return Returns the size of the object name if successful, or 0 if no name is
 *         associated with the group identifier. Otherwise returns a negative
 *         value.
 *
 * \deprecated This function is deprecated in favor of the function H5Lget_name_by_idx().
 *
 * \details H5Gget_objname_by_idx() returns the name of the object specified by
 *          the index \p idx in the group \p loc_id.
 *
 *          The group is specified by a group identifier \p loc_id. If
 *          preferred, a file identifier may be passed in \p loc_id; that file's
 *          root group will be assumed.
 *
 *          \p idx is the transient index used to iterate through the objects in
 *          the group. The value of \p idx is any nonnegative number less than
 *          the total number of objects in the group, which is returned by the
 *          function H5Gget_num_objs(). Note that this is a transient index; an
 *          object may have a different index each time a group is opened.
 *
 *          The object name is returned in the user-specified buffer \p name.
 *
 *          If the size of the provided buffer \p name is less or equal the
 *          actual object name length, the object name is truncated to
 *          \Code{max_size - 1} characters.
 *
 *          Note that if the size of the object's name is unknown, a preliminary
 *          call to H5Gget_objname_by_idx() with \p name set to \c NULL will
 *          return the length of the object's name. A second call to
 *          H5Gget_objname_by_idx() can then be used to retrieve the actual
 *          name.
 *
 * \version 1.8.0 Function deprecated in this release.
 * \since 1.6.0
 *
 */
H5_DLL ssize_t H5Gget_objname_by_idx(hid_t loc_id, hsize_t idx, char *name, size_t size);
/**
 *-------------------------------------------------------------------------
 * \ingroup H5G
 *
 * \brief Returns the type of an object specified by an index
 *
 * \fg_loc_id
 * \param[in] idx Transient index identifying object
 *
 * \return Returns the type of the object if successful. Otherwise returns a
 *         negative value.
 *
 * \deprecated This function is deprecated in favor of the function H5Oget_info().
 *
 * \details H5Gget_objtype_by_idx() returns the type of the object specified by
 *          the index \p idx in the group \p loc_id.
 *
 *          The group is specified by a group identifier \p loc_id. If
 *          preferred, a file identifier may be passed in \p loc_id; that file's
 *          root group will be assumed.
 *
 *          \p idx is the transient index used to iterate through the objects in
 *          the group. This parameter is described in more detail in the
 *          discussion of H5Gget_objname_by_idx().
 *
 * \note    As of 1.12.0, H5Gget_objtype_by_idx() returns the type of the object
 *          that the link points to, but it has been deprecated for H5Oget_info().
 *          Previous behavior for this function returned H5G_LINK for any link type.
 *          To get the link type, an application may use H5Lget_info_by_idx()
 *          instead.
 *
 * \version 1.8.0 Function deprecated in this release.
 * \version 1.6.0 The function return type changed from \c int to the enumerated
 *                type \ref H5G_obj_t.
 * \since 1.6.0
 *
 */
H5_DLL H5G_obj_t H5Gget_objtype_by_idx(hid_t loc_id, hsize_t idx);

#endif /* H5_NO_DEPRECATED_SYMBOLS */

#ifdef __cplusplus
}
#endif
#endif /* H5Gpublic_H */
