//-------------------------------------------------------------------------- // Function: H5Location::flush ///\brief Flushes all buffers associated with a location to disk. ///\param scope - IN: Specifies the scope of the flushing action, /// which can be either of these values: /// \li \c H5F_SCOPE_GLOBAL - Flushes the entire virtual file /// \li \c H5F_SCOPE_LOCAL - Flushes only the specified file ///\exception H5::Exception ///\par Description /// This location is used to identify the file to be flushed. // Programmer Binh-Minh Ribler - 2012 // Modification // Sep 2012 - BMR // Moved from H5File/H5Object //-------------------------------------------------------------------------- void H5Location::flush(H5F_scope_t scope) const { herr_t ret_value = H5Fflush(getId(), scope); if( ret_value < 0 ) { throw LocationException(inMemFunc("flush"), "H5Fflush failed"); } }
//-------------------------------------------------------------------------- // Function: H5Location::p_reference (protected) // Purpose Creates a reference to an HDF5 object or a dataset region. // Parameters // name - IN: Name of the object to be referenced // dataspace - IN: Dataspace with selection // ref_type - IN: Type of reference; default to \c H5R_DATASET_REGION // Exception H5::ReferenceException // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- void H5Location::p_reference(void* ref, const char* name, hid_t space_id, H5R_type_t ref_type) const { herr_t ret_value = H5Rcreate(ref, getId(), name, ref_type, space_id); if (ret_value < 0) { throw ReferenceException(inMemFunc("reference"), "H5Rcreate failed"); } }
//-------------------------------------------------------------------------- // Function: H5Object::getNumAttrs ///\brief Returns the number of attributes attached to this HDF5 object. ///\return Number of attributes ///\exception H5::AttributeIException // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- int H5Object::getNumAttrs() const { H5O_info_t oinfo; /* Object info */ if(H5Oget_info2(getId(), &oinfo, H5O_INFO_NUM_ATTRS) < 0) throw AttributeIException(inMemFunc("getNumAttrs"), "H5Oget_info failed"); else return(static_cast<int>(oinfo.num_attrs)); }
//-------------------------------------------------------------------------- // Function: H5Location::getRefObjType ///\brief Retrieves the type of object that an object reference points to. ///\param ref - IN: Reference to query ///\param ref_type - IN: Type of reference to query, valid values are: /// \li \c H5R_OBJECT - Reference is an object reference. /// \li \c H5R_DATASET_REGION - Reference is a dataset region reference. ///\return An object type, which can be one of the following: /// \li \c H5O_TYPE_UNKNOWN - Unknown object type (-1) /// \li \c H5O_TYPE_GROUP - Object is a group /// \li \c H5O_TYPE_DATASET - Object is a dataset /// \li \c H5O_TYPE_NAMED_DATATYPE - Object is a named datatype /// \li \c H5O_TYPE_NTYPES - Number of different object types ///\exception H5::ReferenceException // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- H5O_type_t H5Location::getRefObjType(void *ref, H5R_type_t ref_type) const { try { return(p_get_ref_obj_type(ref, ref_type)); } catch (ReferenceException E) { throw ReferenceException(inMemFunc("getRefObjType"), E.getDetailMsg()); } }
//-------------------------------------------------------------------------- // Function: H5Location::reference ///\brief This is an overloaded function, provided for your convenience. /// It differs from the above function in that it does not take /// a DataSpace object and the reference type must be specified. ///\param ref - IN: Reference pointer ///\param name - IN: Name of the object to be referenced ///\param ref_type - IN: Type of reference to query, valid values are: /// \li \c H5R_OBJECT - Reference is an object reference (default) /// \li \c H5R_DATASET_REGION - Reference is a dataset region ///\exception H5::ReferenceException ///\note This method is more suitable for an object reference. // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- void H5Location::reference(void* ref, const char* name, H5R_type_t ref_type) const { try { p_reference(ref, name, -1, ref_type); } catch (ReferenceException E) { throw ReferenceException(inMemFunc("reference"), E.getDetailMsg()); } }
//-------------------------------------------------------------------------- // Function: H5Location::reference ///\brief This is an overloaded member function, provided for convenience. /// It differs from the above function in that it takes an /// \c H5std_string for \a name. ///\param ref - IN: Reference pointer ///\param name - IN: Name of the object to be referenced ///\param dataspace - IN: Dataspace with selection ///\param ref_type - IN: Type of reference to query, valid values are: /// \li \c H5R_OBJECT - Reference is an object reference. /// \li \c H5R_DATASET_REGION - Reference is a dataset region /// reference. (default) ///\exception H5::ReferenceException ///\note This method is more suitable for a dataset region reference. // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- void H5Location::reference(void* ref, const H5std_string& name, const DataSpace& dataspace, H5R_type_t ref_type) const { try { p_reference(ref, name.c_str(), dataspace.getId(), ref_type); } catch (ReferenceException E) { throw ReferenceException(inMemFunc("reference"), E.getDetailMsg()); } }
//-------------------------------------------------------------------------- // Function: H5Location::getFileName ///\brief Gets the name of the file, in which this HDF5 object belongs. ///\return File name ///\exception H5::LocationException // Programmer Binh-Minh Ribler - Jul, 2004 //-------------------------------------------------------------------------- H5std_string H5Location::getFileName() const { try { return(p_get_file_name()); } catch (LocationException E) { throw FileIException(inMemFunc("getFileName"), E.getDetailMsg()); } }
//-------------------------------------------------------------------------- // Function: H5Object::getNumAttrs ///\brief Returns the number of attributes attached to this HDF5 object. ///\return Number of attributes ///\exception H5::AttributeIException // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- int H5Object::getNumAttrs() const { H5O_info_t oinfo; /* Object info */ if(H5Oget_info(getId(), &oinfo) < 0) throw AttributeIException(inMemFunc("getNumAttrs"), "H5Oget_info failed"); else return( (int)oinfo.num_attrs ); }
//-------------------------------------------------------------------------- // Function: H5Object::getFileName ///\brief Gets the name of the file, in which this HDF5 object belongs. ///\return File name ///\exception H5::IdComponentException // Programmer Binh-Minh Ribler - Jul, 2004 //-------------------------------------------------------------------------- H5std_string H5Object::getFileName() const { try { return(p_get_file_name()); } catch (IdComponentException E) { throw FileIException(inMemFunc("getFileName"), E.getDetailMsg()); } }
//-------------------------------------------------------------------------- // Function: H5Location::p_get_obj_type (protected) // Purpose Retrieves the type of object that an object reference points to. // Parameters // ref - IN: Reference to query // ref_type - IN: Type of reference to query // Return An object type, which can be one of the following: // H5G_UNKNOWN \tFailure occurs (-1) // H5G_GROUP \tObject is a group. // H5G_DATASET \tObject is a dataset. // H5G_TYPE Object \tis a named datatype. // H5G_LINK \tObject is a symbolic link. // H5G_UDLINK \tObject is a user-defined link. // Exception H5::ReferenceException // Programmer Binh-Minh Ribler - May, 2004 //-------------------------------------------------------------------------- H5G_obj_t H5Location::p_get_obj_type(void *ref, H5R_type_t ref_type) const { H5G_obj_t obj_type = H5Rget_obj_type1(getId(), ref_type, ref); if (obj_type == H5G_UNKNOWN) { throw ReferenceException(inMemFunc("getObjType"), "H5Rget_obj_type1 failed"); } return(obj_type); }
//-------------------------------------------------------------------------- // Function: H5Location::p_dereference (protected) // Purpose Dereference a ref into an hdf5 object. // Parameters // loc_id - IN: An hdf5 identifier specifying the location of the // referenced object // ref - IN: Reference pointer // ref_type - IN: Reference type // Exception H5::ReferenceException // Programmer Binh-Minh Ribler - Oct, 2006 // Modification // May 2008 - BMR // Moved from IdComponent. //-------------------------------------------------------------------------- hid_t H5Location::p_dereference(hid_t loc_id, const void* ref, H5R_type_t ref_type, const char* from_func) { hid_t temp_id = H5Rdereference(loc_id, ref_type, ref); if (temp_id < 0) { throw ReferenceException(inMemFunc(from_func), "H5Rdereference failed"); } return(temp_id); }
//-------------------------------------------------------------------------- // Function: IdComponent::getCounter ///\brief Returns the reference counter for a given id. ///\return Reference count // Programmer Binh-Minh Ribler - May 2005 //-------------------------------------------------------------------------- int IdComponent::getCounter(const hid_t obj_id) const { int counter = 0; if (p_valid_id(obj_id)) { counter = H5Iget_ref(obj_id); if (counter < 0) throw IdComponentException(inMemFunc("incRefCount"), "getting object ref count failed - negative"); } return (counter); }
//-------------------------------------------------------------------------- // Function: H5Object::attrExists ///\brief Checks whether the named attribute exists at this location. ///\param name - IN: Name of the attribute to be queried ///\exception H5::AttributeIException // Programmer Binh-Minh Ribler - 2013 //-------------------------------------------------------------------------- bool H5Object::attrExists(const char* name) const { // Call C routine H5Aexists to determine whether an attribute exists // at this location, which could be specified by a file, group, dataset, // or named datatype. herr_t ret_value = H5Aexists(getId(), name); if (ret_value > 0) return true; else if(ret_value == 0) return false; else // Raise exception when H5Aexists returns a negative value throw AttributeIException(inMemFunc("attrExists"), "H5Aexists failed"); }
//-------------------------------------------------------------------------- // Function: H5Object::openAttribute ///\brief Opens an attribute given its name. ///\param name - IN: Name of the attribute ///\return Attribute instance ///\exception H5::AttributeIException // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- Attribute H5Object::openAttribute( const char* name ) const { hid_t attr_id = H5Aopen(getId(), name, H5P_DEFAULT); if( attr_id > 0 ) { Attribute attr( attr_id ); return( attr ); } else { throw AttributeIException(inMemFunc("openAttribute"), "H5Aopen failed"); } }
//-------------------------------------------------------------------------- // Function: H5Object::openAttribute ///\brief Opens an attribute given its index. ///\param idx - IN: Index of the attribute, a 0-based, non-negative integer ///\return Attribute instance ///\exception H5::AttributeIException // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- Attribute H5Object::openAttribute( const unsigned int idx ) const { hid_t attr_id = H5Aopen_by_idx(getId(), ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)idx, H5P_DEFAULT, H5P_DEFAULT); if( attr_id > 0 ) { Attribute attr( attr_id ); return( attr ); } else { throw AttributeIException(inMemFunc("openAttribute"), "H5Aopen_by_idx failed"); } }
//-------------------------------------------------------------------------- // Function: H5Location::openAttribute ///\brief Opens an attribute given its index. ///\param idx - IN: Index of the attribute, a 0-based, non-negative integer ///\return Attribute instance ///\exception H5::AttributeIException // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- Attribute H5Location::openAttribute( const unsigned int idx ) const { hid_t attr_id = H5Aopen_by_idx(getId(), ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, static_cast<hsize_t>(idx), H5P_DEFAULT, H5P_DEFAULT); if( attr_id > 0 ) { Attribute attr; f_Attribute_setId(&attr, attr_id); return(attr); } else { throw AttributeIException(inMemFunc("openAttribute"), "H5Aopen_by_idx failed"); } }
//-------------------------------------------------------------------------- // Function: IdComponent::operator= ///\brief Assignment operator. ///\param rhs - IN: Reference to the existing object ///\return Reference to IdComponent instance ///\exception H5::IdComponentException when attempt to close the HDF5 /// object fails // Description // First, close the current valid id of this object. Then // copy the id from rhs to this object, and increment the // reference counter of the id to indicate that another object // is referencing that id. // Modification // 2010/5/9 - BMR // Removed close() and incRefCount() because setId/p_setId takes // care of close() and setId takes care incRefCount(). // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- IdComponent& IdComponent::operator=(const IdComponent& rhs) { if (this != &rhs) { // handling references to this id try { setId(rhs.getId()); // Note: a = b, so there are two objects with the same hdf5 id // that's why incRefCount is needed, and it is called by setId } catch (Exception& close_error) { throw FileIException(inMemFunc("operator="), close_error.getDetailMsg()); } } return *this; }
//-------------------------------------------------------------------------- // Function: H5Object::createAttribute ///\brief Creates an attribute for a group, dataset, or named datatype. ///\param name - IN: Name of the attribute ///\param data_type - IN: Datatype for the attribute ///\param data_space - IN: Dataspace for the attribute - only simple /// dataspaces are allowed at this time ///\param create_plist - IN: Creation property list - default to /// PropList::DEFAULT ///\return Attribute instance ///\exception H5::AttributeIException ///\par Description /// The attribute name specified in \a name must be unique. /// Attempting to create an attribute with the same name as an /// existing attribute will raise an exception, leaving the /// pre-existing attribute intact. To overwrite an existing /// attribute with a new attribute of the same name, first /// delete the existing one with \c H5Object::removeAttr, then /// recreate it with this function. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- Attribute H5Object::createAttribute( const char* name, const DataType& data_type, const DataSpace& data_space, const PropList& create_plist ) const { hid_t type_id = data_type.getId(); hid_t space_id = data_space.getId(); hid_t plist_id = create_plist.getId(); hid_t attr_id = H5Acreate2(getId(), name, type_id, space_id, plist_id, H5P_DEFAULT ); // If the attribute id is valid, create and return the Attribute object if( attr_id > 0 ) { Attribute attr( attr_id ); return( attr ); } else throw AttributeIException(inMemFunc("createAttribute"), "H5Acreate2 failed"); }
//-------------------------------------------------------------------------- // Function: H5Location::p_dereference (protected) // Purpose Dereference a ref into an hdf5 object. // Parameters // loc_id - IN: An hdf5 identifier specifying the location of the // referenced object // ref - IN: Reference pointer // ref_type - IN: Reference type // plist - IN: Property list - default to PropList::DEFAULT // from_func - IN: Name of the calling function // Exception H5::ReferenceException // Programmer Binh-Minh Ribler - Oct, 2006 // Modification // May 2008 - BMR // Moved from IdComponent. //-------------------------------------------------------------------------- hid_t H5Location::p_dereference(hid_t loc_id, const void* ref, H5R_type_t ref_type, const PropList& plist, const char* from_func) { hid_t plist_id; if (p_valid_id(plist.getId())) plist_id = plist.getId(); else plist_id = H5P_DEFAULT; hid_t temp_id = H5Rdereference2(loc_id, plist_id, ref_type, ref); if (temp_id < 0) { throw ReferenceException(inMemFunc(from_func), "H5Rdereference failed"); } return(temp_id); }
//-------------------------------------------------------------------------- // Function: IdComponent::operator= ///\brief Assignment operator. ///\param rhs - IN: Reference to the existing object ///\return Reference to IdComponent instance ///\exception H5::IdComponentException when attempt to close the HDF5 /// object fails // Description // First, close the current valid id of this object. Then // copy the id from rhs to this object, and increment the // reference counter of the id to indicate that another object // is referencing that id. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- IdComponent& IdComponent::operator=( const IdComponent& rhs ) { if (this != &rhs) { // handling references to this id try { close(); } catch (Exception close_error) { throw FileIException(inMemFunc("operator="), close_error.getDetailMsg()); } // copy the data members from the rhs object p_setId(rhs.getId()); incRefCount(getId()); // a = b, so there are two objects with the same // hdf5 id } return *this; }
//-------------------------------------------------------------------------- // Function: H5Object::objVersion ///\brief Returns the header version of this HDF5 object. ///\return Object version, which can have the following values: /// \li \c H5O_VERSION_1 /// \li \c H5O_VERSION_2 ///\exception H5::ObjHeaderIException /// Exception will be thrown when: /// - an error returned by the C API /// - version number is not one of the valid values above // Programmer Binh-Minh Ribler - December, 2016 //-------------------------------------------------------------------------- unsigned H5Object::objVersion() const { H5O_info_t objinfo; unsigned version = 0; // Use C API to get information of the object herr_t ret_value = H5Oget_info2(getId(), &objinfo, H5O_INFO_HDR); // Throw exception if C API returns failure if (ret_value < 0) throw Exception(inMemFunc("objVersion"), "H5Oget_info failed"); // Return a valid version or throw an exception for invalid value else { version = objinfo.hdr.version; if (version != H5O_VERSION_1 && version != H5O_VERSION_2) throw ObjHeaderIException("objVersion", "Invalid version for object"); } return(version); }
//-------------------------------------------------------------------------- // Function: H5Object::renameAttr ///\brief Renames the named attribute from this object. ///\param oldname - IN: Name of the attribute to be renamed ///\param newname - IN: New name ame of the attribute ///\exception H5::AttributeIException // Programmer Binh-Minh Ribler - Mar, 2005 //-------------------------------------------------------------------------- void H5Object::renameAttr(const char* oldname, const char* newname) const { herr_t ret_value = H5Arename(getId(), oldname, newname); if (ret_value < 0) throw AttributeIException(inMemFunc("renameAttr"), "H5Arename failed"); }
//-------------------------------------------------------------------------- // Function: H5Object::removeAttr ///\brief Removes the named attribute from this object. ///\param name - IN: Name of the attribute to be removed ///\exception H5::AttributeIException // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- void H5Object::removeAttr( const char* name ) const { herr_t ret_value = H5Adelete(getId(), name); if( ret_value < 0 ) throw AttributeIException(inMemFunc("removeAttr"), "H5Adelete failed"); }
//-------------------------------------------------------------------------- // Function: H5Location::setComment ///\brief This is an overloaded member function, provided for convenience. /// It differs from the above function in that it doesn't take /// an object name. // Programmer Binh-Minh Ribler - Sep 2013 // Modification //-------------------------------------------------------------------------- void H5Location::setComment(const char* comment) const { herr_t ret_value = H5Oset_comment_by_name(getId(), ".", comment, H5P_DEFAULT); if( ret_value < 0 ) throw LocationException(inMemFunc("setComment"), "H5Oset_comment_by_name failed"); }
//-------------------------------------------------------------------------- // Function: H5Location::removeComment ///\brief Removes the comment from an object specified by its name. ///\param name - IN: Name of the object ///\exception H5::LocationException // Programmer Binh-Minh Ribler - May 2005 (moved from CommonFG, Sep 2013) // 2007: QAK modified to use H5O APIs; however the first parameter is // no longer just file or group, this function should be moved // to another class to accommodate attribute, dataset, and named // datatype. - BMR //-------------------------------------------------------------------------- void H5Location::removeComment(const char* name) const { herr_t ret_value = H5Oset_comment_by_name(getId(), name, NULL, H5P_DEFAULT); if( ret_value < 0 ) throw LocationException(inMemFunc("removeComment"), "H5Oset_comment_by_name failed"); }
//-------------------------------------------------------------------------- // Function: IdComponent::incRefCount ///\brief Increment reference counter for a given id. // Programmer Binh-Minh Ribler - May 2005 //-------------------------------------------------------------------------- void IdComponent::incRefCount(const hid_t obj_id) const { if (p_valid_id(obj_id)) if (H5Iinc_ref(obj_id) < 0) throw IdComponentException(inMemFunc("incRefCount"), "incrementing object ref count failed"); }