diff options
author | Binh-Minh Ribler <bmribler@hdfgroup.org> | 2003-06-07 04:02:11 (GMT) |
---|---|---|
committer | Binh-Minh Ribler <bmribler@hdfgroup.org> | 2003-06-07 04:02:11 (GMT) |
commit | 5d1b56cb8170363220e21c8c8c38d2bddef27939 (patch) | |
tree | d1450c0b8b2b1a7628371342250372071ba754ae /c++ | |
parent | 4e4ab0d320597f3aa9a45170d92e8d578cc203db (diff) | |
download | hdf5-5d1b56cb8170363220e21c8c8c38d2bddef27939.zip hdf5-5d1b56cb8170363220e21c8c8c38d2bddef27939.tar.gz hdf5-5d1b56cb8170363220e21c8c8c38d2bddef27939.tar.bz2 |
[svn-r6990] Purpose:
Bug fix and minor code enhancement
Description:
Missing methods to read/write C++ String for an attribute and
a dataset.
Solution:
Added overloaded functions read and write to H5::Attribute and
H5::DataSet.
Also, added another constructor StrType so the need to separately
set the length of the string type can be eliminated. It's minor
but convenient.
Made some minor changes to make error messages more readable.
Platforms:
SunOS 5.7 (arabica)
Linux 2.4 (eirene)
IRIX 6.5.11 (modi4)
HPUX 11.00 (kelgia)
Diffstat (limited to 'c++')
-rw-r--r-- | c++/src/H5Attribute.cpp | 31 | ||||
-rw-r--r-- | c++/src/H5Attribute.h | 2 | ||||
-rw-r--r-- | c++/src/H5DataSet.cpp | 26 | ||||
-rw-r--r-- | c++/src/H5DataSet.h | 4 | ||||
-rw-r--r-- | c++/src/H5DataSpace.cpp | 8 | ||||
-rw-r--r-- | c++/src/H5DataType.cpp | 2 | ||||
-rw-r--r-- | c++/src/H5Exception.cpp | 10 | ||||
-rw-r--r-- | c++/src/H5Exception.h | 7 | ||||
-rw-r--r-- | c++/src/H5File.cpp | 2 | ||||
-rw-r--r-- | c++/src/H5Group.cpp | 2 | ||||
-rw-r--r-- | c++/src/H5StrType.cpp | 11 | ||||
-rw-r--r-- | c++/src/H5StrType.h | 3 |
12 files changed, 83 insertions, 25 deletions
diff --git a/c++/src/H5Attribute.cpp b/c++/src/H5Attribute.cpp index 09e53d3..5c9dfb3 100644 --- a/c++/src/H5Attribute.cpp +++ b/c++/src/H5Attribute.cpp @@ -52,6 +52,33 @@ void Attribute::write( const DataType& mem_type, const void *buf ) const } } +void Attribute::write( const DataType& mem_type, const string& strg ) const +{ + // Convert string to C-string + const char* strg_C; + strg_C = strg.c_str(); // strg_C refers to the contents of strg as a C-str + + herr_t ret_value = H5Awrite( id, mem_type.getId(), strg_C ); + if( ret_value < 0 ) + { + throw AttributeIException("Attribute::write", "H5Awrite failed"); + } +} + +// Reads data from this attribute. +void Attribute::read( const DataType& mem_type, string& strg ) const +{ + size_t size = mem_type.getSize(); + char* strg_C = new char[size+1]; // temporary C-string for C API + herr_t ret_value = H5Aread( id, mem_type.getId(), strg_C ); + if( ret_value < 0 ) + { + throw AttributeIException("Attribute::read", "H5Aread failed"); + } + strg = strg_C; + delete strg_C; +} + // Reads data from this attribute. void Attribute::read( const DataType& mem_type, void *buf ) const { @@ -109,7 +136,7 @@ ssize_t Attribute::getName( size_t buf_size, string& attr_name ) const throw AttributeIException("Attribute::getName", "H5Aget_name failed"); } // otherwise, convert the C string attribute name and return - attr_name = string( name_C ); + attr_name = name_C; delete name_C; return( name_size ); } @@ -145,7 +172,7 @@ Attribute::~Attribute() try { resetIdComponent( this ); } catch (Exception close_error) { // thrown by p_close - cerr << "Attribute::~Attribute" << close_error.getDetailMsg() << endl; + cerr << "Attribute::~Attribute - " << close_error.getDetailMsg() << endl; } } diff --git a/c++/src/H5Attribute.h b/c++/src/H5Attribute.h index 2725242..7053f8c 100644 --- a/c++/src/H5Attribute.h +++ b/c++/src/H5Attribute.h @@ -24,9 +24,11 @@ class H5_DLLCPP Attribute : public AbstractDs { public: // Writes data to this attribute. void write(const DataType& mem_type, const void *buf ) const; + void write(const DataType& mem_type, const string& strg ) const; // Reads data from this attribute. void read( const DataType& mem_type, void *buf ) const; + void read( const DataType& mem_type, string& strg ) const; // Gets a copy of the dataspace for this attribute. virtual DataSpace getSpace() const; diff --git a/c++/src/H5DataSet.cpp b/c++/src/H5DataSet.cpp index 5eb640c..84bed5c 100644 --- a/c++/src/H5DataSet.cpp +++ b/c++/src/H5DataSet.cpp @@ -156,6 +156,20 @@ void DataSet::read( void* buf, const DataType& mem_type, const DataSpace& mem_sp } } +void DataSet::read( string& strg, const DataType& mem_type, const DataSpace& mem_space, const DataSpace& file_space, const DSetMemXferPropList& xfer_plist ) const +{ + // Allocate C character string for reading + size_t size = mem_type.getSize(); + char* strg_C = new char[size+1]; // temporary C-string for C API + + // Use the overloaded member to read + read(strg_C, mem_type, mem_space, file_space, xfer_plist); + + // Get the String and clean up + strg = strg_C; + delete strg_C; +} + // Writes raw data from an application buffer buffer to a dataset, // converting from memory datatype and dataspace to file datatype // and dataspace. @@ -174,6 +188,16 @@ void DataSet::write( const void* buf, const DataType& mem_type, const DataSpace& } } +void DataSet::write( const string& strg, const DataType& mem_type, const DataSpace& mem_space, const DataSpace& file_space, const DSetMemXferPropList& xfer_plist ) const +{ + // Convert string to C-string + const char* strg_C; + strg_C = strg.c_str(); // strg_C refers to the contents of strg as a C-str + + // Use the overloaded member + write(strg_C, mem_type, mem_space, file_space, xfer_plist); +} + // Iterates over all selected elements in a dataspace. int DataSet::iterateElems( void* buf, const DataType& type, const DataSpace& space, H5D_operator_t op, void* op_data ) { @@ -262,7 +286,7 @@ DataSet::~DataSet() try { resetIdComponent( this ); } catch (Exception close_error) { // thrown by p_close - cerr << "DataSet::~DataSet" << close_error.getDetailMsg() << endl; + cerr << "DataSet::~DataSet - " << close_error.getDetailMsg() << endl; } } diff --git a/c++/src/H5DataSet.h b/c++/src/H5DataSet.h index c66a21c..9f01eb4 100644 --- a/c++/src/H5DataSet.h +++ b/c++/src/H5DataSet.h @@ -33,7 +33,7 @@ class H5_DLLCPP DataSet : public AbstractDs { // Gets the storage size of this dataset. hsize_t getStorageSize() const; - // - C version not yet implemented?? + // not yet implemented?? hsize_t getVlenBufSize( DataType& type, DataSpace& space ) const; void vlenReclaim( DataType& type, DataSpace& space, DSetMemXferPropList& xfer_plist, void* buf ) const; @@ -41,11 +41,13 @@ class H5_DLLCPP DataSet : public AbstractDs { // The memory and file dataspaces and the transferring property list // can be defaults. void read( void* buf, const DataType& mem_type, const DataSpace& mem_space = DataSpace::ALL, const DataSpace& file_space = DataSpace::ALL, const DSetMemXferPropList& xfer_plist = DSetMemXferPropList::DEFAULT ) const; + void read( string& buf, const DataType& mem_type, const DataSpace& mem_space = DataSpace::ALL, const DataSpace& file_space = DataSpace::ALL, const DSetMemXferPropList& xfer_plist = DSetMemXferPropList::DEFAULT ) const; // Writes the buffered data to this dataset. // The memory and file dataspaces and the transferring property list // can be defaults. void write( const void* buf, const DataType& mem_type, const DataSpace& mem_space = DataSpace::ALL, const DataSpace& file_space = DataSpace::ALL, const DSetMemXferPropList& xfer_plist = DSetMemXferPropList::DEFAULT ) const; + void write( const string& buf, const DataType& mem_type, const DataSpace& mem_space = DataSpace::ALL, const DataSpace& file_space = DataSpace::ALL, const DSetMemXferPropList& xfer_plist = DSetMemXferPropList::DEFAULT ) const; // Iterates the selected elements in the specified dataspace - not implemented in C++ style yet int iterateElems( void* buf, const DataType& type, const DataSpace& space, H5D_operator_t op, void* op_data = NULL ); diff --git a/c++/src/H5DataSpace.cpp b/c++/src/H5DataSpace.cpp index c6c64a8..5921274 100644 --- a/c++/src/H5DataSpace.cpp +++ b/c++/src/H5DataSpace.cpp @@ -57,7 +57,11 @@ DataSpace::DataSpace( int rank, const hsize_t * dims, const hsize_t * maxdims) : /* Constructor that takes an existing dataspace id Description: - Uses an HDF5 id to create a DataSpace identifier instance. This id can be either an existing dataspace id or a default dataspace id. Design note: in the case of default dataspace, the identifier still has reference counter; the p_close function will take care of not to call H5Sclose on the default id. + Uses an HDF5 id to create a DataSpace identifier instance. + This id can be either an existing dataspace id or a default + dataspace id. Design note: in the case of default dataspace, + the identifier still has reference counter; the p_close function + will take care of not to call H5Sclose on the default id. */ DataSpace::DataSpace( const hid_t space_id ) : IdComponent( space_id ) {} @@ -361,7 +365,7 @@ DataSpace::~DataSpace() try { resetIdComponent( this ); } catch (Exception close_error) { // thrown by p_close - cerr << "DataSpace::~DataSpace" << close_error.getDetailMsg() << endl; + cerr << "DataSpace::~DataSpace - " << close_error.getDetailMsg() << endl; } } diff --git a/c++/src/H5DataType.cpp b/c++/src/H5DataType.cpp index aba1949..290ebb7 100644 --- a/c++/src/H5DataType.cpp +++ b/c++/src/H5DataType.cpp @@ -357,7 +357,7 @@ DataType::~DataType() try { resetIdComponent( this ); } catch (Exception close_error) { // thrown by p_close - cerr << "DataType::~DataType" << close_error.getDetailMsg() << endl; + cerr << "DataType::~DataType - " << close_error.getDetailMsg() << endl; } } diff --git a/c++/src/H5Exception.cpp b/c++/src/H5Exception.cpp index d493662..807d703 100644 --- a/c++/src/H5Exception.cpp +++ b/c++/src/H5Exception.cpp @@ -18,7 +18,7 @@ #ifndef H5_NO_NAMESPACE namespace H5 { #ifndef H5_NO_STD - using namespace std; + using namespace std; #endif // H5_NO_STD #endif @@ -206,14 +206,6 @@ IdComponentException::IdComponentException(const string& func_name, const string IdComponentException::IdComponentException(const char* func_name, const char* message) : Exception(func_name, message) {} IdComponentException::~IdComponentException() {} -// The following are from Java API but not done here: -// AtomException, BtreeException, DataFiltersException, -// ExternalFileListException, FunctionEntryExitException, -// HeapException, InternalErrorException, LowLevelIOException, -// MetaDataCacheException, ResourceUnavailableException, -// SymbolTableException, ObjectHeaderException, FunctionArgumentException, -// DataStorageException - #ifndef H5_NO_NAMESPACE } // end namespace #endif diff --git a/c++/src/H5Exception.h b/c++/src/H5Exception.h index a77400e..5f159e8 100644 --- a/c++/src/H5Exception.h +++ b/c++/src/H5Exception.h @@ -167,13 +167,6 @@ class H5_DLLCPP IdComponentException : public Exception { virtual ~IdComponentException(); }; -// The following are from Java API but not done here: -// AtomException, BtreeException, DataFiltersException, -// ExternalFilelistException, FunctionEntryExitException, -// HeapException, InternalErrorException, LowLevelIOException, -// MetaDataCacheException, ResourceUnavailableException, -// SymbolTableException, ObjectHeaderException, FunctionArgumentException, -// DataStorageException #ifndef H5_NO_NAMESPACE } #endif diff --git a/c++/src/H5File.cpp b/c++/src/H5File.cpp index a314693..75c9e55 100644 --- a/c++/src/H5File.cpp +++ b/c++/src/H5File.cpp @@ -203,7 +203,7 @@ H5File::~H5File() try { resetIdComponent( this ); } catch (Exception close_error) { // thrown by p_close - cerr << "H5File::~H5File" << close_error.getDetailMsg() << endl; + cerr << "H5File::~H5File - " << close_error.getDetailMsg() << endl; } } diff --git a/c++/src/H5Group.cpp b/c++/src/H5Group.cpp index f805778..279c620 100644 --- a/c++/src/H5Group.cpp +++ b/c++/src/H5Group.cpp @@ -156,7 +156,7 @@ Group::~Group() try { resetIdComponent( this ); } catch (Exception close_error) { // thrown by p_close - cerr << "Group::~Group" << close_error.getDetailMsg() << endl; + cerr << "Group::~Group - " << close_error.getDetailMsg() << endl; } } diff --git a/c++/src/H5StrType.cpp b/c++/src/H5StrType.cpp index 5b25be1..683fc0b 100644 --- a/c++/src/H5StrType.cpp +++ b/c++/src/H5StrType.cpp @@ -43,6 +43,17 @@ StrType::StrType( const PredType& pred_type ) : AtomType() copy( pred_type ); } +// Creates a string type with a specified length - 1st argument could +// have been skipped, but this constructor will collide with the one +// that takes an existing id below +StrType::StrType( const PredType& pred_type, const size_t size ) : AtomType() +{ + // use DataType::copy to make a copy of the string predefined type + // then set its length + copy(pred_type); + setSize(size); +} + // Creates a string datatype using an existing id StrType::StrType( const hid_t existing_id ) : AtomType( existing_id ) {} diff --git a/c++/src/H5StrType.h b/c++/src/H5StrType.h index 0ddc748..8d6070c 100644 --- a/c++/src/H5StrType.h +++ b/c++/src/H5StrType.h @@ -28,6 +28,9 @@ class H5_DLLCPP StrType : public AtomType { // Creates a string type using a predefined type StrType( const PredType& pred_type ); + // Creates a string type with specified length + StrType( const PredType& pred_type, const size_t size ); + // Creates a string datatype using an existing id StrType( const hid_t existing_id ); |