diff options
author | Binh-Minh Ribler <bmribler@hdfgroup.org> | 2008-07-02 14:56:42 (GMT) |
---|---|---|
committer | Binh-Minh Ribler <bmribler@hdfgroup.org> | 2008-07-02 14:56:42 (GMT) |
commit | e5df9bb33aa8b88bd0df21479942c1156ffd52aa (patch) | |
tree | 48c4dc2f0e08512addab592c0306fa57ded0898a /c++/src/H5Object.cpp | |
parent | d9533d055c7f306e66e5f972068c77c939d6fc16 (diff) | |
download | hdf5-e5df9bb33aa8b88bd0df21479942c1156ffd52aa.zip hdf5-e5df9bb33aa8b88bd0df21479942c1156ffd52aa.tar.gz hdf5-e5df9bb33aa8b88bd0df21479942c1156ffd52aa.tar.bz2 |
[svn-r15309] Purpose: Fixed bugs
Description:
The class hierarchy was revised to address the problem reported in
bugzilla #1068. Classes AbstractDS and Attribute are moved out of
H5Object. Class Attribute now multiply inherits from IdComponent and
AbstractDs and class DataSet from H5Object and AbstractDs.
In addition, data member IdComponent::id was moved into subclasses:
Attribute, DataSet, DataSpace, DataType, H5File, Group, and PropList.
Platforms tested:
SunOS 5.10 (linew)
Linux 2.6 (kagiso)
FreeBSD (duty)
Diffstat (limited to 'c++/src/H5Object.cpp')
-rw-r--r-- | c++/src/H5Object.cpp | 194 |
1 files changed, 185 insertions, 9 deletions
diff --git a/c++/src/H5Object.cpp b/c++/src/H5Object.cpp index c027f51..b2bdefb 100644 --- a/c++/src/H5Object.cpp +++ b/c++/src/H5Object.cpp @@ -21,10 +21,15 @@ #include "H5PropList.h" #include "H5Object.h" #include "H5DcreatProp.h" +#include "H5DxferProp.h" +#include "H5FaccProp.h" +#include "H5FcreatProp.h" #include "H5CommonFG.h" #include "H5DataType.h" #include "H5DataSpace.h" #include "H5AbstractDs.h" +#include "H5File.h" +#include "H5DataSet.h" #include "H5Attribute.h" #ifndef H5_NO_NAMESPACE @@ -103,7 +108,7 @@ Attribute H5Object::createAttribute( const char* name, const DataType& data_type 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(id, name, type_id, space_id, plist_id, H5P_DEFAULT ); + 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 ) @@ -137,7 +142,7 @@ Attribute H5Object::createAttribute( const H5std_string& name, const DataType& d //-------------------------------------------------------------------------- Attribute H5Object::openAttribute( const char* name ) const { - hid_t attr_id = H5Aopen( id, name, H5P_DEFAULT ); + hid_t attr_id = H5Aopen(getId(), name, H5P_DEFAULT); if( attr_id > 0 ) { Attribute attr( attr_id ); @@ -171,7 +176,8 @@ Attribute H5Object::openAttribute( const H5std_string& name ) const //-------------------------------------------------------------------------- Attribute H5Object::openAttribute( const unsigned int idx ) const { - hid_t attr_id = H5Aopen_by_idx(id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)idx, H5P_DEFAULT, H5P_DEFAULT); + 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 ); @@ -209,7 +215,8 @@ int H5Object::iterateAttrs( attr_operator_t user_op, unsigned *_idx, void *op_da // call the C library routine H5Aiterate2 to iterate the attributes hsize_t idx = (hsize_t)*_idx; - int ret_value = H5Aiterate2(id, H5_INDEX_NAME, H5_ITER_INC, &idx, userAttrOpWrpr, (void *) userData); + int ret_value = H5Aiterate2(getId(), H5_INDEX_NAME, H5_ITER_INC, &idx, + userAttrOpWrpr, (void *) userData); // release memory delete userData; @@ -235,7 +242,7 @@ int H5Object::getNumAttrs() const { H5O_info_t oinfo; /* Object info */ - if(H5Oget_info(id, &oinfo) < 0) + if(H5Oget_info(getId(), &oinfo) < 0) throw AttributeIException(inMemFunc("getNumAttrs"), "H5Oget_info failed"); else return( (int)oinfo.num_attrs ); @@ -250,7 +257,7 @@ int H5Object::getNumAttrs() const //-------------------------------------------------------------------------- void H5Object::removeAttr( const char* name ) const { - herr_t ret_value = H5Adelete(id, name); + herr_t ret_value = H5Adelete(getId(), name); if( ret_value < 0 ) throw AttributeIException(inMemFunc("removeAttr"), "H5Adelete failed"); } @@ -277,7 +284,7 @@ void H5Object::removeAttr( const H5std_string& name ) const //-------------------------------------------------------------------------- void H5Object::renameAttr(const char* oldname, const char* newname) const { - herr_t ret_value = H5Arename(id, oldname, newname); + herr_t ret_value = H5Arename(getId(), oldname, newname); if (ret_value < 0) throw AttributeIException(inMemFunc("renameAttr"), "H5Arename failed"); } @@ -306,9 +313,9 @@ void H5Object::renameAttr(const H5std_string& oldname, const H5std_string& newna /// This object is used to identify the file to be flushed. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -void H5Object::flush(H5F_scope_t scope ) const +void H5Object::flush(H5F_scope_t scope) const { - herr_t ret_value = H5Fflush( id, scope ); + herr_t ret_value = H5Fflush(getId(), scope); if( ret_value < 0 ) { throw FileIException(inMemFunc("flush"), "H5Fflush failed"); @@ -333,6 +340,175 @@ H5std_string H5Object::getFileName() const } //-------------------------------------------------------------------------- +// Function: H5Object::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::IdComponentException +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +void H5Object::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 IdComponentException("", "H5Rcreate failed"); + } +} + +//-------------------------------------------------------------------------- +// Function: H5Object::reference +///\brief Creates a reference to an HDF5 object or a dataset region. +///\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 \tReference is an object reference. +/// \li \c H5R_DATASET_REGION \tReference is a dataset region +/// reference. - this is the default +///\exception H5::IdComponentException +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +void H5Object::reference(void* ref, const char* name, const DataSpace& dataspace, H5R_type_t ref_type) const +{ + try { + p_reference(ref, name, dataspace.getId(), ref_type); + } + catch (IdComponentException E) { + throw IdComponentException("H5Object::reference", E.getDetailMsg()); + } +} + +//-------------------------------------------------------------------------- +// Function: H5Object::reference +///\brief This is an overloaded function, provided for your convenience. +/// It differs from the above function in that it only creates +/// a reference to an HDF5 object, not to a dataset region. +///\param ref - IN: Reference pointer +///\param name - IN: Name of the object to be referenced - \c char pointer +///\exception H5::IdComponentException +///\par Description +// This function passes H5R_OBJECT and -1 to the protected +// function for it to pass to the C API H5Rcreate +// to create a reference to the named object. +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +void H5Object::reference(void* ref, const char* name) const +{ + try { + p_reference(ref, name, -1, H5R_OBJECT); + } + catch (IdComponentException E) { + throw IdComponentException("H5Object::reference", E.getDetailMsg()); + } +} + +//-------------------------------------------------------------------------- +// Function: H5Object::reference +///\brief This is an overloaded function, provided for your convenience. +/// It differs from the above function in that it takes an +/// \c std::string for the object's name. +///\param ref - IN: Reference pointer +///\param name - IN: Name of the object to be referenced - \c std::string +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +void H5Object::reference(void* ref, const H5std_string& name) const +{ + reference(ref, name.c_str()); +} + +//-------------------------------------------------------------------------- +// Function: H5Object::dereference +// Purpose Dereference a ref into a DataSet object. +// Parameters +// ref - IN: Reference pointer +// Exception H5::IdComponentException +// Programmer Binh-Minh Ribler - Oct, 2006 +// Modification +// May 2008 - BMR +// Moved from IdComponent into H5File and H5Object +//-------------------------------------------------------------------------- +void H5Object::dereference(H5File& h5file, void* ref) +{ + hid_t temp_id; + try { + temp_id = h5file.p_dereference(ref); + } + catch (ReferenceException ref_err) { + throw (inMemFunc("dereference"), ref_err.getDetailMsg()); + } + + // No failure, set id to the object + setId(temp_id); +} + +void H5Object::dereference(H5Object& obj, void* ref) +{ + hid_t temp_id; + try { + temp_id = obj.p_dereference(ref); + } + catch (ReferenceException ref_err) { + throw (inMemFunc("dereference"), ref_err.getDetailMsg()); + } + + // No failure, set id to the object + setId(temp_id); +} + +#ifndef H5_NO_DEPRECATED_SYMBOLS +//-------------------------------------------------------------------------- +// Function: H5Object::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_LINK Object is a symbolic link. +// H5G_GROUP Object is a group. +// H5G_DATASET Object is a dataset. +// H5G_TYPE Object is a named datatype +// Exception H5::IdComponentException +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +H5G_obj_t H5Object::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 IdComponentException("", "H5Rget_obj_type failed"); + } + return(obj_type); +} +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + + +//-------------------------------------------------------------------------- +// Function: H5Object::p_get_region (protected) +// Purpose Retrieves a dataspace with the region pointed to selected. +// Parameters +// ref_type - IN: Type of reference to get region of - default +// to H5R_DATASET_REGION +// ref - IN: Reference to get region of +// Return Dataspace id +// Exception H5::IdComponentException +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +hid_t H5Object::p_get_region(void *ref, H5R_type_t ref_type) const +{ + hid_t space_id = H5Rget_region(getId(), ref_type, ref); + if (space_id < 0) + { + throw IdComponentException("", "H5Rget_region failed"); + } + return(space_id); +} + + +//-------------------------------------------------------------------------- // Function: H5Object destructor ///\brief Noop destructor. // Programmer Binh-Minh Ribler - 2000 |