From 3677f54877df7df7cdaeff16cee8efce5b9bc98f Mon Sep 17 00:00:00 2001 From: Binh-Minh Ribler Date: Sun, 26 Oct 2008 21:30:06 -0500 Subject: [svn-r15959] Description: Added missing wrappers for H5Rdereference. Also, for these wrappers, improved exception handlings to report specific overloaded functions, where failure occurs. Will do the same for more functions later... Platforms tested: Linux 2.6 (kagiso) SunOS 5.10 (linew) FreeBSD (duty) --- c++/src/H5Attribute.cpp | 21 ----------- c++/src/H5Attribute.h | 4 -- c++/src/H5DataSet.cpp | 70 ++++++++++++++++++++++++++++++----- c++/src/H5DataSet.h | 5 ++- c++/src/H5DataType.cpp | 70 +++++++++++++++++++++++++++++------ c++/src/H5DataType.h | 5 ++- c++/src/H5Group.cpp | 57 ++++++++++++++++++++++++---- c++/src/H5Group.h | 5 ++- c++/src/H5IdComponent.cpp | 18 --------- c++/src/H5IdComponent.h | 3 -- c++/src/H5Object.cpp | 94 ++++++++++++++++++++++++++++++++++++++--------- c++/src/H5Object.h | 11 ++++-- 12 files changed, 263 insertions(+), 100 deletions(-) diff --git a/c++/src/H5Attribute.cpp b/c++/src/H5Attribute.cpp index fd08744..c90076c 100644 --- a/c++/src/H5Attribute.cpp +++ b/c++/src/H5Attribute.cpp @@ -323,27 +323,6 @@ hsize_t Attribute::getStorageSize() const } //-------------------------------------------------------------------------- -// Function: Attribute::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, H5Object, and Attribute -//-------------------------------------------------------------------------- -Attribute::Attribute(H5Object& obj, void* ref) : AbstractDs(), IdComponent() -{ - id = obj.p_dereference(ref); -} - -Attribute::Attribute(H5File& h5file, void* ref) : AbstractDs(), IdComponent() -{ - id = h5file.p_dereference(ref); -} - -//-------------------------------------------------------------------------- // Function: Attribute::getId // Purpose: Get the id of this attribute // Description: diff --git a/c++/src/H5Attribute.h b/c++/src/H5Attribute.h index 7d7ca8d..9cf91ba 100644 --- a/c++/src/H5Attribute.h +++ b/c++/src/H5Attribute.h @@ -48,10 +48,6 @@ class H5_DLLCPP Attribute : public AbstractDs, public IdComponent { void write(const DataType& mem_type, const void *buf ) const; void write(const DataType& mem_type, const H5std_string& strg ) const; - // Creates an attribute by way of dereference. - Attribute(H5Object& obj, void* ref); - Attribute(H5File& file, void* ref); - // Returns this class name virtual H5std_string fromClass () const { return("Attribute"); } diff --git a/c++/src/H5DataSet.cpp b/c++/src/H5DataSet.cpp index 6d7502a..494d3ea 100644 --- a/c++/src/H5DataSet.cpp +++ b/c++/src/H5DataSet.cpp @@ -35,6 +35,7 @@ #include "H5DataSpace.h" #include "H5AbstractDs.h" #include "H5File.h" +#include "H5Attribute.h" #include "H5DataSet.h" #ifndef H5_NO_NAMESPACE @@ -77,24 +78,75 @@ DataSet::DataSet(const DataSet& original) : AbstractDs(original), H5Object(origi //-------------------------------------------------------------------------- // Function: DataSet overload constructor - dereference -///\brief Given a reference to some object, returns that dataset -/// obj - IN: Dataset reference object is in or location of -/// object that the dataset is located within. +///\brief Given a reference, ref, to an hdf5 dataset, creates a +/// DataSet object +///\param obj - IN: Dataset reference object is in or location of +/// object that the dataset is located within. ///\param ref - IN: Reference pointer +///\param ref_type - IN: Reference type - default to H5R_OBJECT ///\exception H5::DataSetIException -///\parDescription -/// \c obj can be DataSet, Group, H5File, or named DataType, that +///\par Description +/// \c obj can be DataSet, Group, H5File, or named DataType, that /// is a datatype that has been named by DataType::commit. // Programmer Binh-Minh Ribler - Oct, 2006 +// Modification +// Jul, 2008 +// Added for application convenience. +//-------------------------------------------------------------------------- +DataSet::DataSet(H5Object& obj, const void* ref, H5R_type_t ref_type) : AbstractDs(), H5Object() +{ + try { + id = p_dereference(obj.getId(), ref, ref_type); + } catch (ReferenceException deref_error) { + throw ReferenceException("DataSet constructor - located by object", + deref_error.getDetailMsg()); + } +} + +//-------------------------------------------------------------------------- +// Function: DataSet overload constructor - dereference +///\brief Given a reference, ref, to an hdf5 dataset, creates a +/// DataSet object +///\param h5file - IN: Location referenced object is in +///\param ref - IN: Reference pointer +///\param ref_type - IN: Reference type - default to H5R_OBJECT +///\exception H5::DataSetIException +// Programmer Binh-Minh Ribler - Oct, 2006 +// Modification +// Jul, 2008 +// Added for application convenience. //-------------------------------------------------------------------------- -DataSet::DataSet(H5Object& obj, void* ref) : AbstractDs(), H5Object() +DataSet::DataSet(H5File& h5file, const void* ref, H5R_type_t ref_type) : AbstractDs(), H5Object() { - id = obj.p_dereference(ref); + try { + id = p_dereference(h5file.getId(), ref, ref_type); + } catch (ReferenceException deref_error) { + throw ReferenceException("DataSet constructor - located by HDF5 file", + deref_error.getDetailMsg()); + } } -DataSet::DataSet(H5File& h5file, void* ref) : AbstractDs(), H5Object() +//-------------------------------------------------------------------------- +// Function: DataSet overload constructor - dereference +///\brief Given a reference, ref, to an hdf5 dataset, creates a +/// DataSet object +///\param attr - IN: Specifying location where the referenced object is in +///\param ref - IN: Reference pointer +///\param ref_type - IN: Reference type - default to H5R_OBJECT +///\exception H5::ReferenceException +// Programmer Binh-Minh Ribler - Oct, 2006 +// Modification +// Jul, 2008 +// Added for application convenience. +//-------------------------------------------------------------------------- +DataSet::DataSet(Attribute& attr, const void* ref, H5R_type_t ref_type) : AbstractDs(), H5Object() { - id = h5file.p_dereference(ref); + try { + id = p_dereference(attr.getId(), ref, ref_type); + } catch (ReferenceException deref_error) { + throw ReferenceException("DataSet constructor - located by attribute", + deref_error.getDetailMsg()); + } } //-------------------------------------------------------------------------- diff --git a/c++/src/H5DataSet.h b/c++/src/H5DataSet.h index f5d13d0..f26d775 100644 --- a/c++/src/H5DataSet.h +++ b/c++/src/H5DataSet.h @@ -85,8 +85,9 @@ class H5_DLLCPP DataSet : public H5Object, public AbstractDs { virtual H5std_string fromClass () const { return("DataSet"); } // Creates a dataset by way of dereference. - DataSet(H5Object& obj, void* ref); - DataSet(H5File& file, void* ref); + DataSet(H5Object& obj, const void* ref, H5R_type_t ref_type = H5R_OBJECT); + DataSet(H5File& h5file, const void* ref, H5R_type_t ref_type = H5R_OBJECT); + DataSet(Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT); // Default constructor. DataSet(); diff --git a/c++/src/H5DataType.cpp b/c++/src/H5DataType.cpp index 2b03ffc..9170dc2 100644 --- a/c++/src/H5DataType.cpp +++ b/c++/src/H5DataType.cpp @@ -38,6 +38,7 @@ #include "H5AbstractDs.h" #include "H5DataSet.h" #include "H5File.h" +#include "H5Attribute.h" #ifndef H5_NO_NAMESPACE namespace H5 { @@ -87,27 +88,74 @@ DataType::DataType( const H5T_class_t type_class, size_t size ) : H5Object() //-------------------------------------------------------------------------- // Function: DataType overload constructor - dereference -///\brief Given a reference to some object, returns that datatype -///\param obj - IN: Location reference object is in +///\brief Given a reference, ref, to an hdf5 group, creates a +/// DataType object +///\param obj - IN: Specifying location referenced object is in ///\param ref - IN: Reference pointer -///\parDescription -/// \c obj can be DataSet, Group, H5File, or named DataType, that +///\param ref_type - IN: Reference type - default to H5R_OBJECT +///\exception H5::ReferenceException +///\par Description +/// \c obj can be DataSet, Group, or named DataType, that /// is a datatype that has been named by DataType::commit. // Programmer Binh-Minh Ribler - Oct, 2006 +// Modification +// Jul, 2008 +// Added for application convenience. //-------------------------------------------------------------------------- - /* DataType::DataType(IdComponent& obj, void* ref) : H5Object() +DataType::DataType(H5Object& obj, const void* ref, H5R_type_t ref_type) : H5Object() { - H5Object::dereference(obj, ref); + try { + id = p_dereference(obj.getId(), ref, ref_type); + } catch (ReferenceException deref_error) { + throw ReferenceException("DataType constructor - located by an H5Object", + deref_error.getDetailMsg()); + } } - */ -DataType::DataType(H5Object& obj, void* ref) : H5Object() + +//-------------------------------------------------------------------------- +// Function: DataType overload constructor - dereference +///\brief Given a reference, ref, to an hdf5 group, creates a +/// DataType object +///\param h5file - IN: Location referenced object is in +///\param ref - IN: Reference pointer +///\param ref_type - IN: Reference type - default to H5R_OBJECT +///\exception H5::ReferenceException +// Programmer Binh-Minh Ribler - Oct, 2006 +// Modification +// Jul, 2008 +// Added for application convenience. +//-------------------------------------------------------------------------- +DataType::DataType(H5File& h5file, const void* ref, H5R_type_t ref_type) : H5Object() { - id = obj.p_dereference(ref); + try { + id = p_dereference(h5file.getId(), ref, ref_type); + } catch (ReferenceException deref_error) { + throw ReferenceException("DataType constructor - located by an H5File", + deref_error.getDetailMsg()); + } } -DataType::DataType(H5File& file, void* ref) : H5Object() +//-------------------------------------------------------------------------- +// Function: DataType overload constructor - dereference +///\brief Given a reference, ref, to an hdf5 group, creates a +/// DataType object +///\param attr - IN: Specifying location where the referenced object is in +///\param ref - IN: Reference pointer +///\param ref_type - IN: Reference type - default to H5R_OBJECT +///\exception H5::ReferenceException +// Programmer Binh-Minh Ribler - Oct, 2006 +// Modification +// Jul, 2008 +// Added for application convenience. +//-------------------------------------------------------------------------- +DataType::DataType(Attribute& attr, const void* ref, H5R_type_t ref_type) : H5Object() { - id = file.p_dereference(ref); + try { + id = p_dereference(attr.getId(), ref, ref_type); + } catch (ReferenceException deref_error) { + throw ReferenceException("DataType constructor - located by an Attribute", + deref_error.getDetailMsg()); + } } //-------------------------------------------------------------------------- diff --git a/c++/src/H5DataType.h b/c++/src/H5DataType.h index 4e7ca03..48aeaf8 100644 --- a/c++/src/H5DataType.h +++ b/c++/src/H5DataType.h @@ -30,8 +30,9 @@ class H5_DLLCPP DataType : public H5Object { DataType( const DataType& original ); // Creates a datatype by way of dereference. - DataType(H5Object& obj, void* ref); - DataType(H5File& file, void* ref); + DataType(H5Object& obj, const void* ref, H5R_type_t ref_type = H5R_OBJECT); + DataType(H5File& h5file, const void* ref, H5R_type_t ref_type = H5R_OBJECT); + DataType(Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT); // Closes this datatype. virtual void close(); diff --git a/c++/src/H5Group.cpp b/c++/src/H5Group.cpp index 6ae7cf7..02d9338 100644 --- a/c++/src/H5Group.cpp +++ b/c++/src/H5Group.cpp @@ -33,6 +33,7 @@ #include "H5DataSpace.h" #include "H5DataSet.h" #include "H5CommonFG.h" +#include "H5Attribute.h" #include "H5Group.h" #include "H5File.h" #include "H5Alltypes.h" @@ -88,22 +89,62 @@ Group::Group(const hid_t existing_id) : H5Object() //-------------------------------------------------------------------------- // Function: Group overload constructor - dereference -///\brief Given a reference to some object, returns that group -/// obj - IN: Location reference object is in +///\brief Given a reference, ref, to an hdf5 group, creates a Group object +///\param obj - IN: Specifying location referenced object is in ///\param ref - IN: Reference pointer -///\parDescription -/// \c obj can be DataSet, Group, H5File, or named DataType, that +///\param ref_type - IN: Reference type - default to H5R_OBJECT +///\exception H5::ReferenceException +///\par Description +/// \c obj can be DataSet, Group, or named DataType, that /// is a datatype that has been named by DataType::commit. // Programmer Binh-Minh Ribler - Oct, 2006 //-------------------------------------------------------------------------- -Group::Group(H5Object& obj, void* ref) : H5Object() +Group::Group(H5Object& obj, const void* ref, H5R_type_t ref_type) : H5Object() { - id = obj.p_dereference(ref); + try { + id = p_dereference(obj.getId(), ref, ref_type); + } catch (ReferenceException deref_error) { + throw ReferenceException("Group constructor - located by an H5Object", + deref_error.getDetailMsg()); + } } -Group::Group(H5File& h5file, void* ref) : H5Object() +//-------------------------------------------------------------------------- +// Function: Group overload constructor - dereference +///\brief Given a reference, ref, to an hdf5 group, creates a Group object +///\param h5file - IN: Location referenced object is in +///\param ref - IN: Reference pointer +///\param ref_type - IN: Reference type - default to H5R_OBJECT +///\exception H5::ReferenceException +// Programmer Binh-Minh Ribler - Oct, 2006 +//-------------------------------------------------------------------------- +Group::Group(H5File& h5file, const void* ref, H5R_type_t ref_type) : H5Object() { - id = h5file.p_dereference(ref); + try { + id = p_dereference(h5file.getId(), ref, ref_type); + } catch (ReferenceException deref_error) { + throw ReferenceException("Group constructor - located by an H5File", + deref_error.getDetailMsg()); + } +} + +//-------------------------------------------------------------------------- +// Function: Group overload constructor - dereference +///\brief Given a reference, ref, to an hdf5 group, creates a Group object +///\param attr - IN: Specifying location where the referenced object is in +///\param ref - IN: Reference pointer +///\param ref_type - IN: Reference type - default to H5R_OBJECT +///\exception H5::ReferenceException +// Programmer Binh-Minh Ribler - Oct, 2006 +//-------------------------------------------------------------------------- +Group::Group(Attribute& attr, const void* ref, H5R_type_t ref_type) : H5Object() +{ + try { + id = p_dereference(attr.getId(), ref, ref_type); + } catch (ReferenceException deref_error) { + throw ReferenceException("Group constructor - located by an Attribute", + deref_error.getDetailMsg()); + } } #ifndef H5_NO_DEPRECATED_SYMBOLS diff --git a/c++/src/H5Group.h b/c++/src/H5Group.h index d296b84..9978cf0 100644 --- a/c++/src/H5Group.h +++ b/c++/src/H5Group.h @@ -44,8 +44,9 @@ class H5_DLLCPP Group : public H5Object, public CommonFG { virtual hid_t getLocId() const; // Creates a group by way of dereference. - Group(H5Object& obj, void* ref); - Group(H5File& obj, void* ref); + Group(H5Object& obj, const void* ref, H5R_type_t ref_type = H5R_OBJECT); + Group(H5File& h5file, const void* ref, H5R_type_t ref_type = H5R_OBJECT); + Group(Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT); // default constructor Group(); diff --git a/c++/src/H5IdComponent.cpp b/c++/src/H5IdComponent.cpp index 747a479..ef01105 100644 --- a/c++/src/H5IdComponent.cpp +++ b/c++/src/H5IdComponent.cpp @@ -299,24 +299,6 @@ H5std_string IdComponent::p_get_file_name() const return(file_name); } -//-------------------------------------------------------------------------- -// Function: H5Object::p_dereference (protected) -// Purpose Opens the HDF5 object referenced. -// Parameters -// ref - IN: Reference pointer -// Exception H5::IdComponentException -// Programmer Binh-Minh Ribler - Oct, 2006 -//-------------------------------------------------------------------------- -hid_t IdComponent::p_dereference(void* ref) -{ - hid_t temp_id = H5Rdereference(getId(), H5R_OBJECT, ref); - if (temp_id < 0) - { - throw ReferenceException("", "H5Rdereference failed"); - } - return(temp_id); -} - // // Local functions used in this class // diff --git a/c++/src/H5IdComponent.h b/c++/src/H5IdComponent.h index 7f573a1..b217c10 100644 --- a/c++/src/H5IdComponent.h +++ b/c++/src/H5IdComponent.h @@ -44,9 +44,6 @@ class H5_DLLCPP IdComponent { // Assignment operator. IdComponent& operator=( const IdComponent& rhs ); - // Opens the HDF5 object referenced. - hid_t p_dereference(void* ref); - // Gets the identifier of this object. virtual hid_t getId () const = 0; diff --git a/c++/src/H5Object.cpp b/c++/src/H5Object.cpp index dbfe6f2..2d32014 100644 --- a/c++/src/H5Object.cpp +++ b/c++/src/H5Object.cpp @@ -420,41 +420,101 @@ void H5Object::reference(void* ref, const H5std_string& name) const } //-------------------------------------------------------------------------- -// Function: H5Object::dereference -// Purpose Dereference a ref into a DataSet object. +// Function: H5Object::p_dereference (protected) +// Purpose Dereference a ref into an hdf5 object. // Parameters -// ref - IN: Reference pointer -// Exception H5::IdComponentException -// Programmer Binh-Minh Ribler - Oct, 2006 +// 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 into H5File and H5Object +// Moved from IdComponent. //-------------------------------------------------------------------------- -void H5Object::dereference(H5File& h5file, void* ref) +hid_t H5Object::p_dereference(hid_t loc_id, const void* ref, H5R_type_t ref_type) { hid_t temp_id; - try { - temp_id = h5file.p_dereference(ref); - } - catch (ReferenceException ref_err) { - throw (inMemFunc("dereference"), ref_err.getDetailMsg()); + temp_id = H5Rdereference(loc_id, ref_type, ref); + if (temp_id < 0) + { + throw ReferenceException("", "H5Rdereference failed"); } // No failure, set id to the object + return(temp_id); +} + +//-------------------------------------------------------------------------- +// Function: H5Object::dereference +///\brief Dereferences a reference into an HDF5 object, given an HDF5 object. +///\param obj - IN: Object specifying the location of the referenced object +///\param ref - IN: Reference pointer +///\param ref_type - IN: Reference type +///\exception H5::ReferenceException +// Programmer Binh-Minh Ribler - Oct, 2006 +// Modification +// May, 2008 +// Corrected missing parameters. - BMR +//-------------------------------------------------------------------------- +void H5Object::dereference(H5Object& obj, const void* ref, H5R_type_t ref_type) +{ + hid_t temp_id; + try { + temp_id = p_dereference(obj.getId(), ref, ref_type); + } + catch (ReferenceException E) { + throw ReferenceException("H5Object::dereference - located by object", E.getDetailMsg()); + } p_setId(temp_id); } -void H5Object::dereference(H5Object& obj, void* ref) +//-------------------------------------------------------------------------- +// Function: H5Object::dereference +///\brief Dereferences a reference into an HDF5 object, given an HDF5 file. +///\param h5file - IN: HDF5 file specifying the location of the referenced object +///\param ref - IN: Reference pointer +///\param ref_type - IN: Reference type +///\exception H5::ReferenceException +// Programmer Binh-Minh Ribler - Oct, 2006 +// Modification +// May, 2008 +// Corrected missing parameters. - BMR +//-------------------------------------------------------------------------- +void H5Object::dereference(H5File& h5file, const void* ref, H5R_type_t ref_type) { hid_t temp_id; try { - temp_id = obj.p_dereference(ref); + temp_id = p_dereference(h5file.getId(), ref, ref_type); } - catch (ReferenceException ref_err) { - throw (inMemFunc("dereference"), ref_err.getDetailMsg()); + catch (ReferenceException E) { + throw ReferenceException("H5Object::dereference - located by file", E.getDetailMsg()); } + p_setId(temp_id); +} - // No failure, set id to the object +//-------------------------------------------------------------------------- +// Function: H5Object::dereference +///\brief Dereferences a reference into an HDF5 object, given an attribute. +///\param attr - IN: Attribute specifying the location of the referenced object +///\param ref - IN: Reference pointer +///\param ref_type - IN: Reference type +///\exception H5::ReferenceException +// Programmer Binh-Minh Ribler - Oct, 2006 +// Modification +// May, 2008 +// Corrected missing parameters. - BMR +//-------------------------------------------------------------------------- +void H5Object::dereference(Attribute& attr, const void* ref, H5R_type_t ref_type) +{ + hid_t temp_id; + try { + temp_id = p_dereference(attr.getId(), ref, ref_type); + } + catch (ReferenceException E) { + throw ReferenceException("H5Object::dereference - located by attribute", E.getDetailMsg()); + } p_setId(temp_id); } diff --git a/c++/src/H5Object.h b/c++/src/H5Object.h index 49655a1..4ac417b 100644 --- a/c++/src/H5Object.h +++ b/c++/src/H5Object.h @@ -86,9 +86,11 @@ class H5_DLLCPP H5Object : public IdComponent { void reference(void* ref, const char* name) const; void reference(void* ref, const H5std_string& name) const; - // Open a referenced HDF5 object. - void dereference(H5File& h5file, void* ref); - void dereference(H5Object& obj, void* ref); + // Open a referenced HDF5 object whose location is specified by either + // a file, an HDF5 object, or an attribute. + void dereference(H5File& h5file, const void* ref, H5R_type_t ref_type = H5R_OBJECT); + void dereference(H5Object& obj, const void* ref, H5R_type_t ref_type = H5R_OBJECT); + void dereference(Attribute& attr, const void* ref, H5R_type_t ref_type = H5R_OBJECT); // Copy constructor: makes copy of an H5Object object. H5Object(const H5Object& original); @@ -110,6 +112,9 @@ class H5_DLLCPP H5Object : public IdComponent { // Creates a reference to an HDF5 object or a dataset region. void p_reference(void* ref, const char* name, hid_t space_id, H5R_type_t ref_type) const; + // Dereferences a ref into an hdf5 id. + hid_t p_dereference(hid_t loc_id, const void* ref, H5R_type_t ref_type); + #ifndef H5_NO_DEPRECATED_SYMBOLS // Retrieves the type of object that an object reference points to. H5G_obj_t p_get_obj_type(void *ref, H5R_type_t ref_type) const; -- cgit v0.12