From b346cb0599da3b46f892365ad2ebd1e55ea173f3 Mon Sep 17 00:00:00 2001 From: Binh-Minh Ribler Date: Mon, 7 Mar 2016 10:42:30 -0500 Subject: [svn-r29306] Purpose: Add function Description: Added member function ArrayType::operator= because ArrayType has pointer data members. Platforms tested: Linux/32 2.6 (jam) Linux/64 (platypus) Darwin (osx1010test) --- c++/src/H5AbstractDs.cpp | 2 +- c++/src/H5AbstractDs.h | 2 +- c++/src/H5ArrayType.cpp | 38 +++++++++++++++ c++/src/H5ArrayType.h | 3 ++ c++/src/H5Attribute.cpp | 6 +-- c++/src/H5CommonFG.cpp | 2 +- c++/src/H5DataSet.cpp | 6 +-- c++/src/H5DataSpace.cpp | 6 +-- c++/src/H5DataType.cpp | 6 +-- c++/src/H5Exception.cpp | 6 +-- c++/src/H5Group.cpp | 6 +-- c++/src/H5PropList.cpp | 3 +- c++/test/tarray.cpp | 120 ++++++++++++++++++++++++++++++++++++++++------- release_docs/RELEASE.txt | 7 +++ 14 files changed, 165 insertions(+), 48 deletions(-) diff --git a/c++/src/H5AbstractDs.cpp b/c++/src/H5AbstractDs.cpp index 4e9a4d5..8d88c53 100644 --- a/c++/src/H5AbstractDs.cpp +++ b/c++/src/H5AbstractDs.cpp @@ -49,7 +49,7 @@ AbstractDs::AbstractDs(){} // removal does not raise any problems in 1.10, it will be removed from 1.8 in // subsequent releases. //-------------------------------------------------------------------------- -AbstractDs::AbstractDs(const hid_t ds_id){} +// Mar 2016 -BMR, AbstractDs::AbstractDs(const hid_t ds_id){} //-------------------------------------------------------------------------- // Function: AbstractDs::getTypeClass diff --git a/c++/src/H5AbstractDs.h b/c++/src/H5AbstractDs.h index ee2e45e..6975d6f 100644 --- a/c++/src/H5AbstractDs.h +++ b/c++/src/H5AbstractDs.h @@ -85,7 +85,7 @@ class H5_DLLCPP AbstractDs { // other will be removed from 1.10 release, and then from 1.8 if its // removal does not raise any problems in two 1.10 releases. - AbstractDs(const hid_t h5_id); + // Mar 2016 -BMR, AbstractDs(const hid_t h5_id); // Copy constructor // AbstractDs( const AbstractDs& original ); diff --git a/c++/src/H5ArrayType.cpp b/c++/src/H5ArrayType.cpp index 0f09631..5792467 100644 --- a/c++/src/H5ArrayType.cpp +++ b/c++/src/H5ArrayType.cpp @@ -93,6 +93,44 @@ ArrayType::ArrayType(const DataType& base_type, int ndims, const hsize_t* dims) } //-------------------------------------------------------------------------- +// Function: ArrayType::operator= +///\brief Assignment operator +///\param rhs - IN: Reference to the existing array datatype +///\return Reference to ArrayType instance +///\exception H5::DataTypeIException +/// std::bad_alloc +// Description +// Closes the id on the lhs object first with setId, then copies +// each data member from the rhs object. +// Programmer Binh-Minh Ribler - Mar 2016 +// Modification +//-------------------------------------------------------------------------- +ArrayType& ArrayType::operator=(const ArrayType& rhs) +{ + if (this != &rhs) + { + // handling references to this id + try { + setId(rhs.id); + // 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 DataTypeIException(inMemFunc("operator="), close_error.getDetailMsg()); + } + + // Copy the rank of the rhs array + rank = rhs.rank; + + // Allocate space then copy the dimensions from the rhs array + dimensions = new hsize_t[rank]; + for (int i = 0; i < rank; i++) + dimensions[i] = rhs.dimensions[i]; + } + return(*this); +} + +//-------------------------------------------------------------------------- // Function: ArrayType::setArrayInfo ///\brief Retrieves the rank and dimensions from the array datatype /// and store the info in this ArrayType object. diff --git a/c++/src/H5ArrayType.h b/c++/src/H5ArrayType.h index c0f4b38..ddbb5e2 100644 --- a/c++/src/H5ArrayType.h +++ b/c++/src/H5ArrayType.h @@ -31,6 +31,9 @@ class H5_DLLCPP ArrayType : public DataType { // specified base type. ArrayType(const DataType& base_type, int ndims, const hsize_t* dims); + // Assignment operator + ArrayType& operator=(const ArrayType& rhs); + // Stores the rank and dimensions in memory. void setArrayInfo(); diff --git a/c++/src/H5Attribute.cpp b/c++/src/H5Attribute.cpp index ea8c5bb..a6a8fee 100644 --- a/c++/src/H5Attribute.cpp +++ b/c++/src/H5Attribute.cpp @@ -60,9 +60,8 @@ Attribute::Attribute() : AbstractDs(), IdComponent(), id(H5I_INVALID_HID) {} ///\param original - IN: Original Attribute object to copy // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -Attribute::Attribute(const Attribute& original) : AbstractDs(), IdComponent() +Attribute::Attribute(const Attribute& original) : AbstractDs(), IdComponent(), id(original.id) { - id = original.getId(); incRefCount(); // increment number of references to this id } @@ -74,9 +73,8 @@ Attribute::Attribute(const Attribute& original) : AbstractDs(), IdComponent() ///\exception H5::AttributeIException // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -Attribute::Attribute(const hid_t existing_id) : AbstractDs(), IdComponent() +Attribute::Attribute(const hid_t existing_id) : AbstractDs(), IdComponent(), id(existing_id) { - id = existing_id; incRefCount(); // increment number of references to this id } diff --git a/c++/src/H5CommonFG.cpp b/c++/src/H5CommonFG.cpp index c88f6c1..8bb31c4 100644 --- a/c++/src/H5CommonFG.cpp +++ b/c++/src/H5CommonFG.cpp @@ -328,7 +328,7 @@ void CommonFG::unlink( const H5std_string& name ) const /// Exercise care in moving groups as it is possible to render /// data in a file inaccessible with Group::move. Please refer /// to the Group Interface in the HDF5 User's Guide for details at: -/// http://www.hdfgroup.org/HDF5/doc/UG/UG_frame09Groups.html +/// https://www.hdfgroup.org/HDF5/doc/UG/HDF5_Users_Guide-Responsive%20HTML5/index.html#t=HDF5_Users_Guide%2FGroups%2FHDF5_Groups.htm // Programmer Binh-Minh Ribler - 2000 // Modification // 2007: QAK modified to use H5L APIs - BMR diff --git a/c++/src/H5DataSet.cpp b/c++/src/H5DataSet.cpp index 059da85..3747967 100644 --- a/c++/src/H5DataSet.cpp +++ b/c++/src/H5DataSet.cpp @@ -67,9 +67,8 @@ DataSet::DataSet() : H5Object(), AbstractDs(), id(H5I_INVALID_HID) {} // when one of those objects is deleted, the id will be closed if // the reference counter is only 1. //-------------------------------------------------------------------------- -DataSet::DataSet(const hid_t existing_id) : H5Object(), AbstractDs() +DataSet::DataSet(const hid_t existing_id) : H5Object(), AbstractDs(), id(existing_id) { - id = existing_id; incRefCount(); // increment number of references to this id } @@ -79,9 +78,8 @@ DataSet::DataSet(const hid_t existing_id) : H5Object(), AbstractDs() ///\param original - IN: DataSet instance to copy // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -DataSet::DataSet(const DataSet& original) : H5Object(), AbstractDs() +DataSet::DataSet(const DataSet& original) : H5Object(), AbstractDs(), id(original.id) { - id = original.getId(); incRefCount(); // increment number of references to this id } diff --git a/c++/src/H5DataSpace.cpp b/c++/src/H5DataSpace.cpp index 311180f..42ac4c7 100644 --- a/c++/src/H5DataSpace.cpp +++ b/c++/src/H5DataSpace.cpp @@ -132,9 +132,8 @@ DataSpace::DataSpace( int rank, const hsize_t * dims, const hsize_t * maxdims) : ///\exception H5::DataSpaceIException // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -DataSpace::DataSpace(const hid_t existing_id) : IdComponent() +DataSpace::DataSpace(const hid_t existing_id) : IdComponent(), id(existing_id) { - id = existing_id; incRefCount(); // increment number of references to this id } @@ -144,9 +143,8 @@ DataSpace::DataSpace(const hid_t existing_id) : IdComponent() ///\param original - IN: DataSpace object to copy // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -DataSpace::DataSpace(const DataSpace& original) : IdComponent() +DataSpace::DataSpace(const DataSpace& original) : IdComponent(), id(original.id) { - id = original.getId(); incRefCount(); // increment number of references to this id } diff --git a/c++/src/H5DataType.cpp b/c++/src/H5DataType.cpp index 1bbabe3..54df7e0 100644 --- a/c++/src/H5DataType.cpp +++ b/c++/src/H5DataType.cpp @@ -69,9 +69,8 @@ DataType::DataType() : H5Object(), id(H5I_INVALID_HID) {} // Removed second argument, "predefined", after changing to the // new ref counting mechanism that relies on C's ref counting. //-------------------------------------------------------------------------- -DataType::DataType(const hid_t existing_id) : H5Object() +DataType::DataType(const hid_t existing_id) : H5Object(), id(existing_id) { - id = existing_id; incRefCount(); // increment number of references to this id } @@ -136,9 +135,8 @@ DataType::DataType(const Attribute& attr, const void* ref, H5R_type_t ref_type, ///\brief Copy constructor: makes a copy of the original DataType object. // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -DataType::DataType(const DataType& original) : H5Object() +DataType::DataType(const DataType& original) : H5Object(), id(original.id) { - id = original.getId(); incRefCount(); // increment number of references to this id } diff --git a/c++/src/H5Exception.cpp b/c++/src/H5Exception.cpp index 1ca059b..270b232 100644 --- a/c++/src/H5Exception.cpp +++ b/c++/src/H5Exception.cpp @@ -47,11 +47,7 @@ Exception::Exception(const H5std_string& func, const H5std_string& message) : de ///\param orig - IN: Exception instance to copy // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -Exception::Exception( const Exception& orig ) -{ - detail_message = orig.detail_message; - func_name = orig.func_name; -} +Exception::Exception( const Exception& orig ) : detail_message(orig.detail_message), func_name(orig.func_name) {} //-------------------------------------------------------------------------- // Function: Exception::getMajorString diff --git a/c++/src/H5Group.cpp b/c++/src/H5Group.cpp index 0823d0e..f9aabcb 100644 --- a/c++/src/H5Group.cpp +++ b/c++/src/H5Group.cpp @@ -60,9 +60,8 @@ Group::Group() : H5Object(), CommonFG(), id(H5I_INVALID_HID) {} ///\param original - IN: Original group to copy // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -Group::Group(const Group& original) : H5Object(), CommonFG() +Group::Group(const Group& original) : H5Object(), CommonFG(), id(original.id) { - id = original.getId(); incRefCount(); // increment number of references to this id } @@ -83,9 +82,8 @@ hid_t Group::getLocId() const ///\param existing_id - IN: Id of an existing group // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -Group::Group(const hid_t existing_id) : H5Object(), CommonFG() +Group::Group(const hid_t existing_id) : H5Object(), CommonFG(), id(existing_id) { - id = existing_id; incRefCount(); // increment number of references to this id } diff --git a/c++/src/H5PropList.cpp b/c++/src/H5PropList.cpp index 807aa0a..81bb023 100644 --- a/c++/src/H5PropList.cpp +++ b/c++/src/H5PropList.cpp @@ -104,9 +104,8 @@ PropList::PropList() : IdComponent(), id(H5P_DEFAULT) {} ///\param original - IN: The original property list to copy // Programmer Binh-Minh Ribler - 2000 //-------------------------------------------------------------------------- -PropList::PropList(const PropList& original) : IdComponent() +PropList::PropList(const PropList& original) : IdComponent(), id(original.id) { - id = original.getId(); incRefCount(); // increment number of references to this id } diff --git a/c++/test/tarray.cpp b/c++/test/tarray.cpp index 69b4438..e73cfd0 100644 --- a/c++/test/tarray.cpp +++ b/c++/test/tarray.cpp @@ -42,9 +42,9 @@ #include "h5cpputil.h" // C++ utilility header file const H5std_string FILENAME("tarray.h5"); -const hsize_t SPACE1_RANK = 1; +const int SPACE1_RANK = 1; const hsize_t SPACE1_DIM1 = 4; -const hsize_t ARRAY1_RANK = 1; +const int ARRAY1_RANK = 1; const hsize_t ARRAY1_DIM1 = 4; typedef enum flt_t { @@ -83,15 +83,21 @@ static void test_array_compound_array() hsize_t sdims1[] = {SPACE1_DIM1}; hsize_t tdims1[] = {ARRAY1_DIM1}; int nmemb; // Number of compound members - int ii, jj, kk; // counting variables + int ii; // counting variables + hsize_t idxi, idxj, idxk; // dimension indicing variables H5T_class_t mclass; // Datatype class for field // Initialize array data to write - for (ii =0; ii < SPACE1_DIM1; ii++) - for (jj = 0; jj < ARRAY1_DIM1; jj++) { - wdata[ii][jj].i = ii * 10 + jj; - for(kk = 0; kk < ARRAY1_DIM1; kk++) - wdata[ii][jj].f[kk]=(float)(ii * 10.0F + jj * 2.5F + kk); + for (idxi =0; idxi < SPACE1_DIM1; idxi++) + for (idxj = 0; idxj < ARRAY1_DIM1; idxj++) { + wdata[idxi][idxj].i = idxi * 10 + idxj; + for(idxk = 0; idxk < ARRAY1_DIM1; idxk++) + { + float temp = idxi * 10.0 + idxj * 2.5 + idxk; + //wdata[idxi][idxj].f[idxk]=(float)(idxi * 10.0F + idxj * 2.5F + idxk); + wdata[idxi][idxj].f[idxk] = temp; + //wdata[idxi][idxj].f[idxk] = static_cast(temp); + } } // end for try { @@ -130,6 +136,7 @@ static void test_array_compound_array() // Create a dataset DataSet dataset = file1.createDataSet("Dataset1", arrtype, space); + dataset = file1.openDataSet("Dataset1"); // Write dataset to disk dataset.write(wdata, arrtype); @@ -153,7 +160,8 @@ static void test_array_compound_array() // Verify that it is an array of compounds DataType dstype = dataset.getDataType(); mclass = dstype.getClass(); - verify_val(mclass, H5T_ARRAY, "f2_type.getClass", __LINE__, __FILE__); + verify_val(mclass==H5T_ARRAY, true, "f2_type.getClass", __LINE__, __FILE__); + dstype.close(); // Get the array datatype to check @@ -170,7 +178,7 @@ static void test_array_compound_array() // Check the array dimensions for (ii =0; ii