diff options
Diffstat (limited to 'c++')
55 files changed, 6782 insertions, 0 deletions
diff --git a/c++/src/H5AbstractDs.C b/c++/src/H5AbstractDs.C new file mode 100644 index 0000000..5424bdb --- /dev/null +++ b/c++/src/H5AbstractDs.C @@ -0,0 +1,132 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5AbstractDs.h" +#include "H5Alltypes.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Default constructor +AbstractDs::AbstractDs() : H5Object() {} + +// Constructor that takes an id +AbstractDs::AbstractDs( const hid_t ds_id ) : H5Object( ds_id ) {} + +// Copy constructor: makes copy of the original object; simply invokes +// base-class copy constructor. +AbstractDs::AbstractDs( const AbstractDs& original ) : H5Object( original ) {} + +// Returns the class of the datatype that is used by this dataset +H5T_class_t AbstractDs::getTypeClass() const +{ + // Gets the datatype used by this dataset or attribute. + // p_getType calls either H5Dget_type or H5Aget_type depending on + // which object invokes getTypeClass + DataType datatype( p_getType()); + + // Gets the class of the datatype and validate it before returning + H5T_class_t type_class = H5Tget_class( datatype.getId()); + if( type_class != H5T_NO_CLASS ) + return( type_class ); + else + { + throw DataTypeIException(); + } +} + +// Returns the generic datatype of this abstract dataset which +// can be a dataset or an attribute. +DataType AbstractDs::getDataType() const +{ + // Gets the id of the datatype used by this dataset or attribute. + // p_getType calls either H5Dget_type or H5Aget_type depending on + // which object invokes getTypeClass + hid_t datatype_id = p_getType(); // returned value is already validated + + // Create and return the DataType object + DataType datatype( datatype_id ); + return( datatype ); +} + +// Returns the enumeration datatype of this abstract dataset which +// can be a dataset or an attribute. +EnumType AbstractDs::getEnumType() const +{ + EnumType enumtype( p_getType()); + return( enumtype ); +} + +// Returns the compound datatype of this abstract dataset which +// can be a dataset or an attribute. +CompType AbstractDs::getCompType() const +{ + CompType comptype( p_getType()); + return( comptype ); +} + +// Returns the integer datatype of this abstract dataset which +// can be a dataset or an attribute. +IntType AbstractDs::getIntType() const +{ + IntType inttype( p_getType()); + return( inttype ); +} + +// Returns the floating-point datatype of this abstract dataset which +// can be a dataset or an attribute. +FloatType AbstractDs::getFloatType() const +{ + FloatType floatype( p_getType()); + return( floatype ); +} + +// Returns the string datatype of this abstract dataset which +// can be a dataset or an attribute. +StrType AbstractDs::getStrType() const +{ + StrType strtype( p_getType()); + return( strtype ); +} + +/* This version of getDataType is older style. New style above doesn't +use overloading. Remove it when knowing for sure that the other way +is prefered +// Gets the specific datatype of this abstract dataset which can be a +// dataset or an attribute. Several overloaded getDataType's below +// are for specific sub-datatypes. +void AbstractDs::getDataType( EnumType& enumtype ) const +{ + enumtype.setId( p_getType()); +} + +void AbstractDs::getDataType( CompType& comptype ) const +{ + comptype.setId( p_getType()); +} + +void AbstractDs::getDataType( IntType& inttype ) const +{ + inttype.setId( p_getType()); +} + +void AbstractDs::getDataType( FloatType& floatype ) const +{ + floatype.setId( p_getType()); +} + +void AbstractDs::getDataType( StrType& strtype ) const +{ + strtype.setId( p_getType()); +} +end of old style of getDataType */ + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5AbstractDs.h b/c++/src/H5AbstractDs.h new file mode 100644 index 0000000..49aafa9 --- /dev/null +++ b/c++/src/H5AbstractDs.h @@ -0,0 +1,53 @@ +#ifndef _AbstractDs_H +#define _AbstractDs_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif +class AbstractDs : public H5Object { + public: + // Copy constructor + AbstractDs( const AbstractDs& original ); + + // Gets the dataspace of this abstract dataset - pure virtual + virtual DataSpace getSpace() const = 0; + + // Gets the class of the datatype that is used by this abstract + // dataset + H5T_class_t getTypeClass() const; + + // Gets a copy the datatype of this abstract dataset. Note that + // this datatype is a generic one and can only be accessed via + // generic member functions, i.e., member functions belong to + // DataType. To get specific datatype, i.e. EnumType, + // FloatType, etc..., use the specific functions instead . + DataType getDataType() const; + + // Gets a copy of the specific datatype of this abstract dataset - + // overloading for subtypes. + EnumType getEnumType() const; + CompType getCompType() const; + IntType getIntType() const; + FloatType getFloatType() const; + StrType getStrType() const; + + virtual ~AbstractDs() {}; + + protected: + // Default constructor + AbstractDs(); + + // Constructor that takes an attribute id or a dataset id. + AbstractDs( const hid_t ds_id ); + + private: + // This member function is implemented by DataSet and Attribute + virtual hid_t p_getType() const = 0; + + // This member function is implemented by DataSet and Attribute + virtual void p_close() const = 0; +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif // _AbstractDs_H diff --git a/c++/src/H5Alltypes.h b/c++/src/H5Alltypes.h new file mode 100644 index 0000000..11af047 --- /dev/null +++ b/c++/src/H5Alltypes.h @@ -0,0 +1,11 @@ +// This header file simply serves as a container to hold the +// header files of all datatypes. It simplifies the header +// file including in the code. + +#include "H5DataType.h" +#include "H5AtomType.h" +#include "H5EnumType.h" +#include "H5IntType.h" +#include "H5FloatType.h" +#include "H5StrType.h" +#include "H5CompType.h" diff --git a/c++/src/H5AtomType.C b/c++/src/H5AtomType.C new file mode 100644 index 0000000..bab1ed3 --- /dev/null +++ b/c++/src/H5AtomType.C @@ -0,0 +1,143 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5DataType.h" +#include "H5AtomType.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Default constructor +AtomType::AtomType() : DataType() {} + +// Constructor that takes an existing id +AtomType::AtomType( const hid_t existing_id ) : DataType( existing_id ) {} + +// Copy constructor: makes a copy of the original AtomType object. +AtomType::AtomType( const AtomType& original ) : DataType( original ) {} + +// Sets the total size for an atomic datatype. +void AtomType::setSize( size_t size ) const +{ + // Call C routine H5Tset_size to set the total size + herr_t ret_value = H5Tset_size( id, size ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Returns the byte order of an atomic datatype. Inheritance class??? +H5T_order_t AtomType::getOrder( string& order_string ) const +{ + // Call C routine to get the byte ordering + H5T_order_t type_order = H5Tget_order( id ); + + // return a byte order constant if successful + if( type_order == H5T_ORDER_ERROR ) + { + throw DataTypeIException(); + } + if( type_order == H5T_ORDER_LE ) + order_string = "Little endian byte ordering (0)"; + else if( type_order == H5T_ORDER_BE ) + order_string = "Big endian byte ordering (1)"; + else if( type_order == H5T_ORDER_VAX ) + order_string = "VAX mixed byte ordering (2)"; + return( type_order ); +} + +// Sets the byte ordering of an atomic datatype. Inheritance class??? +void AtomType::setOrder( H5T_order_t order ) const +{ + // Call C routine to set the byte ordering + herr_t ret_value = H5Tset_order( id, order ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Returns the precision of an atomic datatype. +size_t AtomType::getPrecision() const +{ + size_t num_signi_bits = H5Tget_precision( id ); // C routine + + // returns number of significant bits if successful + if( num_signi_bits == 0 ) + { + throw DataTypeIException(); + } + return( num_signi_bits ); +} + +// Sets the precision of an atomic datatype. +void AtomType::setPrecision( size_t precision ) const +{ + // Call C routine to set the datatype precision + herr_t ret_value = H5Tset_precision( id, precision ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Retrieves the bit offset of the first significant bit. +size_t AtomType::getOffset() const +{ + size_t offset = H5Tget_offset( id ); // C routine + + // returns a positive offset value if successful + if( offset == 0 ) + { + throw DataTypeIException(); + } + return( offset ); +} + +// Sets the bit offset of the first significant bit. +void AtomType::setOffset( size_t offset ) const +{ + // Call C routine to set the bit offset + herr_t ret_value = H5Tset_offset( id, offset ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Retrieves the padding type of the least and most-significant bit padding. +// these two are for Opaque type +//void AtomType::getPad( H5T_pad_t& lsb, H5T_pad_t& msb ) const +//{ + // Call C routine to get the padding type + //herr_t ret_value = H5Tget_pad( id, &lsb, &msb ); + //if( ret_value < 0 ) + //{ + //throw DataTypeIException(); + //} +//} + +// Sets the least and most-significant bits padding types +//void AtomType::setPad( H5T_pad_t lsb, H5T_pad_t msb ) const +//{ + // Call C routine to set the padding type + //herr_t ret_value = H5Tset_pad( id, lsb, msb ); + //if( ret_value < 0 ) + //{ + //throw DataTypeIException(); + //} +//} + +// This destructor terminates access to the datatype; it calls ~DataType +AtomType::~AtomType() {} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5AtomType.h b/c++/src/H5AtomType.h new file mode 100644 index 0000000..165cbf5 --- /dev/null +++ b/c++/src/H5AtomType.h @@ -0,0 +1,52 @@ +#ifndef _H5AtomType_H +#define _H5AtomType_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif +class AtomType : public DataType { + public: + // Copy constructor - makes copy of the original object + AtomType( const AtomType& original ); + + // Sets the total size for an atomic datatype. + void setSize( size_t size ) const; + + // Returns the byte order of an atomic datatype. + H5T_order_t getOrder( string& order_string ) const; + + // Sets the byte ordering of an atomic datatype. + void setOrder( H5T_order_t order ) const; + + // Returns the precision of an atomic datatype. + size_t getPrecision() const; + + // Sets the precision of an atomic datatype. + void setPrecision( size_t precision ) const; + + // Retrieves the bit offset of the first significant bit. + size_t getOffset() const; + + // Sets the bit offset of the first significant bit. + void setOffset( size_t offset ) const; + + // The followings will go into Opaque type when completed + // Retrieves the padding type of the least and most-significant bit padding. + // void getPad( H5T_pad_t& lsb, H5T_pad_t& msb ) const; + + // Sets the least and most-significant bits padding types + // void setPad( H5T_pad_t lsb, H5T_pad_t msb ) const; + + virtual ~AtomType(); + + protected: + // Default constructor + AtomType(); + + // Constructor that takes an existing id - for predefined type + AtomType( const hid_t existing_id ); +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5Attribute.C b/c++/src/H5Attribute.C new file mode 100644 index 0000000..b38267c --- /dev/null +++ b/c++/src/H5Attribute.C @@ -0,0 +1,122 @@ +#include <string> + +#include "H5Include.h" +#include "H5Exception.h" +#include "H5RefCounter.h" +#include "H5IdComponent.h" +#include "H5Idtemplates.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5AbstractDs.h" +#include "H5Attribute.h" +#include "H5DataType.h" +#include "H5DataSpace.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Copy constructor: makes a copy of the original object; simply invokes +// the base class copy constructor. +Attribute::Attribute( const Attribute& original ) : AbstractDs( original ) {}; + +// Creates a copy of an existing attribute using an id +Attribute::Attribute( const hid_t attr_id ) : AbstractDs( attr_id ) {} + +// Writes data to this attribute. +void Attribute::write( const DataType& mem_type, void *buf ) const +{ + herr_t ret_value = H5Awrite( id, mem_type.getId(), buf ); + if( ret_value < 0 ) + { + throw AttributeIException(); + } +} + +// Reads data from this attribute. +void Attribute::read( const DataType& mem_type, void *buf ) const +{ + herr_t ret_value = H5Aread( id, mem_type.getId(), buf ); + if( ret_value < 0 ) + { + throw AttributeIException(); + } +} + +// Gets a copy of the dataspace for this attribute. +DataSpace Attribute::getSpace() const +{ + // Calls C function H5Aget_space to get the id of the dataspace + hid_t dataspace_id = H5Aget_space( id ); + + // If the dataspace id is valid, create and return the DataSpace object + if( dataspace_id > 0 ) + { + DataSpace dataspace( dataspace_id ); + return( dataspace ); + } + else + { + throw AttributeIException(); + } +} + +// This private member function calls the C API to get the generic datatype +// of the datatype that is used by this attribute. This function is used +// by the overloaded functions getDataType defined in AbstractDs for the +// generic datatype and specific sub-types. +hid_t Attribute::p_getType() const +{ + hid_t type_id = H5Aget_type( id ); + if( type_id > 0 ) + return( type_id ); + else + { + throw AttributeIException(); + } +} + +// Gets the name of this attribute. +string Attribute::getName( size_t buf_size ) const +{ + char* name_C = new char[buf_size+1]; // temporary C-string for C API + + // Calls C routine H5Aget_name to get the name of the attribute + herr_t name_size = H5Aget_name( id, buf_size, name_C ); + + // If H5Aget_name returns a negative value, raise an exception, + if( name_size < 0 ) + { + throw AttributeIException(); + } + // otherwise, create the string to hold the attribute name and return it + string name = string( name_C ); + delete name_C; + return( name ); +} + +// This private function calls the C API H5Aclose to close this attribute. +// Used by the IdComponent::reset. +void Attribute::p_close() const +{ + herr_t ret_value = H5Aclose( id ); + if( ret_value < 0 ) + { + throw AttributeIException(); + } +} + +// The destructor of this instance calls IdComponent::reset to +// reset its identifier - no longer true +// Older compilers (baldric) don't support template member functions +// and IdComponent::reset is one; so at this time, the resetId is not +// a member function so it can be template to work around that problem. +Attribute::~Attribute() +{ + // The attribute id will be closed properly + resetIdComponent( this ); +} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5Attribute.h b/c++/src/H5Attribute.h new file mode 100644 index 0000000..d04e351 --- /dev/null +++ b/c++/src/H5Attribute.h @@ -0,0 +1,47 @@ +#ifndef _H5Attribute_H +#define _H5Attribute_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class Attribute : public AbstractDs { + + public: + // Copy constructor: makes a copy of an existing Attribute object. + Attribute( const Attribute& original ); + + // Writes data to this attribute. + void write(const DataType& mem_type, void *buf ) const; + + // Reads data from this attribute. + void read( const DataType& mem_type, void *buf ) const; + + // Gets a copy of the dataspace for this attribute. + virtual DataSpace getSpace() const; + + // Gets the name of this attribute. + string getName( size_t buf_size ) const; + + // do not inherit iterateAttrs from H5Object + int iterateAttrs() { return 0; } + + // Used by the API to appropriately close a attribute + virtual void p_close() const; + + // Creates a copy of an existing attribute using the attribute id + Attribute( const hid_t attr_id ); + + virtual ~Attribute(); + + private: + // This function contains the common code that is used by + // getTypeClass and various API functions getXxxType + // defined in AbstractDs for generic datatype and specific + // sub-types + virtual hid_t p_getType() const; +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5Classes.h b/c++/src/H5Classes.h new file mode 100644 index 0000000..89e11dc --- /dev/null +++ b/c++/src/H5Classes.h @@ -0,0 +1,36 @@ +#ifndef _H5Classes_H +#define _H5Classes_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + class Exception; + class ReferenceCounter; + class IdComponent; + class H5Object; + class PropList; + class FileCreatPropList; + class FileAccPropList; + class DSetCreatPropList; + class DSetMemXferPropList; + class DTypePropList; + class DataType; + class DataSpace; + class AtomType; + class PredType; + class EnumType; + class IntType; + class FloatType; + class StrType; + class CompType; + //class RefType; + class AbstractDs; + class DataSet; + class Group; + class H5File; + class Attribute; + class H5Library; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5CommonFG.C b/c++/src/H5CommonFG.C new file mode 100644 index 0000000..6ece682 --- /dev/null +++ b/c++/src/H5CommonFG.C @@ -0,0 +1,285 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5FaccProp.h" +#include "H5FcreatProp.h" +#include "H5DxferProp.h" +#include "H5DcreatProp.h" +#include "H5Group.h" +#include "H5AbstractDs.h" +#include "H5DataSpace.h" +#include "H5DataSet.h" +#include "H5File.h" +#include "H5Alltypes.h" + +// Since several compilers do not have support template functions, the +// code in H5templates.h are modified to become the common code defined +// in this file. The common functions use the hdf5 id that is provided +// by the appropriate objects. +// October 2000 + +// There are a few comments that are common to most of the functions +// defined in this file so they are listed here. +// - when a failure returned by the C API, the functions will +// throw an exception, called File_GroupException, so Group or File can +// catch it and throw the appropriate exception to the user's application, +// i.e., GroupInterfaceException or FileInterfaceException. +// June 2000 + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif +// Creates a new group at this location which can be a file or another group. +Group createGroupT( const hid_t loc_id, const string name, size_t size_hint ) +{ + // Convert string to C-string + const char* name_C; + name_C = name.c_str(); // name_C refers to the contents of name as a C-str + + // Call C routine H5Gcreate to create the named group, giving the + // location id which can be a file id or a group id + hid_t group_id = H5Gcreate( loc_id, name_C, size_hint ); + + // If the group id is valid, create and return the Group object + if( group_id > 0 ) + { + Group group( group_id ); + return( group ); + } + else + { + throw File_GroupException(); + } +} + +// Opens an existing group in a location which can be a file or another group +Group openGroupT( const hid_t loc_id, const string name ) +{ + // Convert string to C-string + const char* name_C; + name_C = name.c_str(); // name_C refers to the contents of name as a C-str + + // Call C routine H5Gopen to open the named group, giving the + // location id which can be a file id or a group id + hid_t group_id = H5Gopen( loc_id, name_C ); + + // If the group id is valid, create and return the Group object + if( group_id > 0 ) + { + Group group( group_id ); + return( group ); + } + else + { + throw File_GroupException(); + } +} + +// Creates a new dataset at this location. +DataSet createDataSetT( const hid_t loc_id, const string name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist ) +{ + // Convert the dataset's name in C++ string to C-string + const char* name_C; + name_C = name.c_str(); // name_C refers to the contents of name as a C-str + + // Obtain identifiers for C API + hid_t type_id = data_type.getId(); + hid_t space_id = data_space.getId(); + hid_t create_plist_id = create_plist.getId(); + + // Call C routine H5Dcreate to create the named dataset + hid_t dataset_id = H5Dcreate( loc_id, name_C, type_id, space_id, create_plist_id ); + + // If the dataset id is valid, create and return the DataSet object + if( dataset_id > 0 ) + { + DataSet dataset( dataset_id ); + return( dataset ); + } + else + { + throw File_GroupException(); + } +} + +// Opens an existing dataset at this location. +DataSet openDataSetT( const hid_t loc_id, const string name ) +{ + // Convert the dataset's name in C++ string to C-string + const char* name_C; + name_C = name.c_str(); // name_C refers to the contents of name as a C-str + + // Call C function H5Dopen to open the specified dataset, giving + // the location id and the dataset's name + hid_t dataset_id = H5Dopen( loc_id, name_C ); + + // If the dataset id is valid, create and return the DataSet object + if( dataset_id > 0 ) + { + DataSet dataset( dataset_id ); + return( dataset ); + } + else + { + throw File_GroupException(); + } +} + +// Creates a link of the specified type from new_name to current_name; +// both names are interpreted relative to the specified location id +void linkT( const hid_t loc_id, H5G_link_t link_type, const string curr_name, const string new_name ) +{ + // Convert string to C-string + const char* curr_name_C, *new_name_C; + curr_name_C = curr_name.c_str(); // refers to contents of curr_name as a C-str + new_name_C = new_name.c_str(); // refers to contents of new_name as a C-str + + herr_t ret_value = H5Glink( loc_id, link_type, curr_name_C, new_name_C ); + if( ret_value < 0 ) + { + throw File_GroupException(); + } +} + +// Removes the specified name at this location. +void unlinkT( const hid_t loc_id, const string name ) +{ + // Convert string to C-string + const char* name_C; + name_C = name.c_str(); // name_C refers to the contents of name as a C-str + + herr_t ret_value = H5Gunlink( loc_id, name_C ); + if( ret_value < 0 ) + { + throw File_GroupException(); + } +} + +// Renames an object at this location. +void moveT( const hid_t loc_id, const string src, const string dst ) +{ + // Convert string to C-string + const char* src_C, *dst_C; + src_C = src.c_str(); // refers to contents of src as a C-str + dst_C = dst.c_str(); // refers to contents of dst as a C-str + + herr_t ret_value = H5Gmove( loc_id, src_C, dst_C ); + if( ret_value < 0 ) + { + throw File_GroupException(); + } +} + +// Returns information about an object +void getObjinfoT( const hid_t loc_id, const string name, hbool_t follow_link, H5G_stat_t& statbuf ) +{ + // Convert string to C-string + const char* name_C; + name_C = name.c_str(); // name_C refers to the contents of name as a C-str + + herr_t ret_value = H5Gget_objinfo( loc_id, name_C, follow_link, &statbuf ); + if( ret_value < 0 ) + { + throw File_GroupException(); + } +} + +// Returns the name of the object that the symbolic link points to. +string getLinkvalT( const hid_t loc_id, const string name, size_t size ) +{ + // Convert string to C-string - name_C refers to the contents of name + // as a C string + const char* name_C = name.c_str(); + + char* value_C = new char[size+1]; // temporary C-string for C API + + herr_t ret_value = H5Gget_linkval( loc_id, name_C, size, value_C ); + if( ret_value < 0 ) + { + throw File_GroupException(); + } + string value = string( value_C ); + delete value_C; + return( value ); +} + +// Sets the comment for an object specified by its name +void setCommentT( const hid_t loc_id, const string name, const string comment ) +{ + // Convert strings to C-strings + const char* name_C, *comment_C; + name_C = name.c_str(); // refers to the contents of name as a C-str + comment_C = comment.c_str(); // refers to the contents of comment as a C-str + herr_t ret_value = H5Gset_comment( loc_id, name_C, comment_C ); + if( ret_value < 0 ) + { + throw File_GroupException(); + } +} + +// Retrieves comment for specified object +string getCommentT( const hid_t loc_id, const string name, size_t bufsize ) +{ + // Convert string to C-string - name_C refers to the contents of name + // as a C string + const char* name_C = name.c_str(); + + // temporary C-string for the object's comment + char* comment_C = new char[bufsize+1]; + + herr_t ret_value = H5Gget_comment( loc_id, name_C, bufsize, comment_C ); + + // if H5Gget_comment returns SUCCEED, return the string comment + if( ret_value < 0 ) + { + throw File_GroupException(); + } + string comment = string( comment_C ); + delete comment_C; + return( comment ); +} + +// Mounts the file 'child' onto this group +void mountT( const hid_t loc_id, const string name, hid_t child_id, PropList& plist ) +{ + // Obtain identifiers for C API + hid_t plist_id = plist.getId(); + + // Convert string to C-string + const char* name_C; + name_C = name.c_str(); // name_C refers to the contents of name as a C-str + + // Call C routine H5Fmount to do the mouting + herr_t ret_value = H5Fmount( loc_id, name_C, child_id, plist_id ); + + // Raise exception if H5Fmount returns negative value + if( ret_value < 0 ) + { + throw File_GroupException(); + } +} + +// Unmounts the file named 'name' from this parent group +void unmountT( const hid_t loc_id, const string name ) +{ + // Convert string to C-string + const char* name_C; + name_C = name.c_str(); // name_C refers to the contents of name as a C-str + + // Call C routine H5Fmount to do the mouting + herr_t ret_value = H5Funmount( loc_id, name_C ); + + // Raise exception if H5Funmount returns negative value + if( ret_value < 0 ) + { + throw File_GroupException(); + } +} +#ifndef H5_NO_NAMESPACE +} +#endif diff --git a/c++/src/H5CommonFG.h b/c++/src/H5CommonFG.h new file mode 100644 index 0000000..68c6bec --- /dev/null +++ b/c++/src/H5CommonFG.h @@ -0,0 +1,62 @@ +/* +These functions provide code that are common to both H5File and Group. +Some of the member functions of these two classes call a common function +and provide it a file or group id to perform a task that can be done on +either an H5File or Group instance. 10/31/00 + +The name of the functions ends with a T because these functions were +template functions until it was realized that more than one of our +supported platforms have not supported template functions. +*/ + +#ifndef _CommonFG_H +#define _CommonFG_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Creates a new group at this location which can be a file or another group. +Group createGroupT( const hid_t loc_id, const string name, size_t size_hint ); + +// Opens an existing group in a location which can be a file or another group +Group openGroupT( const hid_t loc_id, const string name ); + +// Creates a new dataset at this location. +DataSet createDataSetT( const hid_t loc_id, const string name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist ); + +// Opens an existing dataset at this location. +DataSet openDataSetT( const hid_t loc_id, const string name ); + +// Creates a link of the specified type from new_name to current_name; +// both names are interpreted relative to the specified location id +void linkT( const hid_t loc_id, H5G_link_t link_type, const string curr_name, const string new_name ); + +// Removes the specified name at this location. +void unlinkT( const hid_t loc_id, const string name ); + +// Renames an object at this location. +void moveT( const hid_t loc_id, const string src, const string dst ); + +// Returns information about an object +void getObjinfoT( const hid_t loc_id, const string name, hbool_t follow_link, H5G_stat_t& statbuf ); + +// Returns the name of the object that the symbolic link points to. +string getLinkvalT( const hid_t loc_id, const string name, size_t size ); + +// Sets the comment for an object specified by its name +void setCommentT( const hid_t loc_id, const string name, const string comment ); + +// Retrieves comment for specified object +string getCommentT( const hid_t loc_id, const string name, size_t bufsize ); + +// Mounts the file 'child' onto this group +void mountT( const hid_t loc_id, const string name, hid_t child_id, PropList& plist ); + +// Unmounts the file named 'name' from this parent group +void unmountT( const hid_t loc_id, const string name ); +#ifndef H5_NO_NAMESPACE +} +#endif +#endif + diff --git a/c++/src/H5CompType.C b/c++/src/H5CompType.C new file mode 100644 index 0000000..634d817 --- /dev/null +++ b/c++/src/H5CompType.C @@ -0,0 +1,225 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5Alltypes.h" +#include "H5AbstractDs.h" +#include "H5DxferProp.h" +#include "H5DataSpace.h" +#include "H5DataSet.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Creates a new compound datatype +CompType::CompType( size_t size ) : DataType( H5T_COMPOUND, size ) {} + +// Creates a compound datatype using an existing id +CompType::CompType( const hid_t existing_id ) : DataType( existing_id ) {} + +// Default constructor +CompType::CompType() : DataType() {} + +// Copy constructor: makes copy of the original CompType object +CompType::CompType( const CompType& original ) : DataType( original ) {} + +// Gets the compound datatype of the specified dataset - reimplement this +CompType::CompType( const DataSet& dataset ) : DataType() +{ + // Calls C function H5Dget_type to get the id of the datatype + id = H5Dget_type( dataset.getId() ); + + // If the datatype id is invalid, throw exception + if( id <= 0 ) + { + throw DataSetIException(); + } +} + +// Retrieves the number of members in this compound datatype. +int CompType::getNmembers() const +{ + int num_members = H5Tget_nmembers( id ); + if( num_members < 0 ) + { + throw DataTypeIException(); + } + return( num_members ); +} + +// Retrieves the name of a member of this compound datatype. +string CompType::getMemberName( int member_num ) const +{ + char* member_name_C = H5Tget_member_name( id, member_num ); + if( member_name_C == NULL ) // should this be returned also??? + { + throw DataTypeIException(); + } + string member_name = string( member_name_C ); + return( member_name ); +} + +// Retrieves the offset of a member of a compound datatype. +size_t CompType::getMemberOffset( int member_num ) const +{ + size_t offset = H5Tget_member_offset( id, member_num ); + // Q. said: for now, 0 is not a failure + //if( offset == 0 ) + //{ + //throw DataTypeIException(); + //} + return( offset ); +} + +// Returns the dimensionality of the member. +int CompType::getMemberDims( int member_num, size_t* dims, int* perm ) const +{ + throw DataTypeIException( "Error: getMemberDims is no longer supported." ); +} + +// Gets the type class of the specified member. +H5T_class_t CompType::getMemberClass( int member_num ) const +{ + // get the member datatype first + hid_t member_type_id = H5Tget_member_type( id, member_num ); + if( member_type_id <= 0 ) + { + throw DataTypeIException(); + } + + // then get its class + H5T_class_t member_class = H5Tget_class( member_type_id ); + if( member_class == H5T_NO_CLASS ) + { + throw DataTypeIException(); + } + return( member_class ); +} + +// This private member function calls the C API to get the identifier +// of the specified member. It is used by the getMemberXxxType +// below for the sub-types. +hid_t CompType::p_getMemberType( int member_num ) const +{ + hid_t member_type_id = H5Tget_member_type( id, member_num ); + if( member_type_id > 0 ) + return( member_type_id ); + else + { + throw DataTypeIException(); + } +} + +// Returns the datatype of the specified member in this compound datatype. +DataType CompType::getMemberDataType( int member_num ) const +{ + DataType datatype( p_getMemberType( member_num )); + return( datatype ); +} + +EnumType CompType::getMemberEnumType( int member_num ) const +{ + EnumType enumtype( p_getMemberType( member_num )); + return( enumtype ); +} + +CompType CompType::getMemberCompType( int member_num ) const +{ + CompType comptype( p_getMemberType( member_num )); + return( comptype ); +} + +IntType CompType::getMemberIntType( int member_num ) const +{ + IntType inttype( p_getMemberType( member_num )); + return( inttype ); +} + +FloatType CompType::getMemberFloatType( int member_num ) const +{ + FloatType floatype( p_getMemberType( member_num )); + return( floatype ); +} + +StrType CompType::getMemberStrType( int member_num ) const +{ + StrType strtype( p_getMemberType( member_num )); + return( strtype ); +} + +/* old style of getMemberType - using overloads; new style above + returns the appropriate datatypes but has different named functions. +// Returns the datatype of the specified member in this compound datatype. +// Several overloading of getMemberType are for different datatypes +void CompType::getMemberType( int member_num, EnumType& enumtype ) const +{ + p_getMemberType( member_num, enumtype ); +} + +void CompType::getMemberType( int member_num, CompType& comptype ) const +{ + p_getMemberType( member_num, comptype ); +} + +void CompType::getMemberType( int member_num, IntType& inttype ) const +{ + p_getMemberType( member_num, inttype ); +} + +void CompType::getMemberType( int member_num, FloatType& floatype ) const +{ + p_getMemberType( member_num, floatype ); +} + +void CompType::getMemberType( int member_num, StrType& strtype ) const +{ + p_getMemberType( member_num, strtype ); +} +// end of overloading of getMemberType +*/ + +// Adds a new member to a compound datatype +void CompType::insertMember( const string name, size_t offset, const DataType& new_member ) const +{ + // Convert string to C-string + const char* name_C; + name_C = name.c_str(); // name_C refers to the contents of name as a C-str + + hid_t new_member_id = new_member.getId(); // get new_member id for C API + + // Call C routine H5Tinsert to add the new member + herr_t ret_value = H5Tinsert( id, name_C, offset, new_member_id ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Adds an array member to this compound datatype. +void CompType::insertMember( const string member_name, size_t offset, int ndims, const size_t* dim, const int* perm, const DataType& new_member ) const +{ + throw DataTypeIException( "Error: insertMember is no longer supported."); +} + +// Recursively removes padding from within a compound datatype. +void CompType::pack() const +{ + // Calls C routine H5Tpack to remove padding + herr_t ret_value = H5Tpack( id ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// This destructor just invokes the base-class' destructor +CompType::~CompType() {} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5CompType.h b/c++/src/H5CompType.h new file mode 100644 index 0000000..9b2c983 --- /dev/null +++ b/c++/src/H5CompType.h @@ -0,0 +1,84 @@ +#ifndef _H5CompType_H +#define _H5CompType_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class CompType : public DataType { + public: + // Creates a new datatype + CompType( size_t size ); // H5Tcreate + + // Default constructor + CompType(); + + // Creates a compound datatype using an existing id + CompType( hid_t existing_id ); + + // Copy constructor - makes a copy of original object + CompType( const CompType& original ); + + // Gets the compound datatype of the specified dataset + CompType( const DataSet& dataset ); // H5Dget_type + + // Retrieves the number of members in this compound datatype. + int getNmembers() const; + + // Retrieves the name of a member of this compound datatype. + string getMemberName( int member_num ) const; + + // Retrieves the offset of a member of this compound datatype. + size_t getMemberOffset( int memb_no ) const; + + // Returns the dimensionality of the specified member. + int getMemberDims( int member_num, size_t* dims, int* perm ) const; + + // Gets the type class of the specified member. It provides to + // the user a way of knowing what type to declare. + H5T_class_t getMemberClass( int member_num ) const; + + // Returns the generic datatype of the specified member in + // this compound datatype. + DataType getMemberDataType( int member_num ) const; + + // Returns the enumeration datatype of the specified member in + // this compound datatype. + EnumType getMemberEnumType( int member_num ) const; + + // Returns the compound datatype of the specified member in + // this compound datatype. + CompType getMemberCompType( int member_num ) const; + + // Returns the integer datatype of the specified member in + // this compound datatype. + IntType getMemberIntType( int member_num ) const; + + // Returns the floating-point datatype of the specified member in + // this compound datatype. + FloatType getMemberFloatType( int member_num ) const; + + // Returns the string datatype of the specified member in + // this compound datatype. + StrType getMemberStrType( int member_num ) const; + + // Adds a new member to this compound datatype. + void insertMember( const string name, size_t offset, const DataType& new_member ) const; + + // Adds an array datatype member to this compound datatype. + void insertMember( const string name, size_t offset, int ndims, const size_t* dim, const int* perm, const DataType& new_member ) const; + + // Recursively removes padding from within this compound datatype. + void pack() const; + + virtual ~CompType(); + + private: + // Contains common code that is used by the member functions + // getMemberXxxType + hid_t p_getMemberType( int member_num ) const; +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5Cpp.h b/c++/src/H5Cpp.h new file mode 100644 index 0000000..6188b67 --- /dev/null +++ b/c++/src/H5Cpp.h @@ -0,0 +1,29 @@ +#ifndef _H5CPP_H +#define _H5CPP_H + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5DataSpace.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5AbstractDs.h" +#include "H5Attribute.h" +#include "H5DataType.h" +#include "H5DcreatProp.h" +#include "H5DxferProp.h" +#include "H5FaccProp.h" +#include "H5FcreatProp.h" +#include "H5AtomType.h" +#include "H5PredType.h" +#include "H5EnumType.h" +#include "H5IntType.h" +#include "H5FloatType.h" +#include "H5StrType.h" +#include "H5CompType.h" +#include "H5DataSet.h" +#include "H5Group.h" +#include "H5File.h" +#include "H5Library.h" +#endif diff --git a/c++/src/H5DataSet.C b/c++/src/H5DataSet.C new file mode 100644 index 0000000..1cc66a2 --- /dev/null +++ b/c++/src/H5DataSet.C @@ -0,0 +1,207 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5Idtemplates.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5PropList.h" +#include "H5DxferProp.h" +#include "H5DataType.h" +#include "H5DcreatProp.h" +#include "H5DataSpace.h" +#include "H5AbstractDs.h" +#include "H5DataSet.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Default constructor +DataSet::DataSet() : AbstractDs() {} + +// Creates a copy of DataSet using an existing id +DataSet::DataSet( const hid_t dataset_id ) : AbstractDs( dataset_id ) {} + +// Copy constructor makes a copy of the original object by using base +// class' copy constructors +DataSet::DataSet( const DataSet& original ) : AbstractDs( original ) {} + +// Gets a copy of the dataspace of this dataset +DataSpace DataSet::getSpace() const +{ + // Calls C function H5Dget_space to get the id of the dataspace + hid_t dataspace_id = H5Dget_space( id ); + + // If the dataspace id is invalid, throw an exception + if( dataspace_id <= 0 ) + { + throw DataSetIException(); + } + //create dataspace object using the existing id then return the object + DataSpace data_space( dataspace_id ); + return( data_space ); +} + +// This private member function calls the C API to get the identifier +// of the datatype that is used by this dataset. It is used +// by the various AbstractDs functions to get the specific datatype. +hid_t DataSet::p_getType() const +{ + hid_t type_id = H5Dget_type( id ); + if( type_id > 0 ) + return( type_id ); + else + { + throw DataSetIException(); + } +} + +// Gets the dataset creation property list +DSetCreatPropList DataSet::getCreatePlist() const +{ + hid_t create_plist_id = H5Dget_create_plist( id ); + if( create_plist_id <= 0 ) + { + throw DataSetIException(); + } + // create and return the DSetCreatPropList object + DSetCreatPropList create_plist( create_plist_id ); + return( create_plist ); +} + +// Returns the amount of storage required for a dataset. +hsize_t DataSet::getStorageSize() const +{ + hsize_t storage_size = H5Dget_storage_size( id ); + + if( storage_size > 0 ) + return( storage_size ); + else + { + throw DataSetIException(); + } +} + +// Returns the number of bytes required to store VL data. +hsize_t DataSet::getVlenBufSize( DataType& type, DataSpace& space ) const +{ + //herr_t ret_value; + // Obtain identifiers for C API + //hid_t type_id = type.getId(); + //hid_t space_id = space.getId(); + //hsize_t size; + + throw DataSetIException( "getVlenBufSize: Currently not implemented yet."); + //ret_value = H5Dget_vlen_buf_size( id, type_id, space_id, &size ); + //if( ret_value >= 0 ) + // return( size ); + //else + //{ + //throw DataSetIException(); + //} +} + +// Reclaims VL datatype memory buffers. +void DataSet::vlenReclaim( DataType& type, DataSpace& space, DSetMemXferPropList& xfer_plist, void* buf ) const +{ + herr_t ret_value; + // Obtain identifiers for C API + hid_t type_id = type.getId(); + hid_t space_id = space.getId(); + hid_t xfer_plist_id = xfer_plist.getId(); + + ret_value = H5Dvlen_reclaim( type_id, space_id, xfer_plist_id, buf ); + if( ret_value < 0 ) + { + throw DataSetIException(); + } +} + +// Reads raw data from the specified dataset into buf, converting from +// file datatype and dataspace to memory datatype and dataspace. +void DataSet::read( void* buf, const DataType& mem_type, const DataSpace& mem_space, const DataSpace& file_space, const DSetMemXferPropList& xfer_plist ) const +{ + // Obtain identifiers for C API + hid_t mem_type_id = mem_type.getId(); + hid_t mem_space_id = mem_space.getId(); + hid_t file_space_id = file_space.getId(); + hid_t xfer_plist_id = xfer_plist.getId(); + + herr_t ret_value = H5Dread( id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf ); + if( ret_value < 0 ) + { + throw DataSetIException(); + } +} + +// Writes raw data from an application buffer buffer to a dataset, +// converting from memory datatype and dataspace to file datatype +// and dataspace. +void DataSet::write( const void* buf, const DataType& mem_type, const DataSpace& mem_space, const DataSpace& file_space, const DSetMemXferPropList& xfer_plist ) const +{ + // Obtain identifiers for C API + hid_t mem_type_id = mem_type.getId(); + hid_t mem_space_id = mem_space.getId(); + hid_t file_space_id = file_space.getId(); + hid_t xfer_plist_id = xfer_plist.getId(); + + herr_t ret_value = H5Dwrite( id, mem_type_id, mem_space_id, file_space_id, xfer_plist_id, buf ); + if( ret_value < 0 ) + { + throw DataSetIException(); + } +} + +// 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 ) +{ + // Obtain identifiers for C API + hid_t type_id = type.getId(); + hid_t space_id = space.getId(); + herr_t ret_value = H5Diterate( buf, type_id, space_id, op, op_data ); + if( ret_value >= 0 ) + return( ret_value ); + else // raise exception when H5Diterate returns a negative value + { + throw DataSetIException(); + } +} + +// Extends a dataset with unlimited dimension. +void DataSet::extend( const hsize_t* size ) const +{ + herr_t ret_value = H5Dextend( id, size ); + if( ret_value < 0 ) // raise exception when H5Dextend returns a neg value + { + throw DataSetIException(); + } +} + +// This private function calls the C API H5Dclose to close this dataset. +// Used by IdComponent::reset +void DataSet::p_close() const +{ + herr_t ret_value = H5Dclose( id ); + if( ret_value < 0 ) + { + throw DataSetIException(); + } +} + +// The destructor of this instance calls IdComponent::reset to +// reset its identifier - no longer true +// Older compilers (baldric) don't support template member functions +// and IdComponent::reset is one; so at this time, the resetId is not +// a member function so it can be template to work around that problem. +DataSet::~DataSet() +{ + // The dataset id will be closed properly + resetIdComponent( this ); +} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5DataSet.h b/c++/src/H5DataSet.h new file mode 100644 index 0000000..8a59234 --- /dev/null +++ b/c++/src/H5DataSet.h @@ -0,0 +1,67 @@ +#ifndef _H5DataSet_H +#define _H5DataSet_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class DataSet : public AbstractDs { + + public: + // Default constructor + DataSet(); + + // Copy constructor + DataSet( const DataSet& original ); + + // Gets the dataspace of this dataset. + virtual DataSpace getSpace() const; + + // Gets the creation property list of this dataset. + DSetCreatPropList getCreatePlist() const; + + // Gets the storage size of this dataset. + hsize_t getStorageSize() const; + + // - C version not yet implemented?? + hsize_t getVlenBufSize( DataType& type, DataSpace& space ) const; + void vlenReclaim( DataType& type, DataSpace& space, DSetMemXferPropList& xfer_plist, void* buf ) const; + + // Reads the data of this dataset and stores it in the provided buffer. + // 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; + + // 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; + + // 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 ); + + // Extends the dataset with unlimited dimension. + void extend( const hsize_t* size ) const; + + // Creates a copy of an existing DataSet using its id + // (used only by template functions in FGtemplates.h + // to return a DataSet, will not be published; Note: should use + // friend template function) + DataSet( const hid_t dataset_id ); + + // Used by the API to appropriately close a dataset + virtual void p_close() const; + + virtual ~DataSet(); + + private: + // This function contains the common code that is used by + // getTypeClass and various API functions getXxxType + // defined in AbstractDs for generic datatype and specific + // sub-types + virtual hid_t p_getType() const; +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5DataSpace.C b/c++/src/H5DataSpace.C new file mode 100644 index 0000000..67857ee --- /dev/null +++ b/c++/src/H5DataSpace.C @@ -0,0 +1,321 @@ +#include <string> + +#include "H5Include.h" +#include "H5Exception.h" +#include "H5RefCounter.h" +#include "H5IdComponent.h" +#include "H5Idtemplates.h" +#include "H5DataSpace.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +const DataSpace DataSpace::ALL( H5S_ALL ); + +// Default constructor +DataSpace::DataSpace() : IdComponent() {} + +// This constructor creates a DataSpace instance, given a dataspace type +DataSpace::DataSpace( H5S_class_t type ) : IdComponent() +{ + id = H5Screate( type ); + if( id <= 0 ) + { + throw DataSpaceIException(); + } +} + +// Creates a new simple data space and opens it for access. +DataSpace::DataSpace( int rank, const hsize_t * dims, const hsize_t * maxdims) : IdComponent() +{ + id = H5Screate_simple( rank, dims, maxdims ); + if( id <= 0 ) + { + throw DataSpaceIException(); + } +} + +/* 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. +*/ +DataSpace::DataSpace( const hid_t space_id ) : IdComponent( space_id ) {} + +// Copy constructor: makes a copy of the original DataSpace instance +DataSpace::DataSpace( const DataSpace& original ) : IdComponent( original ) {} + +// Makes a copy of an existing dataspace +void DataSpace::copy( const DataSpace& like_space ) +{ + // reset the identifier of this instance - send 'this' in so that + // H5Sclose can be called appropriately + resetIdComponent( this ); + + // call C routine to copy the dataspace + id = H5Scopy( like_space.getId() ); + + // points to the same ref counter + ref_count = like_space.ref_count; + + // increment ref counter to indicate additional references to this id + ref_count->increment(); + + if( id <= 0 ) + { + throw DataSpaceIException(); + } +} + +// Determines whether this dataspace is a simple dataspace. +bool DataSpace::isSimple () const +{ + htri_t simple = H5Sis_simple( id ); + if( simple > 0 ) + return true; + else if( simple == 0 ) + return false; + else + { + throw DataSpaceIException(); + } +} + +// Sets the offset of this simple dataspace. +void DataSpace::offsetSimple ( const hssize_t* offset ) const +{ + herr_t ret_value = H5Soffset_simple( id, offset ); + if( ret_value < 0 ) + { + throw DataSpaceIException(); + } +} + +// Retrieves dataspace dimension size and maximum size +int DataSpace::getSimpleExtentDims ( hsize_t *dims, hsize_t *maxdims ) const +{ + int ndims = H5Sget_simple_extent_dims( id, dims, maxdims ); + if( ndims < 0 ) + { + throw DataSpaceIException(); + } + return( ndims ); +} + +// Determines the dimensionality of a dataspace +int DataSpace::getSimpleExtentNdims () const +{ + int ndims = H5Sget_simple_extent_ndims( id ); + if( ndims < 0 ) + { + throw DataSpaceIException(); + } + return( ndims ); +} + +// Determines the number of elements in a dataspace +hsize_t DataSpace::getSimpleExtentNpoints () const +{ + hsize_t num_elements = H5Sget_simple_extent_npoints( id ); + + // num_elements = 0 when failure occurs + if( num_elements > 0 ) + return( num_elements ); + else + { + throw DataSpaceIException(); + } +} + +// Determine the current class of a dataspace +H5S_class_t DataSpace::getSimpleExtentType () const +{ + H5S_class_t class_name = H5Sget_simple_extent_type( id ); + if( class_name == H5S_NO_CLASS ) + { + throw DataSpaceIException(); + } + return( class_name ); +} + +// Copies the extent of a dataspace +void DataSpace::extentCopy ( DataSpace& dest_space ) const +{ + hid_t dest_space_id = dest_space.getId(); + herr_t ret_value = H5Sextent_copy( dest_space_id, id ); + if( ret_value < 0 ) + { + throw DataSpaceIException(); + } +} + +// Sets or resets the size of an existing dataspace +void DataSpace::setExtentSimple( int rank, const hsize_t *current_size, const hsize_t *maximum_size ) const +{ + herr_t ret_value; + ret_value = H5Sset_extent_simple( id, rank, current_size, maximum_size ); + if( ret_value < 0 ) + { + throw DataSpaceIException(); + } +} + +// Removes the extent from a dataspace +void DataSpace::setExtentNone () const +{ + herr_t ret_value = H5Sset_extent_none( id ); + if( ret_value < 0 ) + { + throw DataSpaceIException(); + } +} + +// Determines the number of elements in a dataspace selection +hssize_t DataSpace::getSelectNpoints () const +{ + hssize_t num_elements = H5Sget_select_npoints( id ); + if( num_elements < 0 ) + { + throw DataSpaceIException(); + } + return( num_elements ); +} + +// Get number of hyperslab blocks +hssize_t DataSpace::getSelectHyperNblocks () const +{ + hssize_t num_blocks = H5Sget_select_hyper_nblocks( id ); + if( num_blocks < 0 ) + { + throw DataSpaceIException(); + } + return( num_blocks ); +} + +// Gets the list of hyperslab blocks currently selected +void DataSpace::getSelectHyperBlocklist( hsize_t startblock, hsize_t numblocks, hsize_t *buf ) const +{ + herr_t ret_value; + ret_value = H5Sget_select_hyper_blocklist( id, startblock, numblocks, buf ); + if( ret_value < 0 ) + { + throw DataSpaceIException(); + } +} + +// Gets the number of element points in the current selection +hssize_t DataSpace::getSelectElemNpoints () const +{ + hssize_t num_points = H5Sget_select_elem_npoints( id ); + if( num_points < 0 ) + { + throw DataSpaceIException(); + } + return( num_points ); +} + +// Gets the list of element points currently selected +void DataSpace::getSelectElemPointlist ( hsize_t startpoint, hsize_t numpoints, hsize_t *buf ) const +{ + herr_t ret_value; + ret_value = H5Sget_select_elem_pointlist( id, startpoint, numpoints, buf ); + if( ret_value < 0 ) + { + throw DataSpaceIException(); + } +} + +// Gets the bounding box containing the current selection +void DataSpace::getSelectBounds ( hsize_t* start, hsize_t* end ) const +{ + herr_t ret_value = H5Sget_select_bounds( id, start, end ); + if( ret_value < 0 ) + { + throw DataSpaceIException(); + } +} + +// Selects array elements to be included in the selection for a dataspace +void DataSpace::selectElements ( H5S_seloper_t op, const size_t num_elements, const hssize_t *coord[ ] ) const +{ + herr_t ret_value; + ret_value = H5Sselect_elements( id, op, num_elements, coord ); + if( ret_value < 0 ) + { + throw DataSpaceIException(); + } +} + +// Selects the entire dataspace +void DataSpace::selectAll () const +{ + herr_t ret_value = H5Sselect_all( id ); + if( ret_value < 0 ) + { + throw DataSpaceIException(); + } +} + +//Resets the selection region to include no elements +void DataSpace::selectNone () const +{ + herr_t ret_value = H5Sselect_none( id ); + if( ret_value < 0 ) + { + throw DataSpaceIException(); + } +} + +// Verifies that the selection is within the extent of the dataspace +bool DataSpace::selectValid () const +{ + htri_t ret_value = H5Sselect_valid( id ); + if( ret_value > 0 ) + return true; + else if( ret_value == 0 ) + return false; + else + { + throw DataSpaceIException(); + } +} + +// Selects a hyperslab region to add to the current selected region +void DataSpace::selectHyperslab( H5S_seloper_t op, const hsize_t *count, const hssize_t *start, const hsize_t *stride, const hsize_t *block ) const +{ + herr_t ret_value; + ret_value = H5Sselect_hyperslab( id, op, start, stride, count, block ); + if( ret_value < 0 ) + { + throw DataSpaceIException(); + } +} + +// Closes the dataspace if it is not a constant +void DataSpace::p_close() const +{ + hid_t space_id = id; + if( space_id != H5S_ALL ) // not a constant, should call H5Sclose + { + herr_t ret_value = H5Sclose( space_id ); + if( ret_value < 0 ) + { + throw DataSpaceIException(); + } + } +} + +// The destructor of this instance calls IdComponent::reset to +// reset its identifier - no longer true +// Older compilers (baldric) don't support template member functions +// and IdComponent::reset is one; so at this time, the resetId is not +// a member function so it can be template to work around that problem. +DataSpace::~DataSpace() +{ + // The dataspace id will be closed properly + resetIdComponent( this ); +} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5DataSpace.h b/c++/src/H5DataSpace.h new file mode 100644 index 0000000..ddbb29c --- /dev/null +++ b/c++/src/H5DataSpace.h @@ -0,0 +1,110 @@ +#ifndef _H5DataSpace_H +#define _H5DataSpace_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class DataSpace : public IdComponent { + public: + // Default DataSpace objects + static const DataSpace ALL; + + // Default constructor + DataSpace(); + + // Creates a dataspace object given the space type + DataSpace( H5S_class_t type ); // H5Screate + + // Assignement operator + //DataSpace& operator=( const DataSpace& rhs ); + + // Creates a simple dataspace + DataSpace( int rank, const hsize_t * dims, const hsize_t * maxdims = NULL); // H5Screate_simple + + // Copy constructor: makes a copy of the original DataSpace object. + DataSpace( const DataSpace& original ); + + // Makes copy of an existing dataspace. + void copy( const DataSpace& like_space ); // H5Scopy + + // Gets value of member id of this dataspace + //hid_t getId () const; + + // Sets value for member id of this dataspace. + //void setId( hid_t new_space_id ); + + // Determines if this dataspace is a simple one. + bool isSimple () const; + + // Sets the offset of this simple dataspace. + void offsetSimple ( const hssize_t* offset ) const; + + // Retrieves dataspace dimension size and maximum size. + int getSimpleExtentDims ( hsize_t *dims, hsize_t *maxdims = NULL ) const; + + // Gets the dimensionality of this dataspace. + int getSimpleExtentNdims () const; + + // Gets the number of elements in this dataspace. + hsize_t getSimpleExtentNpoints () const; + + // Gets the current class of this dataspace. + H5S_class_t getSimpleExtentType () const; + + // Copies the extent of this dataspace. + void extentCopy ( DataSpace& dest_space ) const; + + // Sets or resets the size of this dataspace. + void setExtentSimple( int rank, const hsize_t *current_size, const hsize_t *maximum_size = NULL ) const; + + // Removes the extent from this dataspace. + void setExtentNone () const; + + // Gets the number of elements in this dataspace selection. + hssize_t getSelectNpoints () const; + + // Get number of hyperslab blocks. + hssize_t getSelectHyperNblocks () const; + + // Gets the list of hyperslab blocks currently selected. + void getSelectHyperBlocklist( hsize_t startblock, hsize_t numblocks, hsize_t *buf ) const; + + // Gets the number of element points in the current selection. + hssize_t getSelectElemNpoints () const; + + // Retrieves the list of element points currently selected. + void getSelectElemPointlist ( hsize_t startpoint, hsize_t numpoints, hsize_t *buf ) const; + + // Gets the bounding box containing the current selection. + void getSelectBounds ( hsize_t* start, hsize_t* end ) const; + + // Selects array elements to be included in the selection for + // this dataspace. + void selectElements ( H5S_seloper_t op, const size_t num_elements, const hssize_t *coord[ ] ) const; + + // Selects the entire dataspace. + void selectAll () const; + + // Resets the selection region to include no elements. + void selectNone () const; + + // Verifies that the selection is within the extent of the dataspace. + bool selectValid () const; + + // Selects a hyperslab region to add to the current selected region. + void selectHyperslab( H5S_seloper_t op, const hsize_t *count, const hssize_t *start, const hsize_t *stride = NULL, const hsize_t *block = NULL ) const; + + // Uses an existing dataspace identifier to make a DataSpace object + // or uses a default id to create a default dataspace object + DataSpace( const hid_t space_id ); + + // Used by the API to close the dataspace + void p_close() const; + + virtual ~DataSpace(); +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5DataType.C b/c++/src/H5DataType.C new file mode 100644 index 0000000..b376f61 --- /dev/null +++ b/c++/src/H5DataType.C @@ -0,0 +1,341 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5Idtemplates.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5DataType.h" +#include "H5AtomType.h" +#include "H5PredType.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Constructor creates a copy of an existing DataType using its id. +// 'predefined' is default to false; when a default datatype is +// created, this argument is set to true so H5Tclose will not be +// called on it later. +DataType::DataType( const hid_t existing_id, bool predefined ) : H5Object( existing_id ), is_predtype( predefined ) { +} + +// Creates a datatype given its class and size +DataType::DataType( const H5T_class_t type_class, size_t size ) : H5Object(), is_predtype( false ) +{ + // Call C routine to create the new datatype + id = H5Tcreate( type_class, size ); + if( id <= 0 ) + { + throw DataTypeIException(); + } +} + +// Default constructor +DataType::DataType() : H5Object(), is_predtype( false ) +{ +} + +// Copy constructor: makes a copy of this DataType object. +DataType::DataType( const DataType& original ) : H5Object( original ) +{ + is_predtype = original.is_predtype; // copy data member from original +} + +// Copies an existing datatype to this datatype object +void DataType::copy( const DataType& like_type ) +{ + // reset the identifier of this instance, H5Tclose will be called + // if needed + resetIdComponent( this ); + + // call C routine to copy the datatype + id = H5Tcopy( like_type.getId() ); + ref_count = like_type.ref_count; + + // increment ref counter to indicate additional references to this id + ref_count->increment(); + + if( id <= 0 ) + { + throw DataTypeIException(); + } +} + +// Determines whether two datatypes are the same. ??? +bool DataType::operator==(const DataType& compared_type ) const +{ + // Call C routine H5Tequal to determines whether two datatype + // identifiers refer to the same datatype + htri_t ret_value = H5Tequal( id, compared_type.getId() ); + if( ret_value > 0 ) + return true; + else if( ret_value == 0 ) + return false; + else + { + throw DataTypeIException(); + } +} + +// Operates a user's function on each attribute of an object - commented +// out because it should use the one from H5Object; need to check +// the parameter list??? +//int DataType::iterate( unsigned * idx, H5A_operator_t op, void *op_data ) +//{ + // Call C routine H5Aiterate to iterate the object's attributes + //int ret_value = H5Aiterate( id, idx, op, op_data ); + //if( ret_value >= 0 ) + //return( ret_value ); + //else + //{ + //throw DataTypeIException(); + //} +//} + +// Creates a new variable-length datatype - Note: make it inheritance??? +//DataType DataType::vlenCreate( const DataType& base_type ) +//{ + // Call C routine to create a new VL datatype + //hid_t type_id = H5Tvlen_create( id ); + //if( type_id > 0 ) + //id_obj->setId( type_id ); + //else + //{ + //throw DataTypeIException(); + //} +//} + +// Commits a transient datatype to a file, creating a new named datatype +void DataType::commit( H5Object& loc, const string& name ) const +{ + commit( loc, name.c_str() ); +} +void DataType::commit( H5Object& loc, const char* name ) const +{ + hid_t loc_id = loc.getId(); // get location id for C API + + // Call C routine to commit the transient datatype + herr_t ret_value = H5Tcommit( loc_id, name, id ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Determines whether a datatype is a named type or a transient type. +bool DataType::committed() const +{ + // Call C function to determine if a datatype is a named one + htri_t committed = H5Tcommitted( id ); + if( committed > 0 ) + return true; + else if( committed == 0 ) + return false; + else + { + throw DataTypeIException(); + } +} + +// Finds a conversion function. +H5T_conv_t DataType::find( const DataType& dest, H5T_cdata_t **pcdata ) const +{ + // Call C routine to find the conversion function + H5T_conv_t func = H5Tfind( id, dest.getId(), pcdata ); + if( func == NULL ) + { + throw DataTypeIException(); + } + return( func ); +} + +// Converts data from between specified datatypes. +void DataType::convert( const DataType& dest, size_t nelmts, void *buf, void *background, PropList& plist ) const +{ + // Get identifiers for C API + hid_t dest_id = dest.getId(); + hid_t plist_id = plist.getId(); + + // Call C routine H5Tconvert to convert the data + herr_t ret_value; + ret_value = H5Tconvert( id, dest_id, nelmts, buf, background, plist_id ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Sets the overflow handler to a specified function. +void DataType::setOverflow( H5T_overflow_t func ) const +{ + // Call C routine H5Tset_overflow to set the overflow handler + herr_t ret_value = H5Tset_overflow( func ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Returns a pointer to the current global overflow function. +H5T_overflow_t DataType::getOverflow(void) const +{ + return( H5Tget_overflow()); // C routine + // NULL can be returned as well +} + +// Locks a datatype. +void DataType::lock() const +{ + // Call C routine to lock the datatype + herr_t ret_value = H5Tlock( id ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Returns the datatype class identifier. +H5T_class_t DataType::getClass() const +{ + H5T_class_t type_class = H5Tget_class( id ); + + // Return datatype class identifier if successful + if( type_class == H5T_NO_CLASS ) + { + throw DataTypeIException(); + } + return( type_class ); +} + +// Returns the size of a datatype. +size_t DataType::getSize() const +{ + // Call C routine to get the datatype size + size_t type_size = H5Tget_size( id ); + if( type_size <= 0 ) // Is 0 valid value ??? + { + throw DataTypeIException(); + } + return( type_size ); +} + +// Returns the base datatype from which a datatype is derived. +// - just for DataType? +DataType DataType::getSuper() const +{ + // Call C routine to get the base datatype from which the specified + // datatype is derived. + hid_t base_type_id = H5Tget_super( id ); + + // If H5Tget_super returns a valid datatype id, create and return + // the base type, otherwise, raise exception + if( base_type_id > 0 ) + { + DataType base_type( base_type_id ); + return( base_type ); + } + else {} + { + throw DataTypeIException(); + } +} + +// Registers the specified conversion function. +void DataType::registerFunc( H5T_pers_t pers, const string& name, const DataType& dest, H5T_conv_t func ) const +{ + registerFunc( pers, name.c_str(), dest, func ); +} +void DataType::registerFunc( H5T_pers_t pers, const char* name, const DataType& dest, H5T_conv_t func ) const +{ + hid_t dest_id = dest.getId(); // get id of the destination datatype + + // Call C routine H5Tregister to register the conversion function + herr_t ret_value = H5Tregister( pers, name, id, dest_id, func ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Removes a conversion function from all conversion paths. +void DataType::unregister( H5T_pers_t pers, const string& name, const DataType& dest, H5T_conv_t func ) const +{ + unregister( pers, name.c_str(), dest, func ); +} +void DataType::unregister( H5T_pers_t pers, const char* name, const DataType& dest, H5T_conv_t func ) const +{ + hid_t dest_id = dest.getId(); // get id of the dest datatype for C API + + // Call C routine H5Tunregister to remove the conversion function + herr_t ret_value = H5Tunregister( pers, name, id, dest_id, func ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Tags an opaque datatype. +void DataType::setTag( const string& tag ) const +{ + setTag( tag.c_str()); +} +void DataType::setTag( const char* tag ) const +{ + // Call C routine H5Tset_tag to tag an opaque datatype. + herr_t ret_value = H5Tset_tag( id, tag ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Gets the tag associated with an opaque datatype. +string DataType::getTag() const +{ + char* tag_Cstr = H5Tget_tag( id ); + + // if the tag C-string returned is not NULL, convert it to C++ string + // and return it, otherwise, raise an exception + if( tag_Cstr != NULL ) + { + string tag = string( tag_Cstr ); + return( tag ); + } + else + { + throw DataTypeIException(); + } +} + +// This private function calls the C API H5Tclose to close this datatype. +// Used by H5Object::p_reset. +void DataType::p_close() const +{ + // If this datatype is not a predefined type, call H5Tclose on it. + if( is_predtype == false ) + { + herr_t ret_value = H5Tclose( id ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } + } +} + +// The destructor of this instance calls IdComponent::reset to +// reset its identifier - no longer true +// Older compilers (baldric) don't support template member functions +// and IdComponent::reset is one; so at this time, the resetId is not +// a member function so it can be template to work around that problem. +DataType::~DataType() +{ + // The datatype id will be closed properly + resetIdComponent( this ); +} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5DataType.h b/c++/src/H5DataType.h new file mode 100644 index 0000000..0fa1965 --- /dev/null +++ b/c++/src/H5DataType.h @@ -0,0 +1,94 @@ +#ifndef _H5DataType_H +#define _H5DataType_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class DataType : public H5Object { + public: + // Default constructor + DataType(); + + // Creates a datatype given its class and size + DataType( const H5T_class_t type_class, size_t size ); + + // Copy constructor: makes a copy of the original object + DataType( const DataType& original ); + + // Creates a new variable-length datatype - not implemented yet + // Will be moved into a subclass when completed + //DataType vlenCreate( const DataType& base_type ); + + // Copies an existing datatype to this datatype object + void copy( const DataType& like_type ); + + // Returns the datatype class identifier. + H5T_class_t getClass() const; + + // Commits a transient datatype to a file; this datatype becomes + // a named datatype which can be accessed from the location. + void commit( H5Object& loc, const string& name ) const; + void commit( H5Object& loc, const char* name ) const; + + // Determines whether this datatype is a named datatype or + // a transient datatype. + bool committed() const; + + // Finds a conversion function that can handle the conversion + // this datatype to the given datatype, dest. + H5T_conv_t find( const DataType& dest, H5T_cdata_t **pcdata ) const; + + // Converts data from between specified datatypes. + void convert( const DataType& dest, size_t nelmts, void *buf, void *background, PropList& plist ) const; + + // Sets the overflow handler to a specified function. + void setOverflow(H5T_overflow_t func) const; + + // Returns a pointer to the current global overflow function. + H5T_overflow_t getOverflow(void) const; + + // Determines whether two datatypes are the same. ??? + bool operator==(const DataType& compared_type ) const; + + // Locks a datatype. + void lock() const; + + // Returns the size of a datatype. + size_t getSize() const; + + // Returns the base datatype from which a datatype is derived. + // Note: not quite right for specific types yet??? + DataType getSuper() const; + + // Registers a conversion function. + void registerFunc(H5T_pers_t pers, const string& name, const DataType& dest, H5T_conv_t func ) const; + void registerFunc(H5T_pers_t pers, const char* name, const DataType& dest, H5T_conv_t func ) const; + + // Removes a conversion function from all conversion paths. + void unregister( H5T_pers_t pers, const string& name, const DataType& dest, H5T_conv_t func ) const; + void unregister( H5T_pers_t pers, const char* name, const DataType& dest, H5T_conv_t func ) const; + + // Tags an opaque datatype. + void setTag( const string& tag ) const; + void setTag( const char* tag ) const; + + // Gets the tag associated with an opaque datatype. + string getTag() const; + + // Used by the API to appropriately close a datatype + void p_close() const; + + // Creates a copy of an existing DataType using its id + DataType( const hid_t type_id, bool predtype = false ); + + virtual ~DataType(); + + protected: + bool is_predtype; // indicates a type is predefined so + // H5Tclose will not be called for it +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5DcreatProp.C b/c++/src/H5DcreatProp.C new file mode 100644 index 0000000..adaa046 --- /dev/null +++ b/c++/src/H5DcreatProp.C @@ -0,0 +1,173 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5DataType.h" +#include "H5DcreatProp.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +const DSetCreatPropList DSetCreatPropList::DEFAULT( H5P_DEFAULT ); + +// Copy constructor: makes a copy of the original DSetCreatPropList object; +DSetCreatPropList::DSetCreatPropList( const DSetCreatPropList& orig ) : PropList( orig ) {} + +// Copies a dataset creation property list using assignment statement +DSetCreatPropList& DSetCreatPropList::operator=( const DSetCreatPropList& rhs ) +{ + copy (rhs); + return( *this ); +} + +// Sets the size of the chunks used to store a chunked layout dataset. +void DSetCreatPropList::setChunk( int ndims, const hsize_t* dim ) const +{ + herr_t ret_value = H5Pset_chunk( id, ndims, dim ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +// Gets the layout of the raw data storage of the data that uses this +// property list +H5D_layout_t DSetCreatPropList::getLayout() const +{ + H5D_layout_t layout = H5Pget_layout( id ); + if( layout == H5D_LAYOUT_ERROR ) + { + throw PropListIException(); + } + return( layout ); +} + +// Retrieves the size of the chunks used to store a chunked layout dataset. +int DSetCreatPropList::getChunk( int max_ndims, hsize_t* dim ) const +{ + int chunk_size = H5Pget_chunk( id, max_ndims, dim ); + if( chunk_size < 0 ) + { + throw PropListIException(); + } + return( chunk_size ); +} + +// Sets the type of storage used store the raw data for a dataset. +void DSetCreatPropList::setLayout(hid_t plist, H5D_layout_t layout ) const +{ + herr_t ret_value = H5Pset_layout( id, layout ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +// Sets compression method and compression level +void DSetCreatPropList::setDeflate( int level ) const +{ + herr_t ret_value = H5Pset_deflate( id, level ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +// Sets a dataset fill value +void DSetCreatPropList::setFillValue( DataType& fvalue_type, const void* value ) const +{ + herr_t ret_value = H5Pset_fill_value( id, fvalue_type.getId(), value ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +// Retrieves a dataset fill value +void DSetCreatPropList::getFillValue( DataType& fvalue_type, void* value ) const +{ + herr_t ret_value = H5Pget_fill_value( id, fvalue_type.getId(), value ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +// Adds a filter to the filter pipeline +void DSetCreatPropList::setFilter( H5Z_filter_t filter, unsigned int flags, size_t cd_nelmts, const unsigned int cd_values[] ) const +{ + herr_t ret_value = H5Pset_filter( id, filter, flags, cd_nelmts, cd_values ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +// Returns the number of filters in the pipeline +int DSetCreatPropList::getNfilters() const +{ + int num_filters = H5Pget_nfilters( id ); + if( num_filters < 0 ) + { + throw PropListIException(); + } + else + return( num_filters ); +} + +// Returns information about a filter in a pipeline +H5Z_filter_t DSetCreatPropList::getFilter( int filter_number, unsigned int& flags, size_t& cd_nelmts, unsigned int* cd_values, size_t namelen, char name[] ) const +{ + H5Z_filter_t filter; + filter = H5Pget_filter( id, filter_number, &flags, &cd_nelmts, cd_values, namelen, name ); + if( filter == H5Z_FILTER_ERROR ) + { + throw PropListIException(); + } + else + return( filter ); +} + +// Adds an external file to the list of external files +void DSetCreatPropList::setExternal( const char* name, off_t offset, hsize_t size ) const +{ + herr_t ret_value = H5Pset_external( id, name, offset, size ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +// Returns the number of external files for a dataset +int DSetCreatPropList::getExternalCount() const +{ + int num_ext_files = H5Pget_external_count( id ); + if( num_ext_files < 0 ) + { + throw PropListIException(); + } + else + return( num_ext_files ); +} + +// Returns information about an external file +void DSetCreatPropList::getExternal( int idx, size_t name_size, char* name, off_t& offset, hsize_t& size ) const +{ + herr_t ret_value = H5Pget_external( id, idx, name_size, name, &offset, &size ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +// Default destructor +DSetCreatPropList::~DSetCreatPropList () {} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5DcreatProp.h b/c++/src/H5DcreatProp.h new file mode 100644 index 0000000..5fa67ee --- /dev/null +++ b/c++/src/H5DcreatProp.h @@ -0,0 +1,73 @@ +#ifndef _H5DSCreatPropList_H +#define _H5DSCreatPropList_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class DSetCreatPropList : public PropList { + public: + static const DSetCreatPropList DEFAULT; + + // Creates a dataset creation property list + DSetCreatPropList() : PropList( H5P_DATASET_CREATE ) {} + + // Copy constructor: creates a copy of a DSetCreatPropList object; + // often used by the compiler when passing by value occurs. + DSetCreatPropList( const DSetCreatPropList& orig ); + + // Copies a dataset creation property list using assignment statement + DSetCreatPropList& operator=( const DSetCreatPropList& rhs ); + + // Sets the type of storage used to store the raw data for the + // dataset that uses this property list + void setLayout(hid_t plist, H5D_layout_t layout ) const; + + // Gets the layout of the raw data storage of the data that uses this + // property list + H5D_layout_t getLayout() const; + + // Sets the size of the chunks used to store a chunked layout dataset. + void setChunk( int ndims, const hsize_t* dim ) const; + + // Retrieves the size of the chunks used to store a chunked layout dataset. + int getChunk( int max_ndims, hsize_t* dim ) const; + + // Sets compression method and compression level + void setDeflate( int level ) const; + + // Sets a dataset fill value + void setFillValue( DataType& fvalue_type, const void* value ) const; + + // Retrieves a dataset fill value + void getFillValue( DataType& fvalue_type, void* value ) const; + + // Adds a filter to the filter pipeline + void setFilter( H5Z_filter_t filter, unsigned int flags, size_t cd_nelmts, const unsigned int cd_values[] ) const; + + // Returns the number of filters in the pipeline + int getNfilters() const; + + // Returns information about a filter in a pipeline + H5Z_filter_t getFilter( int filter_number, unsigned int& flags, size_t& cd_nelmts, unsigned int* cd_values, size_t namelen, char name[] ) const; + + // Adds an external file to the list of external files + void setExternal( const char* name, off_t offset, hsize_t size ) const; + + // Returns the number of external files for a dataset + int getExternalCount() const; + + // Returns information about an external file + void getExternal( int idx, size_t name_size, char* name, off_t& offset, hsize_t& size ) const; + + // Creates a copy of an existing dataset creation property list + // using the property list id + DSetCreatPropList( const hid_t plist_id ) : PropList( plist_id ) {} + + // Default destructor + virtual ~DSetCreatPropList(); +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5DxferProp.C b/c++/src/H5DxferProp.C new file mode 100644 index 0000000..ff96b66 --- /dev/null +++ b/c++/src/H5DxferProp.C @@ -0,0 +1,183 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5PropList.h" +#include "H5DxferProp.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +const DSetMemXferPropList DSetMemXferPropList::DEFAULT( H5P_DEFAULT ); + +// Creates a dataset memory and transfer property list +DSetMemXferPropList::DSetMemXferPropList() : PropList( H5P_DATASET_XFER ) {} + +// Copy constructor: makes a copy of the original DSetMemXferPropList object; +DSetMemXferPropList::DSetMemXferPropList( const DSetMemXferPropList& orig ) : PropList( orig ) {} + +// Copies a dataset transfer property list using assignment statement +// Notes: can this be inherited from PropList??? and copy or operator=??? +DSetMemXferPropList& DSetMemXferPropList::operator=( const DSetMemXferPropList& rhs ) +{ + copy (rhs); + return( *this ); +} + +// Sets type conversion and background buffers +void DSetMemXferPropList::setBuffer( size_t size, void* tconv, void* bkg ) const +{ + herr_t ret_value = H5Pset_buffer( id, size, tconv, bkg ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +// Reads buffer settings +size_t DSetMemXferPropList::getBuffer( void** tconv, void** bkg ) const +{ + size_t buffer_size = H5Pget_buffer( id, tconv, bkg ); + if( buffer_size == 0 ) + { + throw PropListIException(); + } + return( buffer_size ); +} + +// Sets the dataset transfer property list status to TRUE or FALSE +void DSetMemXferPropList::setPreserve( bool status ) const +{ + herr_t ret_value = H5Pset_preserve( id, (hbool_t) status ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +// Checks status of the dataset transfer property list +bool DSetMemXferPropList::getPreserve() const +{ + int ret_value = H5Pget_preserve( id ); + if( ret_value > 0 ) + return true; + else if( ret_value == 0 ) + return false; + else + { + throw PropListIException(); + } +} + +// Indicates whether to cache hyperslab blocks during I/O +void DSetMemXferPropList::setHyperCache( bool cache, unsigned limit ) const +{ + herr_t ret_value = H5Pset_hyper_cache( id, cache, limit ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +// Returns information regarding the caching of hyperslab blocks during I/O +void DSetMemXferPropList::getHyperCache( bool& cache, unsigned& limit ) const +{ + unsigned temp_cache; // C routine takes hid_t, unsigned*, unsigned* + herr_t ret_value = H5Pget_hyper_cache( id, &temp_cache, &limit ); + if( ret_value < 0 ) + { + throw PropListIException(); + } + if( temp_cache > 0 ) + cache = true; + else + cache = false; +} + +// Sets B-tree split ratios for a dataset transfer property list +void DSetMemXferPropList::setBtreeRatios( double left, double middle, double right ) const +{ + herr_t ret_value = H5Pset_btree_ratios( id, left, middle, right ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +// Gets B-tree split ratios for a dataset transfer property list +void DSetMemXferPropList::getBtreeRatios( double& left, double& middle, double& right ) const +{ + herr_t ret_value = H5Pget_btree_ratios( id, &left, &middle, &right ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +// Sets the memory manager for variable-length datatype allocation +void DSetMemXferPropList::setVlenMemManager( H5MM_allocate_t alloc_func, void* alloc_info, H5MM_free_t free_func, void* free_info ) const +{ + herr_t ret_value = H5Pset_vlen_mem_manager( id, alloc_func, alloc_info, + free_func, free_info ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +// alloc_func and free_func are set to NULL, indicating that system malloc and +// free are to be used +void DSetMemXferPropList::setVlenMemManager() const +{ + setVlenMemManager( NULL, NULL, NULL, NULL ); + //herr_t ret_value = H5Pset_vlen_mem_manager( id, NULL, NULL, NULL, NULL ); + //if( ret_value < 0 ) + //{ + //throw PropListIException(); + //} +} + +// Gets the memory manager for variable-length datatype allocation +void DSetMemXferPropList::getVlenMemManager( H5MM_allocate_t& alloc_func, void** alloc_info, H5MM_free_t& free_func, void** free_info ) const +{ + herr_t ret_value = H5Pget_vlen_mem_manager( id, &alloc_func, alloc_info, &free_func, free_info ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +/* these two functions are in parallel mode only - not supported at this time. +// Sets the transfer mode +void DSetMemXferPropList::setXfer( H5D_transfer_t data_xfer_mode = H5D_XFER_INDEPENDENT ) const +{ + herr_t ret_value = H5Pset_xfer( ... ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +// Gets the transfer mode +H5D_transfer_t DSetMemXferPropList::getXfer() const +{ + H5D_transfer_t xfer = H5Pget_xfer( id ); +// remove when done - find out what the value is for ?? + if( xfer == ?? ) + { + throw PropListIException(); + } + return( xfer ); +} + +*/ + +// Default destructor +DSetMemXferPropList::~DSetMemXferPropList() {} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5DxferProp.h b/c++/src/H5DxferProp.h new file mode 100644 index 0000000..2e7f51a --- /dev/null +++ b/c++/src/H5DxferProp.h @@ -0,0 +1,77 @@ +#ifndef _H5DSetMemXferPropList_H +#define _H5DSetMemXferPropList_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class DSetMemXferPropList : public PropList { + public: + static const DSetMemXferPropList DEFAULT; + + // Creates a dataset memory and transfer property list + DSetMemXferPropList(); + + // Copy constructor: creates a copy of a DSetMemXferPropList object + DSetMemXferPropList( const DSetMemXferPropList& orig ); + + // Copies a dataset memory and transfer property list using + // assignment statement + DSetMemXferPropList& operator=( const DSetMemXferPropList& rhs ); + + // Sets type conversion and background buffers + void setBuffer( size_t size, void* tconv, void* bkg ) const; + + // Reads buffer settings + size_t getBuffer( void** tconv, void** bkg ) const; + + // Sets the dataset transfer property list status to TRUE or FALSE + void setPreserve( bool status ) const; + + // Checks status of the dataset transfer property list + bool getPreserve() const; + + // Indicates whether to cache hyperslab blocks during I/O + void setHyperCache( bool cache, unsigned limit = 0 ) const; + + // Returns information regarding the caching of hyperslab blocks during I/O + void getHyperCache( bool& cache, unsigned& limit ) const; + + // Sets B-tree split ratios for a dataset transfer property list + void setBtreeRatios( double left, double middle, double right ) const; + + // Gets B-tree split ratios for a dataset transfer property list + void getBtreeRatios( double& left, double& middle, double& right ) const; + + // Sets the memory manager for variable-length datatype + // allocation in H5Dread and H5Dvlen_reclaim + void setVlenMemManager( H5MM_allocate_t alloc, void* alloc_info, + H5MM_free_t free, void* free_info ) const; + + // alloc and free are set to NULL, indicating that system + // malloc and free are to be used + void setVlenMemManager() const; + + // Gets the memory manager for variable-length datatype + // allocation in H5Dread and H5Tvlen_reclaim + void getVlenMemManager( H5MM_allocate_t& alloc, void** alloc_info, + H5MM_free_t& free, void** free_info ) const; + + // Sets the transfer mode - parallel mode, not currently supported + //void setXfer( H5D_transfer_t data_xfer_mode = H5D_XFER_INDEPENDENT ) const; + + // Gets the transfer mode - parallel mode, not currently supported + //H5D_transfer_t getXfer() const; + + // Creates a copy of an existing dataset memory and transfer + // property list using the property list id + DSetMemXferPropList (const hid_t plist_id) : PropList( plist_id ) {} + + // Default destructor + virtual ~DSetMemXferPropList(); + +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5EnumType.C b/c++/src/H5EnumType.C new file mode 100644 index 0000000..303bac5 --- /dev/null +++ b/c++/src/H5EnumType.C @@ -0,0 +1,128 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5AbstractDs.h" +#include "H5DxferProp.h" +#include "H5DataSpace.h" +#include "H5DataType.h" +#include "H5DataSet.h" +#include "H5AtomType.h" +#include "H5IntType.h" +#include "H5EnumType.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Creates an empty enumeration datatype based on a native signed +// integer type. +EnumType::EnumType( size_t size ) : DataType( H5T_ENUM, size ) {} + +// Default constructor +EnumType::EnumType() : DataType() {} + +// Creates a enumeration datatype using an existing id +EnumType::EnumType( const hid_t existing_id ) : DataType( existing_id ) {} + +// Copy constructor: makes a copy of the original EnumType object. +EnumType::EnumType( const EnumType& original ) : DataType( original ) {} + +// Gets the enum datatype of the specified dataset +EnumType::EnumType( const DataSet& dataset ) : DataType() +{ + // Calls C function H5Dget_type to get the id of the datatype + id = H5Dget_type( dataset.getId() ); + + // If the datatype id is not valid, throw an exception + if( id <= 0 ) + { + throw DataSetIException("Getting datatype fails..."); + } +} + +// Creates a new enum datatype based on an integer datatype +EnumType::EnumType( const IntType& data_type ) : DataType() +{ + // Calls C function H5Tenum_create to get the id of the datatype + id = H5Tenum_create( data_type.getId() ); + + // If the datatype id is not valid, throw an exception + if( id <= 0 ) + { + throw DataSetIException("Creating enumeration datatype fails..."); + } +} + +// Inserts a new member to this enumeration datatype. +void EnumType::insert( const string& name, void *value ) const +{ + insert( name.c_str(), value ); +} +void EnumType::insert( const char* name, void *value ) const +{ + // Calls C routine H5Tenum_insert to insert the new enum datatype member. + herr_t ret_value = H5Tenum_insert( id, name, value ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Returns the symbol name corresponding to a specified member of an enumeration datatype. +string EnumType::nameOf( void *value, size_t size ) const +{ + char* name_C = new char[size+1]; // temporary C-string for C API + + // Calls C routine H5Tenum_nameof to get the name of the specified enum type + herr_t ret_value = H5Tenum_nameof( id, value, name_C, size ); + + // If H5Tenum_nameof returns a negative value, raise an exception, + if( ret_value < 0 ) + { + throw DataTypeIException(); + } + // otherwise, create the string to hold the datatype name and return it + string name = string( name_C ); + delete name_C; + return( name ); +} + +// Retrieves the value corresponding to a member of an enumeration +// datatype, given the member's name. +void EnumType::valueOf( const string& name, void *value ) const +{ + valueOf( name.c_str(), value ); +} +void EnumType::valueOf( const char* name, void *value ) const +{ + // Calls C routine H5Tenum_valueof to get the enum datatype value + herr_t ret_value = H5Tenum_valueof( id, name, value ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Retrieves the value of a member in this enumeration datatype, given the +// member's index. +void EnumType::getMemberValue( int memb_no, void *value ) const +{ + // Call C routine H5Tget_member_value to get the datatype member's value + hid_t ret_value = H5Tget_member_value( id, memb_no, value ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Default destructor +EnumType::~EnumType() {} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5EnumType.h b/c++/src/H5EnumType.h new file mode 100644 index 0000000..92583aa --- /dev/null +++ b/c++/src/H5EnumType.h @@ -0,0 +1,51 @@ +#ifndef _H5EnumType_H +#define _H5EnumType_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class EnumType : public DataType { + + public: + // Creates an empty enumeration datatype based on a native signed + // integer type, whose size is given by size. + EnumType( size_t size ); + + // Default constructor + EnumType(); + + // Creates an enumeration datatype using an existing id + EnumType( hid_t existing_id ); + + // Copy constructor: makes a copy of the original EnumType object. + EnumType( const EnumType& original ); + + // Gets the enum datatype of the specified dataset + EnumType( const DataSet& dataset ); // H5Dget_type + + // Creates a new enum datatype based on an integer datatype + EnumType( const IntType& data_type ); // H5Tenum_create + + // Inserts a new member to this enumeration type. + void insert( const string& name, void *value ) const; + void insert( const char* name, void *value ) const; + + // Returns the symbol name corresponding to a specified member + // of this enumeration datatype. + string nameOf( void *value, size_t size ) const; + + // Returns the value corresponding to a specified member of this + // enumeration datatype. + void valueOf( const string& name, void *value ) const; + void valueOf( const char* name, void *value ) const; + + // Returns the value of an enumeration datatype member + void getMemberValue( int memb_no, void *value ) const; + + virtual ~EnumType(); +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5Exception.C b/c++/src/H5Exception.C new file mode 100644 index 0000000..6302fe5 --- /dev/null +++ b/c++/src/H5Exception.C @@ -0,0 +1,188 @@ +#ifdef OLD_HEADER_FILENAME +#include <iostream.h> +#else +#include <iostream> +#endif + +#include "H5Include.h" +#include <string> + +// Added this line for CC to work at this time. Will remove it when +// the problem is fixed. BMR - 10/30/00 + +#include "H5Exception.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +Exception::Exception() : detailMessage("") {} + +Exception::Exception( const char* message) : detailMessage(static_cast<string>(message)) {} + +Exception::Exception( const string& message ) : detailMessage( message ) {} + +// copy constructor +Exception::Exception( const Exception& orig ) +{ + detailMessage = orig.detailMessage; +} + +// Returns the character string that describes an error specified by +// a major error number. +string Exception::getMajorString( H5E_major_t major_num ) const +{ + // calls the C API routine to get the major string - Note: in the + // failure case, the string "Invalid major error number" will be returned. + string major_str( H5Eget_major( major_num )); + return( major_str ); +} + +// Returns the character string that describes an error specified by +// a minor error number. +string Exception::getMinorString( H5E_minor_t minor_num ) const +{ + // calls the C API routine to get the minor string - Note: in the + // failure case, the string "Invalid minor error number" will be returned. + string minor_str( H5Eget_minor( minor_num )); + return( minor_str ); +} + +// Turns on the automatic error printing. +void Exception::setAutoPrint( H5E_auto_t func, void* client_data ) const +{ + // calls the C API routine H5Eset_auto to set the auto printing to + // the specified function. + herr_t ret_value = H5Eset_auto( func, client_data ); + if( ret_value < 0 ) + throw Exception( "setAutoPrint: H5Eset_auto fails" ); +} + +// Turns off the automatic error printing. +void Exception::dontPrint() +{ + // calls the C API routine H5Eset_auto with NULL parameters to turn + // off the automatic error printing. + herr_t ret_value = H5Eset_auto( NULL, NULL ); + if( ret_value < 0 ) + throw Exception( "dontPrint: H5Eset_auto fails" ); +} + +// Retrieves the current settings for the automatic error stack traversal +// function and its data. +void Exception::getAutoPrint( H5E_auto_t& func, void** client_data ) const +{ + // calls the C API routine H5Eget_auto to get the current setting of + // the automatic error printing + herr_t ret_value = H5Eget_auto( &func, client_data ); + if( ret_value < 0 ) + throw Exception( "getAutoPrint: H5Eget_auto fails" ); +} + +// Clears the error stack for the current thread. +void Exception::clearErrorStack() const +{ + // calls the C API routine H5Eclear to clear the error stack + herr_t ret_value = H5Eclear(); + if( ret_value < 0 ) + throw Exception( "clearErrorStack: H5Eclear fails" ); +} + +// Walks the error stack for the current thread, calling the specified function. +void Exception::walkErrorStack( H5E_direction_t direction, H5E_walk_t func, void* client_data ) const +{ + // calls the C API routine H5Ewalk to walk the error stack + herr_t ret_value = H5Ewalk( direction, func, client_data ); + if( ret_value < 0 ) + throw Exception( "walkErrorStack: H5Ewalk fails" ); +} + +// Default error stack traversal callback function that prints error +// messages to the specified output stream. +void Exception::walkDefErrorStack( int n, H5E_error_t& err_desc, void* client_data ) const +{ + // calls the C API routine H5Ewalk_cb to walk the error stack + herr_t ret_value = H5Ewalk_cb( n, &err_desc, client_data ); + if( ret_value < 0 ) + throw Exception( "walkDefErrorStack: H5Ewalk_cb fails" ); +} + +// Returns the detailed message set at the time the exception is thrown +string Exception::getDetailMesg() const +{ + return( detailMessage ); +} + +// Prints the error stack in a default manner. +void Exception::printError( FILE* stream ) const +{ + herr_t ret_value = H5Eprint( NULL ); // print to stderr + if( ret_value < 0 ) + throw Exception( "printError: H5Eprint fails" ); +} + +FileIException::FileIException():Exception(){}; +FileIException::FileIException( string message ): +Exception( message ){}; + +GroupIException::GroupIException():Exception(){}; +GroupIException::GroupIException( string message ): +Exception( message ){}; + +ObjectHeaderException::ObjectHeaderException():Exception(){}; +ObjectHeaderException::ObjectHeaderException( string message ): Exception( message ) {}; + +DataSpaceIException::DataSpaceIException():Exception(){}; +DataSpaceIException::DataSpaceIException( string message ): Exception( message ) {}; + +DataTypeIException::DataTypeIException():Exception(){}; +DataTypeIException::DataTypeIException( string message ): Exception( message ) {}; + +PropListIException::PropListIException():Exception(){}; +PropListIException::PropListIException( string message ): Exception( message ) {}; + +DataSetIException::DataSetIException():Exception(){}; +DataSetIException::DataSetIException( string message ): Exception( message ) {}; + +AttributeIException::AttributeIException():Exception(){}; +AttributeIException::AttributeIException( string message ): Exception( message ) {}; + +FunctionArgumentException::FunctionArgumentException():Exception(){}; +FunctionArgumentException::FunctionArgumentException( string message ): Exception( message ) {}; + +ReferenceException::ReferenceException():Exception(){}; +ReferenceException::ReferenceException( string message ): +Exception( message ) {}; + +DataStorageException::DataStorageException():Exception(){}; +DataStorageException::DataStorageException( string message ): +Exception( message ) {}; + +LibraryIException::LibraryIException():Exception(){}; +LibraryIException::LibraryIException( string message ): +Exception( message ) {}; + +IdComponentException::IdComponentException(): Exception() {}; +IdComponentException::IdComponentException( string message ): Exception( message ) {}; + +// The following are from Java API but not done here: +// AtomException, BtreeException, DataFiltersException, +// ExternalFileListException, FunctionEntryExitException, +// HeapException, InternalErrorException, LowLevelIOException, +// MetaDataCacheException, ResourceUnavailableException, +// SymbolTableException + +File_GroupException::File_GroupException() +{ + // for now, do nothing +} + +File_GroupException::File_GroupException( string message ) +{ + // for now, do nothing +} + + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5Exception.h b/c++/src/H5Exception.h new file mode 100644 index 0000000..69ecf42 --- /dev/null +++ b/c++/src/H5Exception.h @@ -0,0 +1,163 @@ +#ifndef _H5Exception_H +#define _H5Exception_H + +#include <string> + +#ifndef H5_NO_NAMESPACE +namespace H5 { +using namespace std; +#endif + +class Exception { + public: + // Creates an exception with no message + Exception(); + + // Creates an exception with a detailed message + Exception( const string& message ); + + Exception( const char* message); + + // copy constructor + Exception( const Exception& orig ); + + // Returns the character string that describes an error specified by + // a major error number. + string getMajorString( H5E_major_t major_num ) const; + + // Returns the character string that describes an error specified by + // a minor error number. + string getMinorString( H5E_minor_t minor_num ) const; + + // Returns the detailed message set at the time the exception is thrown + string getDetailMesg() const; + + // Turns on the automatic error printing. + void setAutoPrint( H5E_auto_t func, + void* client_data ) const; + + // Turns off the automatic error printing. + static void dontPrint(); + + // Retrieves the current settings for the automatic error stack + // traversal function and its data. + void getAutoPrint( H5E_auto_t& func, + void** client_data ) const; + + // Clears the error stack for the current thread. + void clearErrorStack() const; + + // Walks the error stack for the current thread, calling the + // specified function. + void walkErrorStack( H5E_direction_t direction, + H5E_walk_t func, void* client_data ) const; + + // Default error stack traversal callback function that prints + // error messages to the specified output stream. + void walkDefErrorStack( int n, H5E_error_t& err_desc, + void* client_data ) const; + + // Prints the error stack in a default manner. + //void printError() const; + void printError( FILE* stream = NULL ) const; + + private: + string detailMessage; +}; + +// This exception is privately used in Group and H5File only +class File_GroupException { + public: + File_GroupException(); + File_GroupException( string message ); +}; + +class FileIException : public Exception { + public: + FileIException(); + FileIException( string message ); +}; + +class GroupIException : public Exception { + public: + GroupIException(); + GroupIException( string message ); +}; + +class ObjectHeaderException : public Exception { + public: + ObjectHeaderException(); + ObjectHeaderException( string message ); +}; + +class DataSpaceIException : public Exception { + public: + DataSpaceIException(); + DataSpaceIException( string message ); +}; + +class DataTypeIException : public Exception { + public: + DataTypeIException(); + DataTypeIException( string message ); +}; + +class PropListIException : public Exception { + public: + PropListIException(); + PropListIException( string message ); +}; + +class DataSetIException : public Exception { + public: + DataSetIException(); + DataSetIException( string message ); +}; + +class AttributeIException : public Exception { + public: + AttributeIException(); + AttributeIException( string message ); +}; + +class FunctionArgumentException : public Exception { + public: + FunctionArgumentException(); + FunctionArgumentException( string message ); +}; + +class ReferenceException : public Exception { + public: + ReferenceException(); + ReferenceException( string message ); +}; + +class DataStorageException : public Exception { + public: + DataStorageException(); + DataStorageException( string message ); +}; + +class LibraryIException : public Exception { + public: + LibraryIException(); + LibraryIException( string message ); +}; + +class IdComponentException : public Exception { + public: + IdComponentException(); + IdComponentException( string message ); +}; + +// The following are from Java API but not done here: +// AtomException, BtreeException, DataFiltersException, +// ExternalFilelistException, FunctionEntryExitException, +// HeapException, InternalErrorException, LowLevelIOException, +// MetaDataCacheException, ResourceUnavailableException, +// SymbolTableException +#ifndef H5_NO_NAMESPACE +} +#endif + +#endif // _H5Exception_H diff --git a/c++/src/H5FaccProp.C b/c++/src/H5FaccProp.C new file mode 100644 index 0000000..a59173d --- /dev/null +++ b/c++/src/H5FaccProp.C @@ -0,0 +1,244 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5PropList.h" +#include "H5FaccProp.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +const FileAccPropList FileAccPropList::DEFAULT( H5P_DEFAULT ); + +// Creates a file access property list +FileAccPropList::FileAccPropList() : PropList( H5P_FILE_ACCESS ) {} + +// Copy constructor: makes a copy of the original FileAccPropList object; +FileAccPropList::FileAccPropList( const FileAccPropList& orig ) : PropList( orig ) {} + +// Copies a file access property list using assignment statement +// Notes: can this be inherited from PropList??? and copy or operator=??? +FileAccPropList& FileAccPropList::operator=( const FileAccPropList& rhs ) +{ + copy (rhs); + return( *this ); +} + +/* commented out for 1.3.x, only in 1.2.x +void FileAccPropList::setStdio() const +{ + herr_t ret_value = H5Pset_stdio( id ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +bool FileAccPropList::getStdio() const +{ + herr_t ret_value = H5Pget_stdio( id ); + if( ret_value < 0 ) + return( false ); + else + return( true ); +} + +H5F_driver_t FileAccPropList::getDriver() const +{ + H5F_driver_t driver = H5Pget_driver( id ); + if( driver == H5F_LOW_ERROR ) + { + throw PropListIException(); + } + return( driver ); +} + +void FileAccPropList::setSec2() const +{ + herr_t ret_value = H5Pset_sec2( id ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +bool FileAccPropList::getSec2() const +{ + herr_t ret_value = H5Pget_sec2( id ); + if( ret_value < 0 ) + return( false ); + else + return( true ); +} + +void FileAccPropList::setCore( size_t increment ) const +{ + herr_t ret_value = H5Pset_core( id, increment ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +bool FileAccPropList::getCore( size_t& increment) const +{ + herr_t ret_value = H5Pget_core( id, &increment ); + if( ret_value < 0 ) + return( false ); + else + return( true ); +} + +void FileAccPropList::setFamily( hsize_t memb_size, const FileAccPropList& memb_plist ) const +{ + herr_t ret_value = H5Pset_family( id, memb_size, memb_plist.getId() ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +//Note: working on this return value here. added copy constructor +//that uses PropList copy const. but din't work +// Determines whether the file access property list is set to the family +// driver then retrieves the family member's property list and returns +// true or false +bool FileAccPropList::getFamily( hsize_t& memb_size, FileAccPropList& memb_plist ) const +{ + hid_t memb_plist_id; + herr_t ret_value = H5Pget_family( id, &memb_size, &memb_plist_id ); + if( ret_value < 0 ) + { + memb_plist.setId( 0 ); + return( false ); + } + else + { + memb_plist.setId( memb_plist_id ); + return( true ); + } +} + +void FileAccPropList::setSplit( FileAccPropList& meta_plist, FileAccPropList& raw_plist, const char* meta_ext, const char* raw_ext ) const +{ + hid_t meta_pid = meta_plist.getId(); + hid_t raw_pid = raw_plist.getId(); + herr_t ret_value = H5Pset_split( id, meta_ext, meta_pid, raw_ext, raw_pid ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +void FileAccPropList::setSplit( FileAccPropList& meta_plist, FileAccPropList& raw_plist, const string& meta_ext, const string& raw_ext ) const +{ + setSplit( meta_plist, raw_plist, meta_ext.c_str(), raw_ext.c_str() ); +} + +void FileAccPropList::getSplit( size_t meta_ext_size, string& meta_ext, FileAccPropList& meta_plist, size_t raw_ext_size, string& raw_ext, FileAccPropList& raw_plist ) const +{ + hid_t meta_plist_id, raw_plist_id; // meta-data and raw-data plist ids + char* meta_ext_C = new char[meta_ext_size]; // meta-data extension in C + char* raw_ext_C = new char[raw_ext_size]; // raw-data extension in C + herr_t ret_value = H5Pget_split( id, meta_ext_size, meta_ext_C, + &meta_plist_id, raw_ext_size, raw_ext_C, &raw_plist_id ); + if( ret_value < 0 ) + { + throw PropListIException(); + } + meta_plist.setId( meta_plist_id ); + raw_plist.setId( raw_plist_id ); + raw_ext = string( raw_ext_C ); + meta_ext = string( raw_ext_C ); + delete [] raw_ext_C; + delete [] meta_ext_C; +} +*/ + +void FileAccPropList::setAlignment( hsize_t threshold, hsize_t alignment ) const +{ + herr_t ret_value = H5Pset_alignment( id, threshold, alignment ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +void FileAccPropList::getAlignment( hsize_t& threshold, hsize_t& alignment ) const +{ + herr_t ret_value = H5Pget_alignment( id, &threshold, &alignment ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +/* MPI_Comm and MPI_Info not declared in serial mode so leave these +routines out until C++ API needs to deal with parallel +void FileAccPropList::setMpi( MPI_Comm comm, MPI_Info info ) const +{ + herr_t ret_value = H5Pset_mpi( id, comm, info ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +void FileAccPropList::getMpi( MPI_Comm& comm, MPI_Info& info ) const +{ + herr_t ret_value = H5Pget_mpi( id, &comm, &info ); + if( ret_value < 0 ) + return( false ); + else + return( true ); +} +*/ + +void FileAccPropList::setCache( int mdc_nelmts, int rdcc_nelmts, size_t rdcc_nbytes, double rdcc_w0 ) const +{ + herr_t ret_value = H5Pset_cache( id, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0 ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +void FileAccPropList::getCache( int& mdc_nelmts, int& rdcc_nelmts, size_t& rdcc_nbytes, double& rdcc_w0 ) const +{ + herr_t ret_value = H5Pget_cache( id, &mdc_nelmts, &rdcc_nelmts, &rdcc_nbytes, &rdcc_w0 ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +void FileAccPropList::setGcReferences( unsigned gc_ref ) const +{ + herr_t ret_value = H5Pset_gc_references( id, gc_ref ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +unsigned FileAccPropList::getGcReferences() const +{ + unsigned gc_ref; + + // the name of this routine will be changed to H5Pget_gc_references??? + herr_t ret_value = H5Pget_gc_references( id, &gc_ref ); + if( ret_value < 0 ) + { + throw PropListIException(); + } + return( gc_ref ); +} + +FileAccPropList::~FileAccPropList() {} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5FaccProp.h b/c++/src/H5FaccProp.h new file mode 100644 index 0000000..e632fab --- /dev/null +++ b/c++/src/H5FaccProp.h @@ -0,0 +1,106 @@ +#ifndef _H5FileAccPropList_H +#define _H5FileAccPropList_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// class for file access properties +class FileAccPropList : public PropList { + public: + static const FileAccPropList DEFAULT; + + // Creates a file access property list. + FileAccPropList(); + + // Copy constructor: creates a copy of a FileAccPropList object + FileAccPropList( const FileAccPropList& orig ); + + // Copies a file access property list using assignment statement. + FileAccPropList& operator=( const FileAccPropList& rhs ); + + // Sets the low level file driver to use the functions + // declared in the stdio.h + // void setStdio() const; + + // Determines whether the file access property list is set to the + // stdio driver. + // bool getStdio() const; + + // Sets alignment properties of this file access property list + void setAlignment( hsize_t threshold = 1, hsize_t alignment = 1 ) const; + + // Retrieves the current settings for alignment properties from + // this file access property list. + void getAlignment( hsize_t& threshold, hsize_t& alignment ) const; + + /* MPI stuff not working in serial mode + //void setMpi( MPI_Comm comm, MPI_Info info ) const; + //void getMpi( MPI_Comm& comm, MPI_Info& info ) const; + */ + + // Returns a low-level file driver identifier. + // H5F_driver_t getDriver() const; + + // Sets the low-level file driver to use the declared functions. + // void setSec2() const; + + // Determines whether this file access property list is set to the + // sec2 driver. + // bool getSec2() const; + + // Sets the low-level file driver to use malloc() and free(). + // void setCore( size_t increment ) const; + + // Determines whether this file access property list is set to the + // core driver and retrieves the increment. + // bool getCore( size_t& increment ) const; + + // Sets this file access properties list to the family driver. + // void setFamily( hsize_t memb_size, const FileAccPropList& memb_plist ) const; + + // Determines whether this file access property list is set to the + // family driver and retrieves the member's file access property list. + // bool getFamily( hsize_t& memb_size, FileAccPropList& memb_plist ) const; + + // Sets the meta data cache and raw data chunk cache parameters. + void setCache( int mdc_nelmts, int rdcc_nelmts, size_t rdcc_nbytes, double rdcc_w0 ) const; + + // Retrieves maximum sizes of data caches and the preemption + // policy value. + void getCache( int& mdc_nelmts, int& rdcc_nelmts, size_t& rdcc_nbytes, double& rdcc_w0 ) const; + + // Sets the low-level driver to split meta data from raw data. + // void setSplit( FileAccPropList& meta_plist, FileAccPropList& raw_plist, + // const char* meta_ext = ".meta", const char* raw_ext = ".raw" ) const; + + // void setSplit( FileAccPropList& meta_plist, FileAccPropList& raw_plist, + // const string& meta_ext, const string& raw_ext ) const; + + // Determines whether this file access property list is set to the + // split driver and retrieves the meta-data and raw-data property lists. + // void getSplit( size_t meta_ext_size, string& meta_ext, FileAccPropList& + // meta_plist, size_t raw_ext_size, string& raw_ext, FileAccPropList& + // raw_plist ) const; + + // Proposal: 2 separate functions + //FileAccPropList getMetaPlist( size_t meta_ext_size, char* meta_ext ); + //FileAccPropList getRawPlist( size_t raw_ext_size, char* raw_ext ); + + // Sets garbage collecting references flag. + void setGcReferences( unsigned gc_ref = 0 ) const; + + // Returns garbage collecting references setting. + unsigned getGcReferences() const; + + // Creates a copy of an existing file access property list + // using the property list id + FileAccPropList (const hid_t plist_id) : PropList( plist_id ) {} + + // Default destructor + virtual ~FileAccPropList(); +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5FcreatProp.C b/c++/src/H5FcreatProp.C new file mode 100644 index 0000000..41ec360 --- /dev/null +++ b/c++/src/H5FcreatProp.C @@ -0,0 +1,120 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5PropList.h" +#include "H5FcreatProp.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +const FileCreatPropList FileCreatPropList::DEFAULT( H5P_DEFAULT ); + +// Creates a file create property list +FileCreatPropList::FileCreatPropList() : PropList( H5P_FILE_CREATE ) {} + +// Copy constructor: makes a copy of the original FileCreatPropList object; +FileCreatPropList::FileCreatPropList( const FileCreatPropList& orig ) : PropList( orig ) {} + +// Copies a file create property list using assignment statement +// Notes: can this be inherited from PropList??? and copy or operator=??? +FileCreatPropList& FileCreatPropList::operator=( const FileCreatPropList& rhs ) +{ + copy (rhs); + return( *this ); +} + +void FileCreatPropList::getVersion( + int& boot, int& freelist, int& stab, int& shhdr ) const +{ + herr_t ret_value = H5Pget_version( id, &boot, &freelist, &stab, &shhdr ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +void FileCreatPropList::setUserblock( hsize_t size ) const +{ + herr_t ret_value = H5Pset_userblock( id, size); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +hsize_t FileCreatPropList::getUserblock() const +{ + hsize_t userblock_size; + herr_t ret_value = H5Pget_userblock( id, &userblock_size ); + if( ret_value < 0 ) + { + throw PropListIException(); + } + return( userblock_size ); +} + +void FileCreatPropList::setSizes( size_t sizeof_addr, size_t sizeof_size ) const +{ + herr_t ret_value = H5Pset_sizes( id, sizeof_addr, sizeof_size ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +void FileCreatPropList::getSizes( size_t& sizeof_addr, size_t& sizeof_size ) const +{ + herr_t ret_value = H5Pget_sizes( id, &sizeof_addr, &sizeof_size ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +void FileCreatPropList::setSymk( int ik, int lk ) const +{ + herr_t ret_value = H5Pset_sym_k( id, ik, lk ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +void FileCreatPropList::getSymk( int& ik, int& lk ) const +{ + herr_t ret_value = H5Pget_sym_k( id, &ik, &lk ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} + +void FileCreatPropList::setIstorek( int ik ) const +{ + herr_t ret_value = H5Pset_istore_k( id, ik ); + if( ret_value < 0 ) + { + throw PropListIException(); + } +} +int FileCreatPropList::getIstorek() const +{ + int ik; + herr_t ret_value = H5Pget_istore_k( id, &ik ); + if( ret_value < 0 ) + { + throw PropListIException(); + } + return( ik ); +} + +// Default destructor +FileCreatPropList::~FileCreatPropList() {} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5FcreatProp.h b/c++/src/H5FcreatProp.h new file mode 100644 index 0000000..f40553f --- /dev/null +++ b/c++/src/H5FcreatProp.h @@ -0,0 +1,62 @@ +#ifndef _H5FileCreatPropList_H +#define _H5FileCreatPropList_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// class for file access properties +class FileCreatPropList : public PropList { + public: + static const FileCreatPropList DEFAULT; + + // Creates a file create property list. + FileCreatPropList(); + + // Copy constructor: creates a copy of a FileCreatPropList object + FileCreatPropList( const FileCreatPropList& orig ); + + // Copies a file creation property list using assignment statement + FileCreatPropList& operator=( const FileCreatPropList& rhs ); + + // Retrieves version information for various parts of a file. + void getVersion( int& boot, int& freelist, int& stab, int& shhdr ) const; + + // Sets the userblock size field of a file creation property list. + void setUserblock( hsize_t size ) const; + + // Gets the size of a user block in this file creation property list. + hsize_t getUserblock() const; + + // Sets file size-of addresses and sizes. + void setSizes( size_t sizeof_addr = 4, size_t sizeof_size = 4 ) const; + + // Retrieves the size-of address and size quantities stored in a + // file according to this file creation property list. + void getSizes( size_t& sizeof_addr, size_t& sizeof_size ) const; + + // Sets the size of parameters used to control the symbol table nodes. + void setSymk( int int_nodes_k, int leaf_nodes_k ) const; + + // Retrieves the size of the symbol table B-tree 1/2 rank and the + // symbol table leaf node 1/2 size. + void getSymk( int& int_nodes_k, int& leaf_nodes_k ) const; + + // Sets the size of parameter used to control the B-trees for + // indexing chunked datasets. + void setIstorek( int ik ) const; + + // Returns the 1/2 rank of an indexed storage B-tree. + int getIstorek() const; + + // Creates a copy of an existing file create property list + // using the property list id + FileCreatPropList (const hid_t plist_id) : PropList( plist_id ) {} + + // Default destructor + virtual ~FileCreatPropList(); +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5File.C b/c++/src/H5File.C new file mode 100644 index 0000000..1ccea96 --- /dev/null +++ b/c++/src/H5File.C @@ -0,0 +1,474 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5Idtemplates.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5FaccProp.h" +#include "H5FcreatProp.h" +#include "H5DxferProp.h" +#include "H5DcreatProp.h" +#include "H5Group.h" +#include "H5AbstractDs.h" +#include "H5DataSpace.h" +#include "H5DataSet.h" +#include "H5File.h" +#include "H5Alltypes.h" +#include "H5CommonFG.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Creates or opens an HDF5 file depending on the parameter flags. +H5File::H5File( const string& name, unsigned int flags, const FileCreatPropList& create_plist, const FileAccPropList& access_plist ) : IdComponent() +{ + getFile( name.c_str(), flags, create_plist, access_plist ); +} + +H5File::H5File( const char* name, unsigned int flags, const FileCreatPropList& create_plist, const FileAccPropList& access_plist ) : IdComponent() +{ + getFile( name, flags, create_plist, access_plist ); +} + +// This function is private and contains common code between the +// constructors taking a string or a char* +void H5File::getFile( const char* name, unsigned int flags, const FileCreatPropList& create_plist, const FileAccPropList& access_plist ) +{ + // These bits only set for creation, so if any of them are set, + // create the file. + if( flags & (H5F_ACC_EXCL|H5F_ACC_TRUNC|H5F_ACC_DEBUG )) + { + hid_t create_plist_id = create_plist.getId(); + hid_t access_plist_id = access_plist.getId(); + id = H5Fcreate( name, flags, create_plist_id, access_plist_id ); + } + // Open the file if none of the bits above are set. + else + { + // use create_plist for access plist because of the default argument + hid_t access_plist_id = create_plist.getId(); + id = H5Fopen( name, flags, access_plist_id ); + } + + if( id <= 0 ) // throw an exception when open/create fail + { + throw FileIException(); + } +} + +// Copy constructor: makes a copy of the original H5File object. +H5File::H5File( const H5File& original ) : IdComponent( original ) {} + +// Determines whether a file specified by its name in HDF5 format +bool H5File::isHdf5(const string& name ) +{ + return( isHdf5( name.c_str()) ); +} +bool H5File::isHdf5(const char* name ) +{ + // Calls C routine H5Fis_hdf5 to determine whether the file is in + // HDF5 format. It returns positive value, 0, or negative value + htri_t ret_value = H5Fis_hdf5( name ); + if( ret_value > 0 ) + return true; + else if( ret_value == 0 ) + return false; + else // Raise exception when H5Fis_hdf5 returns a negative value + { + throw FileIException(); + } +} + +// Reopens this file +void H5File::reopen() +{ + // reset the identifier of this H5File - send 'this' in so that + // H5Fclose can be called appropriately + resetIdComponent( this ); + + // call C routine to reopen the file - Note: not sure about this + // does id need to be closed later? which id to be the parameter? + id = H5Freopen( id ); + if( id <= 0 ) // Raise exception when H5Freopen returns a neg value + { + throw FileIException(); + } +} + +// Creates a new group in this file using the template function provided +// in FGtemplates.h +Group H5File::createGroup( const string& name, size_t size_hint ) const +{ + return( createGroup( name.c_str(), size_hint )); +} + +Group H5File::createGroup( const char* name, size_t size_hint ) const +{ + try { + Group group = createGroupT( id, name, size_hint ); + return( group ); + } + catch( File_GroupException error ) + { + throw FileIException(); + } +} + +// Opens an existing group in this file using the template function provided +// in FGtemplates.h +Group H5File::openGroup( const string& name ) const +{ + return( openGroup( name.c_str() )); +} + +Group H5File::openGroup( const char* name ) const +{ + try { + Group group = openGroupT( id, name ); + return( group ); + } + catch( File_GroupException error ) + { + throw FileIException(); + } +} + +// Creates a dataset in this file using the template function +// provided in FGtemplates.h +DataSet H5File::createDataSet( const string& name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist ) const +{ + return( createDataSet( name.c_str(), data_type, data_space, create_plist )); +} + +DataSet H5File::createDataSet( const char* name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist ) const +{ + try { + DataSet dataset = createDataSetT( id, name, data_type, data_space, create_plist ); + return( dataset ); + } + catch( File_GroupException error ) + { + throw FileIException(); + } +} + +// Opens an existing dataset in this file using the template function +// provided in FGtemplates.h +DataSet H5File::openDataSet( const string& name ) const +{ + return( openDataSet( name.c_str() )); +} + +DataSet H5File::openDataSet( const char* name ) const +{ + try { + DataSet dataset = openDataSetT( id, name ); + return( dataset ); + } + catch( File_GroupException error ) + { + throw FileIException(); + } +} + +// This private member function calls the C API H5Topen to open the +// named datatype in this file, and returns the datatype's identifier. +// The function is used by the functions openXxxType's below for +// opening the sub-types +hid_t H5File::p_openDataType( const char* name ) const +{ + // Call C function H5Topen to open the named datatype in this group, + // giving the group id + hid_t datatype_id = H5Topen( id, name ); + + // If the datatype id is valid, return it, otherwise, throw an exception. + if( datatype_id > 0 ) + return( datatype_id ); + else + { + throw FileIException(); + } +} + +// +// The following member functions use the private function +// p_openDataType to open a named datatype in this group +// + +// Opens the named generic datatype in this group. +DataType H5File::openDataType( const string& name ) const +{ + return( openDataType( name.c_str()) ); +} +DataType H5File::openDataType( const char* name ) const +{ + DataType data_type( p_openDataType( name )); + return( data_type ); +} + +// Opens the named enumeration datatype in this group. +EnumType H5File::openEnumType( const string& name ) const +{ + return( openEnumType( name.c_str()) ); +} +EnumType H5File::openEnumType( const char* name ) const +{ + EnumType enum_type( p_openDataType( name )); + return( enum_type ); +} + +// Opens the named compound datatype in this group. +CompType H5File::openCompType( const string& name ) const +{ + return( openCompType( name.c_str()) ); +} +CompType H5File::openCompType( const char* name ) const +{ + CompType comp_type( p_openDataType( name )); + return( comp_type ); +} + +// Opens the named integer datatype in this group. +IntType H5File::openIntType( const string& name ) const +{ + return( openIntType( name.c_str()) ); +} +IntType H5File::openIntType( const char* name ) const +{ + IntType int_type( p_openDataType( name )); + return( int_type ); +} + +// Opens the named floating-point datatype in this group. +FloatType H5File::openFloatType( const string& name ) const +{ + return( openFloatType( name.c_str()) ); +} +FloatType H5File::openFloatType( const char* name ) const +{ + FloatType float_type( p_openDataType( name )); + return( float_type ); +} + +// Opens the named string datatype of this group +StrType H5File::openStrType( const string& name ) const +{ + return( openStrType( name.c_str()) ); +} +StrType H5File::openStrType( const char* name ) const +{ + StrType str_type( p_openDataType( name )); + return( str_type ); +} + +// Returns the creation property list of this file +FileCreatPropList H5File::getCreatePlist() const +{ + hid_t create_plist_id = H5Fget_create_plist( id ); + + // if H5Fget_create_plist returns a valid id, create and return + // the FileCreatPropList object for this property list + if( create_plist_id > 0 ) + { + FileCreatPropList create_plist( create_plist_id ); + return( create_plist ); + } + else + { + throw FileIException(); + } +} + +// Returns the access property list of this file +FileAccPropList H5File::getAccessPlist() const +{ + hid_t access_plist_id = H5Fget_access_plist( id ); + + // if H5Fget_access_plist returns a valid id, create and return + // the FileAccPropList object for this property list + if( access_plist_id > 0 ) + { + FileAccPropList access_plist( access_plist_id ); + return access_plist; + } + else // Raise an exception + { + throw FileIException(); + } +} + +// Creates a link of the specified type from new_name to current_name; +// both names are interpreted relative to this file +void H5File::link( H5G_link_t link_type, const string& curr_name, const string& new_name ) const +{ + link( link_type, curr_name.c_str(), new_name.c_str() ); +} + +void H5File::link( H5G_link_t link_type, const char* curr_name, const char* new_name ) const +{ + try { + linkT( id, link_type, curr_name, new_name ); + } + catch( File_GroupException error ) { + throw FileIException(); + } +} + +// Removes the specified name from this file. +void H5File::unlink( const string& name ) const +{ + unlink( name.c_str()); +} + +void H5File::unlink( const char* name ) const +{ + try { + unlinkT( id, name ); + } + catch( File_GroupException error ) { + throw FileIException(); + } +} + +// Renames an object from this file. +void H5File::move( const string& src, const string& dst ) const +{ + move( src.c_str(), dst.c_str()); +} + +void H5File::move( const char* src, const char* dst ) const +{ + try { + moveT( id, src, dst ); + } + catch( File_GroupException error ) { + throw FileIException(); + } +} + +// Returns information about an object +void H5File::getObjinfo( const string& name, hbool_t follow_link, H5G_stat_t& statbuf ) const +{ + getObjinfo( name, follow_link, statbuf ); +} + +void H5File::getObjinfo( const char* name, hbool_t follow_link, H5G_stat_t& statbuf ) const +{ + try { + getObjinfoT( id, name, follow_link, statbuf ); + } + catch( File_GroupException error ) { + throw FileIException(); + } +} + +// Returns the name of the object that the symbolic link points to. +string H5File::getLinkval( const string& name, size_t size ) const +{ + return( getLinkval( name.c_str(), size )); +} + +string H5File::getLinkval( const char* name, size_t size ) const +{ + try { + string value = getLinkvalT( id, name, size ); + return( value ); + } + catch( File_GroupException error ) { + throw FileIException(); + } +} + +// Sets comment for specified object. +void H5File::setComment( const string& name, const string& comment ) const +{ + setComment( name.c_str(), comment.c_str()); +} + +void H5File::setComment( const char* name, const char* comment ) const +{ + try { + setCommentT( id, name, comment ); + } + catch( File_GroupException error ) { + throw FileIException(); + } +} + +// Retrieves comment for specified object +string H5File::getComment( const string& name, size_t bufsize ) const +{ + return( getComment( name.c_str(), bufsize )); +} + +string H5File::getComment( const char* name, size_t bufsize ) const +{ + try { + string comment = getCommentT( id, name, bufsize ); + return( comment ); + } + catch( File_GroupException error ) { + throw FileIException(); + } +} + +// Mounts the file 'child' onto this file +void H5File::mount( const string& name, H5File& child, PropList& mount_plist ) const +{ + mount( name.c_str(), child, mount_plist ); +} + +void H5File::mount( const char* name, H5File& child, PropList& mount_plist ) const +{ + try { + mountT( id, name, child.getId(), mount_plist ); + } + catch( File_GroupException error ) { + throw FileIException(); + } +} + +// Unmounts the file named 'name' from this parent file +void H5File::unmount( const string& name ) const +{ + unmount( name.c_str() ); +} + +void H5File::unmount( const char* name ) const +{ + try { + unmountT( id, name ); + } + catch( File_GroupException error ) { + throw FileIException(); + } +} + +// Calls the C API H5Fclose to close this file. Used by IdComponent::reset +void H5File::p_close() const +{ + herr_t ret_value = H5Fclose( id ); + if( ret_value < 0 ) + { + throw FileIException(); + } +} + +// The destructor of this instance calls IdComponent::reset to +// reset its identifier - no longer true +// Older compilers (baldric) don't support template member functions +// and IdComponent::reset is one; so at this time, the resetId is not +// a member function so it can be template to work around that problem. +H5File::~H5File() +{ + // The HDF5 file id will be closed properly + resetIdComponent( this ); +} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5File.h b/c++/src/H5File.h new file mode 100644 index 0000000..782a90d --- /dev/null +++ b/c++/src/H5File.h @@ -0,0 +1,132 @@ +#ifndef _H5File_H +#define _H5File_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class H5File : public IdComponent { + public: + // copy constructor: makes a copy of the original H5File object. + H5File(const H5File& original ); + + // Creates or opens an HDF5 file. + H5File( const string& name, unsigned int flags, + const FileCreatPropList& create_plist = FileCreatPropList::DEFAULT, + const FileAccPropList& access_plist = FileAccPropList::DEFAULT ); + H5File( const char* name, unsigned int flags, + const FileCreatPropList& create_plist = FileCreatPropList::DEFAULT, + const FileAccPropList& access_plist = FileAccPropList::DEFAULT ); + + // Sets and gets H5File's data member + //void setId( hid_t new_file_id ); + //hid_t getId() const; + + // Creates a new group in this file + Group createGroup( const string& name, size_t size_hint = 0 ) const; + Group createGroup( const char* name, size_t size_hint = 0 ) const; + + // Opens an existing group in this file + Group openGroup( const string& name ) const; + Group openGroup( const char* name ) const; + + // Determines if a file, specified by its name, is in HDF5 format + static bool isHdf5(const string& name ); + static bool isHdf5(const char* name ); + + // Reopens this file + void reopen(); + + // Creates a new dataset in this file + DataSet createDataSet( const string& name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist = DSetCreatPropList::DEFAULT ) const; + DataSet createDataSet( const char* name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist = DSetCreatPropList::DEFAULT ) const; + + // Opens a existing dataset in this file + DataSet openDataSet( const string& name ) const; + DataSet openDataSet( const char* name ) const; + + // Opens a generic named datatype in this file + DataType openDataType( const string& name ) const; + DataType openDataType( const char* name ) const; + + // Opens a named enumeration datatype in this file + EnumType openEnumType( const string& name ) const; + EnumType openEnumType( const char* name ) const; + + // Opens a named compound datatype in this file + CompType openCompType( const string& name ) const; + CompType openCompType( const char* name ) const; + + // Opens a named integer datatype in this file + IntType openIntType( const string& name ) const; + IntType openIntType( const char* name ) const; + + // Opens a named floating-point datatype in this file + FloatType openFloatType( const string& name ) const; + FloatType openFloatType( const char* name ) const; + + // Opens a named string datatype in this file + StrType openStrType( const string& name ) const; + StrType openStrType( const char* name ) const; + + // Gets the creation property list of this file + FileCreatPropList getCreatePlist() const; + + // Gets the access property list of this file + FileAccPropList getAccessPlist() const; + + // Creates a link from new_name to current_name in this file + void link( H5G_link_t link_type, const string& curr_name, const string& new_name ) const; + void link( H5G_link_t link_type, const char* curr_name, const char* new_name ) const; + + // Removes a name linked to this file + void unlink( const string& name ) const; + void unlink( const char* name ) const; + + // Renames an object within this file + void move( const string& src, const string& dst ) const; + void move( const char* src, const char* dst ) const; + + // Retrieves information about an object given its name and link + void getObjinfo( const string& name, hbool_t follow_link, H5G_stat_t& statbuf ) const; + void getObjinfo( const char* name, hbool_t follow_link, H5G_stat_t& statbuf ) const; + + // Returns the name of the object that the symbolic link 'name' + // points to + string getLinkval( const string& name, size_t size ) const; + string getLinkval( const char* name, size_t size ) const; + + // Sets the comment for an object specified by its name + void setComment( const string& name, const string& comment ) const; + void setComment( const char* name, const char* comment ) const; + + // Gets the comment of an object specified by its name + string getComment( const string& name, size_t bufsize ) const; + string getComment( const char* name, size_t bufsize ) const; + + // Mounts a file, specified by its name, to this file + void mount( const string& name, H5File& child, PropList& plist ) const; + void mount( const char* name, H5File& child, PropList& plist ) const; + + // Unmounts a file, specified by its name, from this file + void unmount( const string& name ) const; + void unmount( const char* name ) const; + + // Used by the API to appropriately close a file + void p_close() const; + + virtual ~H5File(); + + private: + // Common code for member functions openXxxType - templates, maybe??? + hid_t p_openDataType( const char* name ) const; + + // This function is private and contains common code between the + // constructors taking a string or a char* + void getFile( const char* name, unsigned int flags, const FileCreatPropList& create_plist, const FileAccPropList& access_plist ); + +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5FloatType.C b/c++/src/H5FloatType.C new file mode 100644 index 0000000..34275f8 --- /dev/null +++ b/c++/src/H5FloatType.C @@ -0,0 +1,153 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5DataType.h" +#include "H5AbstractDs.h" +#include "H5DxferProp.h" +#include "H5DataSpace.h" +#include "H5AtomType.h" +#include "H5FloatType.h" +#include "H5DataSet.h" +#include "H5PredType.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Default constructor +FloatType::FloatType() {} + +// Creates a floating-point type using a predefined type +FloatType::FloatType( const PredType& pred_type ) : AtomType() +{ + // use DataType::copy to make a copy of this predefined type + copy( pred_type ); +} + +// Creates a floating-point datatype using an existing id +FloatType::FloatType( const hid_t existing_id ) : AtomType( existing_id ) {} + +// Copy constructor: makes a copy of the original FloatType object +FloatType::FloatType( const FloatType& original ) : AtomType( original ){} + +// Gets the floating-point datatype of the specified dataset - will reimplement +FloatType::FloatType( const DataSet& dataset ) : AtomType() +{ + // Calls C function H5Dget_type to get the id of the datatype + id = H5Dget_type( dataset.getId() ); + + if( id <= 0 ) + { + throw DataSetIException(); + } +} + +// Retrieves floating point datatype bit field information. +void FloatType::getFields( size_t& spos, size_t& epos, size_t& esize, size_t& mpos, size_t& msize ) const +{ + herr_t ret_value = H5Tget_fields( id, &spos, &epos, &esize, &mpos, &msize ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Sets locations and sizes of floating point bit fields. +void FloatType::setFields( size_t spos, size_t epos, size_t esize, size_t mpos, size_t msize ) const +{ + herr_t ret_value = H5Tset_fields( id, spos, epos, esize, mpos, msize ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Retrieves the exponent bias of a floating-point type. +size_t FloatType::getEbias() const +{ + size_t ebias = H5Tget_ebias( id ); + // Returns the bias if successful + if( ebias == 0 ) + { + throw DataTypeIException(); + } + return( ebias ); +} + +// Sets the exponent bias of a floating-point type. +void FloatType::setEbias( size_t ebias ) const +{ + herr_t ret_value = H5Tset_ebias( id, ebias ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Retrieves mantissa normalization of a floating-point datatype. +H5T_norm_t FloatType::getNorm( string& norm_string ) const +{ + H5T_norm_t norm = H5Tget_norm( id ); // C routine + // Returns a valid normalization type if successful + if( norm == H5T_NORM_ERROR ) + { + throw DataTypeIException(); + } + if( norm == H5T_NORM_IMPLIED ) + norm_string = "H5T_NORM_IMPLIED (0)"; + else if( norm == H5T_NORM_MSBSET ) + norm_string = "H5T_NORM_MSBSET (1)"; + else if( norm == H5T_NORM_NONE ) + norm_string = "H5T_NORM_NONE (2)"; + return( norm ); +} + +// Sets the mantissa normalization of a floating-point datatype. +void FloatType::setNorm( H5T_norm_t norm ) const +{ + herr_t ret_value = H5Tset_norm( id, norm ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Retrieves the internal padding type for unused bits in floating-point datatypes. +H5T_pad_t FloatType::getInpad( string& pad_string ) const +{ + H5T_pad_t pad_type = H5Tget_inpad( id ); + // Returns a valid padding type if successful + if( pad_type == H5T_PAD_ERROR ) + { + throw DataTypeIException(); + } + if( pad_type == H5T_PAD_ZERO ) + pad_string = "H5T_PAD_ZERO (0)"; + else if( pad_type == H5T_PAD_ONE ) + pad_string = "H5T_PAD_ONE (1)"; + else if( pad_type == H5T_PAD_BACKGROUND ) + pad_string = "H5T_PAD_BACKGROUD (2)"; + return( pad_type ); +} + +// Fills unused internal floating point bits. +void FloatType::setInpad( H5T_pad_t inpad ) const +{ + herr_t ret_value = H5Tset_inpad( id, inpad ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Default destructor +FloatType::~FloatType() {} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5FloatType.h b/c++/src/H5FloatType.h new file mode 100644 index 0000000..cc9efec --- /dev/null +++ b/c++/src/H5FloatType.h @@ -0,0 +1,54 @@ +#ifndef _H5FloatType_H +#define _H5FloatType_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class FloatType : public AtomType { + public: + // default constructor + FloatType(); + + // Creates a floating-point datatype using an existing id + FloatType( hid_t existing_id ); + + // Creates a floating-point type using a predefined type + FloatType( const PredType& pred_type ); + + // Copy constructor: makes a copy of the original FloatType object. + FloatType( const FloatType& original ); + + // Gets the floating-point datatype of the specified dataset + FloatType( const DataSet& dataset ); + + // Retrieves floating point datatype bit field information. + void getFields( size_t& spos, size_t& epos, size_t& esize, size_t& mpos, size_t& msize ) const; + + // Sets locations and sizes of floating point bit fields. + void setFields( size_t spos, size_t epos, size_t esize, size_t mpos, size_t msize ) const; + + // Retrieves the exponent bias of a floating-point type. + size_t getEbias() const; + + // Sets the exponent bias of a floating-point type. + void setEbias( size_t ebias ) const; + + // Retrieves mantissa normalization of a floating-point datatype. + H5T_norm_t getNorm( string& norm_string ) const; + + // Sets the mantissa normalization of a floating-point datatype. + void setNorm( H5T_norm_t norm ) const; + + // Retrieves the internal padding type for unused bits in floating-point datatypes. + H5T_pad_t getInpad( string& pad_string ) const; + + // Fills unused internal floating point bits. + void setInpad( H5T_pad_t inpad ) const; + + virtual ~FloatType(); +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5Group.C b/c++/src/H5Group.C new file mode 100644 index 0000000..c765e37 --- /dev/null +++ b/c++/src/H5Group.C @@ -0,0 +1,382 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5Idtemplates.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5AbstractDs.h" +#include "H5FaccProp.h" +#include "H5FcreatProp.h" +#include "H5DcreatProp.h" +#include "H5DxferProp.h" +#include "H5DataSpace.h" +#include "H5DataSet.h" +#include "H5CommonFG.h" +#include "H5Group.h" +#include "H5File.h" +#include "H5Alltypes.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Default constructor +Group::Group() : H5Object() {} + +// Copy constructor: makes a copy of the original Group object +Group::Group( const Group& original ) : H5Object( original ) {} + +// Creates a new group in this group using the common function +// provided in FGtemplates.h. +Group Group::createGroup( const string& name, size_t size_hint ) +{ + return( createGroup( name.c_str(), size_hint )); +} +Group Group::createGroup( const char* name, size_t size_hint ) +{ + try { + Group group = createGroupT( id, name, size_hint ); + return( group ); + } + catch( File_GroupException error ) + { + throw GroupIException(); + } +} + +// Creates a copy of an existing Group using its id +Group::Group( const hid_t group_id ) : H5Object( group_id ) {}; + +// Opens an existing group in this group using the common function +// provided in FGtemplates.h. +Group Group::openGroup( const string& name ) +{ + return( openGroup( name.c_str() )); +} +Group Group::openGroup( const char* name ) +{ + try { + Group group = openGroupT( id, name ); + return( group ); + } + catch( File_GroupException error ) + { + throw GroupIException(); + } +} + +// Creates a dataset in this group using the common function +// provided in FGtemplates.h +DataSet Group::createDataSet( const string& name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist ) +{ + return( createDataSet( name.c_str(), data_type, data_space, create_plist )); +} +DataSet Group::createDataSet( const char* name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist ) +{ + try { + DataSet dataset = createDataSetT( id, name, data_type, data_space, create_plist ); + return( dataset ); + } + catch( File_GroupException error ) + { + throw GroupIException(); + } +} + +// Opens a dataset in this group using the common function +// provided in FGtemplates.h +DataSet Group::openDataSet( const string& name ) +{ + return( openDataSet( name.c_str() )); +} +DataSet Group::openDataSet( const char* name ) +{ + try { + DataSet dataset = openDataSetT( id, name ); + return( dataset ); + } + catch( File_GroupException error ) + { + throw GroupIException(); + } +} + +// This private member function calls the C API H5Topen to open the +// named datatype and returns the datatype's identifier. The function +// is used by the functions openXxxType's below for opening the sub-types +hid_t Group::p_openDataType( const char* name ) const +{ + // Call C function H5Topen to open the named datatype in this group, + // giving the group id + hid_t datatype_id = H5Topen( id, name ); + + // If the datatype id is valid, return it, otherwise, throw an exception. + if( datatype_id > 0 ) + return( datatype_id ); + else + { + throw GroupIException(); + } +} + +// +// The following member functions use the private function +// p_openDataType to open a named datatype in this group +// + +// Opens the named generic datatype in this group. +DataType Group::openDataType( const string& name ) const +{ + return( openDataType( name.c_str()) ); +} +DataType Group::openDataType( const char* name ) const +{ + DataType data_type( p_openDataType( name )); + return( data_type ); +} + +// Opens the named enumeration datatype in this group. +EnumType Group::openEnumType( const string& name ) const +{ + return( openEnumType( name.c_str()) ); +} +EnumType Group::openEnumType( const char* name ) const +{ + EnumType enum_type( p_openDataType( name )); + return( enum_type ); +} + +// Opens the named compound datatype in this group. +CompType Group::openCompType( const string& name ) const +{ + return( openCompType( name.c_str()) ); +} +CompType Group::openCompType( const char* name ) const +{ + CompType comp_type( p_openDataType( name )); + return( comp_type ); +} + +// Opens the named integer datatype in this group. +IntType Group::openIntType( const string& name ) const +{ + return( openIntType( name.c_str()) ); +} +IntType Group::openIntType( const char* name ) const +{ + IntType int_type( p_openDataType( name )); + return( int_type ); +} + +// Opens the named floating-point datatype in this group. +FloatType Group::openFloatType( const string& name ) const +{ + return( openFloatType( name.c_str()) ); +} +FloatType Group::openFloatType( const char* name ) const +{ + FloatType float_type( p_openDataType( name )); + return( float_type ); +} + +// Opens the named string datatype of this group +StrType Group::openStrType( const string& name ) const +{ + return( openStrType( name.c_str()) ); +} +StrType Group::openStrType( const char* name ) const +{ + StrType str_type( p_openDataType( name )); + return( str_type ); +} + +// Iterates a user's function over the entries of a group. +int Group::iterateElems( const string& name, int *idx, H5G_iterate_t op , void *op_data ) +{ + return( iterateElems( name.c_str(), idx, op, op_data )); +} +int Group::iterateElems( const char* name, int *idx, H5G_iterate_t op , void *op_data ) +{ + int ret_value = H5Giterate( id, name, idx, op, op_data ); + if( ret_value >= 0 ) + return( ret_value ); + else // raise exception when H5Aiterate returns a negative value + { + throw GroupIException(); + } +} + +// Creates a link of the specified type from new_name to current_name; +// both names are interpreted relative to this group. +void Group::link( H5G_link_t link_type, const string& curr_name, const string& new_name ) +{ + link( link_type, curr_name.c_str(), new_name.c_str() ); +} +void Group::link( H5G_link_t link_type, const char* curr_name, const char* new_name ) +{ + try { + linkT( id, link_type, curr_name, new_name ); + } + catch( File_GroupException error ) + { + throw GroupIException(); + } +} + +// Removes the specified name from this group. +void Group::unlink( const string& name ) +{ + unlink( name.c_str() ); +} +void Group::unlink( const char* name ) +{ + try { + unlinkT( id, name ); + } + catch( File_GroupException error ) + { + throw GroupIException(); + } +} + +// Renames an object from this group. +void Group::move( const string& src, const string& dst ) +{ + move( src.c_str(), dst.c_str() ); +} +void Group::move( const char* src, const char* dst ) +{ + try { + moveT( id, src, dst ); + } + catch( File_GroupException error ) + { + throw GroupIException(); + } +} + +// Retrieves information about an object. +void Group::getObjinfo( const string& name, hbool_t follow_link, H5G_stat_t& statbuf ) +{ + getObjinfo( name.c_str(), follow_link, statbuf ); +} +void Group::getObjinfo( const char* name, hbool_t follow_link, H5G_stat_t& statbuf ) +{ + try { + getObjinfoT( id, name, follow_link, statbuf ); + } + catch( File_GroupException error ) + { + throw GroupIException(); + } +} + +// Returns the name of the object that the symbolic link points to. +string Group::getLinkval( const string& name, size_t size ) +{ + return( getLinkval( name.c_str(), size )); +} +string Group::getLinkval( const char* name, size_t size ) +{ + try { + string value = getLinkvalT( id, name, size ); + return( value ); + } + catch( File_GroupException error ) + { + throw GroupIException(); + } +} + +// Sets comment for an object specified by its name. +void Group::setComment( const string& name, const string& comment ) +{ + setComment( name.c_str(), comment ); +} +void Group::setComment( const char* name, const char* comment ) +{ + try { + setCommentT( id, name, comment ); + } + catch( File_GroupException error ) + { + throw GroupIException(); + } +} + +// Retrieves the comment of an object specified by its name +string Group::getComment( const string& name, size_t bufsize ) +{ + return( getComment( name.c_str(), bufsize )); +} +string Group::getComment( const char* name, size_t bufsize ) +{ + try { + string comment = getCommentT( id, name, bufsize ); + return( comment ); + } + catch( File_GroupException error ) + { + throw GroupIException(); + } +} + +// Mounts the file 'child' onto this group. +void Group::mount( const string& name, H5File& child, PropList& plist ) +{ + mount( name.c_str(), child, plist ); +} +void Group::mount( const char* name, H5File& child, PropList& plist ) +{ + try { + mountT( id, name, child.getId(), plist ); + } + catch( File_GroupException error ) + { + throw GroupIException(); + } +} + +// Unmounts the file named 'name' from this parent group. +void Group::unmount( const string& name ) +{ + unmount( name.c_str() ); +} +void Group::unmount( const char* name ) +{ + try { + unmountT( id, name ); + } + catch( File_GroupException error ) + { + throw GroupIException(); + } +} + +// Calls the C API H5Gclose to close this group. Used by IdComponent::reset +void Group::p_close() const +{ + herr_t ret_value = H5Gclose( id ); + if( ret_value < 0 ) + { + throw GroupIException(); + } +} + +// The destructor of this instance calls IdComponent::reset to +// reset its identifier - no longer true +// Older compilers (baldric) don't support template member functions +// and IdComponent::reset is one; so at this time, the resetId is not +// a member function so it can be template to work around that problem. +Group::~Group() +{ + // The group id will be closed properly + resetIdComponent( this ); +} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5Group.h b/c++/src/H5Group.h new file mode 100644 index 0000000..6246aa4 --- /dev/null +++ b/c++/src/H5Group.h @@ -0,0 +1,115 @@ +#ifndef _H5Group_H +#define _H5Group_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class Group : public H5Object { + public: + // default constructor + Group(); + + // Copy constructor: makes a copy of the original object + Group( const Group& original ); + + // Creates a group in this group + Group createGroup( const string& name, size_t size_hint = 0 ); + Group createGroup( const char* name, size_t size_hint = 0 ); + + // Opens an existing group in this group + Group openGroup( const string& name ); + Group openGroup( const char* name ); + + // Creates a dataset in this group + DataSet createDataSet( const string& name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist = DSetCreatPropList::DEFAULT ); + DataSet createDataSet( const char* name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist = DSetCreatPropList::DEFAULT ); + + // Opens a dataset in this group + DataSet openDataSet( const string& name ); + DataSet openDataSet( const char* name ); + + // Opens a generic named datatype in this group. + DataType openDataType( const string& name ) const; + DataType openDataType( const char* name ) const; + + // Opens a named enumeration datatype in this group. + EnumType openEnumType( const string& name ) const; + EnumType openEnumType( const char* name ) const; + + // Opens a named compound datatype in this group. + CompType openCompType( const string& name ) const; + CompType openCompType( const char* name ) const; + + // Opens a named integer datatype in this group. + IntType openIntType( const string& name ) const; + IntType openIntType( const char* name ) const; + + // Opens a named floating-point datatype in this group. + FloatType openFloatType( const string& name ) const; + FloatType openFloatType( const char* name ) const; + + // Opens a named string datatype in this group. + StrType openStrType( const string& name ) const; + StrType openStrType( const char* name ) const; + + // Creates a link from new_name to current_name in this group. + void link( H5G_link_t link_type, const string& curr_name, const string& new_name ); + void link( H5G_link_t link_type, const char* curr_name, const char* new_name ); + + // Removes a name linked to this group. + void unlink( const string& name ); + void unlink( const char* name ); + + // Iterates over the elements of this group - not implemented in + // C++ style yet + int iterateElems( const string& name, int *idx, H5G_iterate_t op, void *op_data ); + int iterateElems( const char* name, int *idx, H5G_iterate_t op, void *op_data ); + + // Renames an object within this group. + void move( const string& src, const string& dst ); + void move( const char* src, const char* dst ); + + // Retrieves information about the named object. + void getObjinfo( const string& name, hbool_t follow_link, H5G_stat_t& statbuf ); + void getObjinfo( const char* name, hbool_t follow_link, H5G_stat_t& statbuf ); + + // Returns the name of the object that the symbolic link points to. + string getLinkval( const string& name, size_t size ); + string getLinkval( const char* name, size_t size ); + + // Sets comment for an object specified by its name. + void setComment( const string& name, const string& comment ); + void setComment( const char* name, const char* comment ); + + // Gets the comment of an object specified by its name. + string getComment( const string& name, size_t bufsize ); + string getComment( const char* name, size_t bufsize ); + + // Mounts the file 'child' onto this group. + void mount( const string& name, H5File& child, PropList& plist); + void mount( const char* name, H5File& child, PropList& plist); + + // Unmounts the file named 'name' from this parent group. + void unmount( const string& name ); + void unmount( const char* name ); + + // Used by the API to appropriately close a group + void p_close() const; + + virtual ~Group(); + + // Creates a copy of an existing Group using its id + // (used only by template functions in FGtemplates.h + // to return a Group; will not be published; maybe, use friend???) + Group( const hid_t group_id ); + + private: + // Common code for member functions openXxxType - templates, maybe??? + hid_t p_openDataType( const char* name ) const; + +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5IdComponent.C b/c++/src/H5IdComponent.C new file mode 100644 index 0000000..2b7bff8 --- /dev/null +++ b/c++/src/H5IdComponent.C @@ -0,0 +1,136 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5Library.h" +#include "H5IdComponent.h" +#include "H5Idtemplates.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Default constructor - private +IdComponent::IdComponent() : id( 0 ) +{ + // starts counting object references + ref_count = new RefCounter; +} + +// Constructor that takes an HDF5 object id. It creates an instance +// of IdComponent to hold the HDF5 id +IdComponent::IdComponent( hid_t h5_id ) : id( h5_id ) +{ + // starts counting object references + ref_count = new RefCounter; +} + +// Copy constructor: makes a copy of the original object +IdComponent::IdComponent( const IdComponent& original ) +{ + id = original.id; + ref_count = original.ref_count; // points to the same ref counter + ref_count->increment(); // increment number of references to this id +} + +// Increment reference counter +void IdComponent::incRefCount() { ref_count->increment(); } + +// Decrement reference counter +void IdComponent::decRefCount() { ref_count->decrement(); } + +// Get the reference counter to this identifier +int IdComponent::getCounter() { return( ref_count->getCounter()); } + +// Decrements the reference counter then determines if there are no more +// reference to this object +bool IdComponent::noReference() +{ + if( ref_count->getCounter() > 0 ) + ref_count->decrement(); + return( ref_count->getCounter() == 0 ? true:false ); +} + +/* Assignment operator. + Description: + Reset the identifier of this object so that the HDF5 id can be properly + closed. Copy the new identifier to this object, then increment the + reference counter of the identifier to indicate that another object + is referencing the identifier. +*/ +IdComponent& IdComponent::operator=( const IdComponent& rhs ) +{ + // reset the identifier of this object - resetIdComponent will call the + // appropriate H5xclose to close the id + resetIdComponent( this ); + + // copy the data members from the rhs object + id = rhs.id; + ref_count = rhs.ref_count; // points to the same ref counter + + // increment the reference counter + ref_count->increment(); + + return( *this ); +} + +/* Sets the identifier of this object to a new value + Description: + Reset the current identifier of this object so that the HDF5 + id can be appropriately closed. If only this object references + its identifier, its reference counter will be deleted. A new + reference counter is created for the new HDF5 object id. +*/ +void IdComponent::setId( hid_t new_id ) +{ + // reset the identifier of this object, call appropriate H5Xclose + resetIdComponent( this ); + + id = new_id; + + // starts counting object references + ref_count = new RefCounter; +} + +// Gets the id of this object +hid_t IdComponent::getId () const +{ + return( id ); +} + +// Reset this object by deleting its RefCounter +void IdComponent::reset () +{ + delete ref_count; +} + +// Default destructor +IdComponent::~IdComponent() { + +/* uncomment this block when decide to use dontAtExit or fix the atexit/ + global destructor problem - BMR 11/14/00 + + if( id == NOTATEXIT ) + { + // Call H5Library::close to clean up - temporary solution to avoid the + // trouble of atexit/global destructors + try { + if( H5Library::need_cleanup == true ) + { + H5Library::close(); + H5Library::need_cleanup = false; // reset the boolean just in case + } + } + // catch failure caused by the H5Library operations + catch( LibraryIException error ) + { + error.printError(); + } + } +*/ +} + +#ifndef H5_NO_NAMESPACE +} +#endif diff --git a/c++/src/H5IdComponent.h b/c++/src/H5IdComponent.h new file mode 100644 index 0000000..0ac9996 --- /dev/null +++ b/c++/src/H5IdComponent.h @@ -0,0 +1,95 @@ +#ifndef _IdComponent_H +#define _IdComponent_H + +// IdComponent provides a mechanism to handle +// reference counting for an identifier of any HDF5 object. + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class IdComponent { + public: + // Parent classes must reset the current IdComponent copy + // before setting new id to control reference count + void setId( hid_t new_id ); + + // Pure virtual function so appropriate close function can + // be called by subclasses' for the corresponding object + virtual void p_close() const = 0; + + // Creates an object to hold an HDF5 identifier + IdComponent( hid_t h5_id ); + + // Copy constructor: makes copy of the original IdComponent object. + IdComponent( const IdComponent& original ); + + // Gets the value of IdComponent's data member + hid_t getId () const; + + // Increment reference counter + void incRefCount(); + + // Decrement reference counter + void decRefCount(); + + // Get the reference counter to this identifier + int getCounter(); + + // Decrements the reference counter then determines if there are no more + // reference to this object + bool noReference(); + + // Resets this IdComponent instance + //template <class Type> + //void reset( Type* parent ); + void reset(); + void resetId(); + + // Destructor + virtual ~IdComponent(); + + protected: + hid_t id; // HDF5 object id + RefCounter* ref_count; // used to keep track of the + // number of copies of an object + + // Assignment operator + IdComponent& operator=( const IdComponent& rhs ); + + // Default constructor + IdComponent(); + +}; // end class IdComponent + +// BMR - including template member function implementation here to +// prevent compilation errors. When the compilers support template +// member functions in *.C files, move them to IdComponent.C. + +// This function makes sure that this IdComponent instance actually +// represents an HDF5 component and that this HDF5 component is no longer +// referenced, then calls the parent function p_close to close the +// appropriate HDF5 component. In addition, this identifier instance +// will delete itself. +// Type is the class of the instance to whom this IdComponent object +// belongs. +/* 11/10/00 - BMR: commented this member function because many compilers + still have no support for member template function. The function is + replaced by resetIdComponent in H5Idtemplates.h +template <class Type> +void IdComponent::reset( Type* parent ) +{ + if( ref_count->noReference()) // ref_count is decremented here + { + if( id > 0 ) + parent->p_close(); // which p_close depends on whom this + // IdComponent object belongs to + delete ref_count; // delete the reference counter + delete this; // this IdComponent object deletes itself + } +} +*/ +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5Idtemplates.h b/c++/src/H5Idtemplates.h new file mode 100644 index 0000000..442ca97 --- /dev/null +++ b/c++/src/H5Idtemplates.h @@ -0,0 +1,30 @@ +#ifndef _Reset_h +#define _Reset_h + +#include "H5IdComponent.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Older compilers (baldric) don't support template member functions +// and IdComponent::reset is one; so at this time, the resetId is not +// a member function so it can be template to work around that problem. + +template <class Type> +void resetIdComponent( + Type* obj ) // pointer to object to be reset +{ + if( obj->noReference()) // ref count of this object is decremented here + { + if( obj->getId() > 0 ) + obj->p_close(); // which p_close depends on whom this + // IdComponent object belongs to + obj->reset(); // delete ref_count from IdComponent + } +} + +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5Include.h b/c++/src/H5Include.h new file mode 100644 index 0000000..c3ff064 --- /dev/null +++ b/c++/src/H5Include.h @@ -0,0 +1,8 @@ +// Added this line for CC to compile at this time. Will remove it when +// the problem of "Multiple declaration for RcsId" is fixed. BMR - 10/30/00 +#ifdef RCSID +#undef RCSID +#endif + +#include <hdf5.h> + diff --git a/c++/src/H5IntType.C b/c++/src/H5IntType.C new file mode 100644 index 0000000..bc1e1bc --- /dev/null +++ b/c++/src/H5IntType.C @@ -0,0 +1,78 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5DataType.h" +#include "H5AbstractDs.h" +#include "H5DxferProp.h" +#include "H5DataSpace.h" +#include "H5AtomType.h" +#include "H5IntType.h" +#include "H5DataSet.h" +#include "H5PredType.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Default constructor +IntType::IntType() {} + +// Copy constructor: makes copy of the original IntType object +IntType::IntType( const IntType& original ) : AtomType( original ) {} + +// Creates a integer type using a predefined type +IntType::IntType( const PredType& pred_type ) : AtomType() +{ + // use DataType::copy to make a copy of this predefined type + copy( pred_type ); +} + +// Creates a integer datatype using an existing id +IntType::IntType( const hid_t existing_id ) : AtomType( existing_id ) {} + +// Gets the integer datatype of the specified dataset - will reimplement +IntType::IntType( const DataSet& dataset ) : AtomType() +{ + // Calls C function H5Dget_type to get the id of the datatype + id = H5Dget_type( dataset.getId() ); + + if( id <= 0 ) + { + throw DataSetIException(); + } +} + +// Retrieves the sign type for an integer type +H5T_sign_t IntType::getSign() const +{ + H5T_sign_t type_sign = H5Tget_sign( id ); // C routine + // Returns a valid sign type if successful + if( type_sign == H5T_SGN_ERROR ) + { + throw DataTypeIException(); + } + return( type_sign ); +} + +// Sets the sign proprety for an integer type. +void IntType::setSign( H5T_sign_t sign ) const +{ + // Call C routine to set the sign property + herr_t ret_value = H5Tset_sign( id, sign ); + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// This destructor terminates access to the datatype +IntType::~IntType() {} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5IntType.h b/c++/src/H5IntType.h new file mode 100644 index 0000000..56c4792 --- /dev/null +++ b/c++/src/H5IntType.h @@ -0,0 +1,36 @@ +#ifndef _H5IntType_H +#define _H5IntType_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif +class IntType : public AtomType { + public: + + // default constructor + IntType(); + + // Creates a integer datatype using an existing id + IntType( hid_t existing_id ); + + // Creates a integer type using a predefined type + IntType( const PredType& pred_type ); + + // Copy constructor: makes copy of IntType object + IntType( const IntType& original ); + + // Gets the integer datatype of the specified dataset + IntType( const DataSet& dataset ); + + // Retrieves the sign type for an integer type + H5T_sign_t getSign() const; + + // Sets the sign proprety for an integer type. + void setSign( H5T_sign_t sign ) const; + + virtual ~IntType(); +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5Library.C b/c++/src/H5Library.C new file mode 100644 index 0000000..ffce037 --- /dev/null +++ b/c++/src/H5Library.C @@ -0,0 +1,67 @@ +#include <string> + +#include "H5Include.h" +#include "H5Exception.h" +#include "H5Library.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// This static variable will be set to true when dontAtExit is called +bool H5Library::need_cleanup = false; + +// Initializes the HDF5 library. +void H5Library::open() +{ + herr_t ret_value = H5open(); + if( ret_value < 0 ) + { + throw LibraryIException(); + } +} + +// Flushes all data to disk, closes files, and cleans up memory. +void H5Library::close() +{ + herr_t ret_value = H5close(); + if( ret_value < 0 ) + { + throw LibraryIException(); + } +} + +// Instructs library not to install atexit cleanup routine +void H5Library::dontAtExit() +{ + herr_t ret_value = H5dont_atexit(); + if( ret_value < 0 ) + { + throw LibraryIException(); + } +} + +// Returns the HDF library release number. +void H5Library::getLibVersion( unsigned& majnum, unsigned& minnum, unsigned& relnum ) +{ + herr_t ret_value = H5get_libversion( &majnum, &minnum, &relnum ); + if( ret_value < 0 ) + { + throw LibraryIException(); + } +} + +// Verifies that the arguments match the version numbers compiled +// into the library +void H5Library::checkVersion( unsigned majnum, unsigned minnum, unsigned relnum ) +{ + herr_t ret_value = H5check_version( majnum, minnum, relnum ); + if( ret_value < 0 ) + { + throw LibraryIException(); + } +} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5Library.h b/c++/src/H5Library.h new file mode 100644 index 0000000..ed2feef --- /dev/null +++ b/c++/src/H5Library.h @@ -0,0 +1,42 @@ +#ifndef _H5Library_H +#define _H5Library_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +#define NOTATEXIT (-10) // just in case the HDF5 library use more + // negative constants. Note: the solution used for the atexit/global + // destructors is not reliable, and desperately needs improvement + // It is not even working, inifiteloop message still printed when + // calling H5close + +class H5Library { + public: + static bool need_cleanup; // indicates if H5close should be called + + // Initializes the HDF5 library. + static void open(); + + // Flushes all data to disk, closes files, and cleans up memory. + static void close(); + + // Instructs library not to install atexit cleanup routine + static void dontAtExit(); + + // Returns the HDF library release number. + static void getLibVersion( unsigned& majnum, unsigned& minnum, unsigned& relnum ); + + // Verifies that the arguments match the version numbers compiled + // into the library + static void checkVersion( unsigned majnum, unsigned minnum, unsigned relnum ); + + private: + // Default constructor - no instance ever created + H5Library() {}; + +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5Object.C b/c++/src/H5Object.C new file mode 100644 index 0000000..82f7849 --- /dev/null +++ b/c++/src/H5Object.C @@ -0,0 +1,168 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5Idtemplates.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5DataType.h" +#include "H5DataSpace.h" +#include "H5AbstractDs.h" +#include "H5Attribute.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// userAttrOpWrpr simply interfaces between the user's function and the +// C library function H5Aiterate; used to resolve the different prototype +// problem. May be moved to Iterator later. +extern "C" herr_t userAttrOpWrpr( hid_t loc_id, const char* attr_name, void* op_data ) +{ + string s_attr_name = string( attr_name ); + UserData4Aiterate* myData = static_cast <UserData4Aiterate *> (op_data); + myData->op( *myData->object, s_attr_name, myData->opData ); + return 0; +} + +// Default constructor - set id to 0 by default here but may be set +// to a valid HDF5 id, if any, by a subclass constructor. +H5Object::H5Object() : IdComponent() {} + +// Constructs an object from an existing HDF5 id +H5Object::H5Object( hid_t object_id ) : IdComponent( object_id ) {} + +// Copy constructor: makes a copy of the original H5Object instance +H5Object::H5Object( const H5Object& original ) : IdComponent( original ) {} + +// Creates an attribute for a group, dataset, or named datatype. +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 = H5Acreate( id, name, type_id, space_id, plist_id ); + + // 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(); + } +} + +// Creates an attribute for a group, dataset, or named datatype. +Attribute H5Object::createAttribute( const string& name, const DataType& data_type, const DataSpace& data_space, const PropList& create_plist ) const +{ + return( createAttribute( name.c_str(), data_type, data_space, create_plist )); +} + +// Opens an attribute given its name; name is given as char* +Attribute H5Object::openAttribute( const char* name ) const +{ + hid_t attr_id = H5Aopen_name( id, name ); + if( attr_id > 0 ) + { + Attribute attr( attr_id ); + return( attr ); + } + else + { + throw AttributeIException(); + } +} + +// Opens an attribute given its name; name is given as string +Attribute H5Object::openAttribute( const string& name ) const +{ + return( openAttribute( name.c_str()) ); +} + +// Opens an attribute given its index. +Attribute H5Object::openAttribute( unsigned int idx ) const +{ + hid_t attr_id = H5Aopen_idx( id, idx ); + if( attr_id > 0 ) + { + Attribute attr( attr_id ); + return( attr ); + } + else + { + throw AttributeIException(); + } +} + +// Iterates a user's function over all the attributes of the dataset +int H5Object::iterateAttrs( attr_operator_t user_op, unsigned * idx, void *op_data ) +{ + // store the user's function and data + UserData4Aiterate* userData = new UserData4Aiterate; + userData->opData = op_data; + userData->idx = idx; + userData->op = user_op; + userData->object = this; + + // call the C library routine H5Aiterate to iterate the attributes + int ret_value = H5Aiterate( id, idx, userAttrOpWrpr, (void *) userData ); + // release memory + delete userData; + + if( ret_value >= 0 ) + return( ret_value ); + else // raise exception when H5Aiterate returns a negative value + { + throw AttributeIException(); + } +} + +// Determines the number of attributes attached to +int H5Object::getNumAttrs() const +{ + int num_attrs = H5Aget_num_attrs( id ); + if( num_attrs < 0 ) + { + throw AttributeIException(); + } + else + return( num_attrs ); +} + +// Removes the named attribute from this object. +void H5Object::removeAttr( const char* name ) const +{ + herr_t ret_value = H5Adelete( id, name ); + if( ret_value < 0 ) + { + throw AttributeIException(); + } +} +void H5Object::removeAttr( const string& name ) const +{ + removeAttr( name.c_str() ); +} + +// Flushes all buffers associated with a file to disk. +void H5Object::flush(H5F_scope_t scope ) const +{ + herr_t ret_value = H5Fflush( id, scope ); + if( ret_value < 0 ) + { + throw FileIException(); + } +} + +// each subclass' destructor calls the template function resetIdComponent() +// to reset the corresponding IdComponent object and close the HDF5 object +// where appropriate. +H5Object::~H5Object() {} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5Object.h b/c++/src/H5Object.h new file mode 100644 index 0000000..65e7119 --- /dev/null +++ b/c++/src/H5Object.h @@ -0,0 +1,88 @@ +#ifndef _H5Object_H +#define _H5Object_H + +#include "H5Classes.h" // constains forward class declarations + +// H5Object is a baseclass. It has these subclasses: +// Group, AbstractDs, and DataType. +// AbstractDs, in turn, has subclasses DataSet and Attribute. +// DataType, in turn, has several specific datatypes as subclasses. + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class H5Object; // forward declaration for UserData4Aiterate + +// Define the operator function pointer for H5Aiterate(). +typedef void (*attr_operator_t)( H5Object& loc/*in*/, + const string attr_name/*in*/, + void *operator_data/*in,out*/); + +class UserData4Aiterate { // user data for attribute iteration + public: + unsigned int* idx; + attr_operator_t op; + void* opData; + H5Object* object; +}; + +// The above part is being moved into Iterator, but not completed + +class H5Object : public IdComponent { + public: + // Pure virtual function so appropriate close function can + // be called by subclasses' for the corresponding HDF5 object + //virtual void p_close() const = 0; + + // Copy constructor: makes copy of an H5Object object. + H5Object( const H5Object& original ); + + // Flushes all buffers associated with this object to disk + void flush( H5F_scope_t scope ) const; + + // Assignment operator + //H5Object& operator=( const H5Object& rhs ); + + // Sets and gets H5Object's data member + //void setId( hid_t new_id ); + //hid_t getId () const; + + // Creates an attribute for a group, dataset, or named datatype. + // PropList is currently not used, so always be default. + Attribute createAttribute( const char* name, const DataType& type, const DataSpace& space, const PropList& create_plist = PropList::DEFAULT ) const; + Attribute createAttribute( const string& name, const DataType& type, const DataSpace& space, const PropList& create_plist = PropList::DEFAULT ) const; + + // Opens an attribute given its name. + Attribute openAttribute( const string& name ) const; + Attribute openAttribute( const char* name ) const; + + // Opens an attribute given its index. + Attribute openAttribute( const unsigned int idx ) const; + + // Iterate user's function over the attributes of this object + int iterateAttrs( attr_operator_t user_op, unsigned* idx = NULL, void* op_data = NULL ); + + // Determines the number of attributes attached to this object. + int getNumAttrs() const; + + // Removes the named attribute from this object. + void removeAttr( const string& name ) const; + void removeAttr( const char* name ) const; + + virtual ~H5Object(); + + protected: + + // Default constructor + H5Object(); + + // Creates a copy of an existing object giving the object id + H5Object( const hid_t object_id ); + +}; /* end class H5Object */ + +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5PredType.C b/c++/src/H5PredType.C new file mode 100644 index 0000000..deada00 --- /dev/null +++ b/c++/src/H5PredType.C @@ -0,0 +1,192 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5DataType.h" +#include "H5AtomType.h" +#include "H5Library.h" +#include "H5PredType.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Default constructor +PredType::PredType() : AtomType() {} + +// creates predefined datatype, so set DataType::is_predtype to true by default +PredType::PredType( const hid_t predtype_id ) : AtomType( predtype_id ) +{ + is_predtype = true; +} + +// Copy constructor: makes a copy of this PredType object. +PredType::PredType( const PredType& original ) : AtomType( original ) {} + +const PredType PredType::NotAtexit; // only for atexit/global dest. problem + +// Definition of pre-defined types +const PredType PredType::C_S1( H5T_C_S1 ); +const PredType PredType::FORTRAN_S1( H5T_FORTRAN_S1 ); + +const PredType PredType::STD_I8BE( H5T_STD_I8BE ); +const PredType PredType::STD_I8LE( H5T_STD_I8LE ); +const PredType PredType::STD_I16BE( H5T_STD_I16BE ); +const PredType PredType::STD_I16LE( H5T_STD_I16LE ); +const PredType PredType::STD_I32BE( H5T_STD_I32BE ); +const PredType PredType::STD_I32LE( H5T_STD_I32LE ); +const PredType PredType::STD_I64BE( H5T_STD_I64BE ); +const PredType PredType::STD_I64LE( H5T_STD_I64LE ); +const PredType PredType::STD_U8BE( H5T_STD_U8BE ); +const PredType PredType::STD_U8LE( H5T_STD_U8LE ); +const PredType PredType::STD_U16BE( H5T_STD_U16BE ); +const PredType PredType::STD_U16LE( H5T_STD_U16LE ); +const PredType PredType::STD_U32BE( H5T_STD_U32BE ); +const PredType PredType::STD_U32LE( H5T_STD_U32LE ); +const PredType PredType::STD_U64BE( H5T_STD_U64BE ); +const PredType PredType::STD_U64LE( H5T_STD_U64LE ); +const PredType PredType::STD_B8BE( H5T_STD_B8BE ); +const PredType PredType::STD_B8LE( H5T_STD_B8LE ); +const PredType PredType::STD_B16BE( H5T_STD_B16BE ); +const PredType PredType::STD_B16LE( H5T_STD_B16LE ); +const PredType PredType::STD_B32BE( H5T_STD_B32BE ); +const PredType PredType::STD_B32LE( H5T_STD_B32LE ); +const PredType PredType::STD_B64BE( H5T_STD_B64BE ); +const PredType PredType::STD_B64LE( H5T_STD_B64LE ); +const PredType PredType::STD_REF_OBJ( H5T_STD_REF_OBJ ); +const PredType PredType::STD_REF_DSETREG( H5T_STD_REF_DSETREG ); + +const PredType PredType::IEEE_F32BE( H5T_IEEE_F32BE ); +const PredType PredType::IEEE_F32LE( H5T_IEEE_F32LE ); +const PredType PredType::IEEE_F64BE( H5T_IEEE_F64BE ); +const PredType PredType::IEEE_F64LE( H5T_IEEE_F64LE ); + +const PredType PredType::UNIX_D32BE( H5T_UNIX_D32BE ); +const PredType PredType::UNIX_D32LE( H5T_UNIX_D32LE ); +const PredType PredType::UNIX_D64BE( H5T_UNIX_D64BE ); +const PredType PredType::UNIX_D64LE( H5T_UNIX_D64LE ); + +const PredType PredType::INTEL_I8( H5T_INTEL_I8 ); +const PredType PredType::INTEL_I16( H5T_INTEL_I16 ); +const PredType PredType::INTEL_I32( H5T_INTEL_I32 ); +const PredType PredType::INTEL_I64( H5T_INTEL_I64 ); +const PredType PredType::INTEL_U8( H5T_INTEL_U8 ); +const PredType PredType::INTEL_U16( H5T_INTEL_U16 ); +const PredType PredType::INTEL_U32( H5T_INTEL_U32 ); +const PredType PredType::INTEL_U64( H5T_INTEL_U64 ); +const PredType PredType::INTEL_B8( H5T_INTEL_B8 ); +const PredType PredType::INTEL_B16( H5T_INTEL_B16 ); +const PredType PredType::INTEL_B32( H5T_INTEL_B32 ); +const PredType PredType::INTEL_B64( H5T_INTEL_B64 ); +const PredType PredType::INTEL_F32( H5T_INTEL_F32 ); +const PredType PredType::INTEL_F64( H5T_INTEL_F64 ); + +const PredType PredType::ALPHA_I8( H5T_ALPHA_I8 ); +const PredType PredType::ALPHA_I16( H5T_ALPHA_I16 ); +const PredType PredType::ALPHA_I32( H5T_ALPHA_I32 ); +const PredType PredType::ALPHA_I64( H5T_ALPHA_I64 ); +const PredType PredType::ALPHA_U8( H5T_ALPHA_U8 ); +const PredType PredType::ALPHA_U16( H5T_ALPHA_U16 ); +const PredType PredType::ALPHA_U32( H5T_ALPHA_U32 ); +const PredType PredType::ALPHA_U64( H5T_ALPHA_U64 ); +const PredType PredType::ALPHA_B8( H5T_ALPHA_B8 ); +const PredType PredType::ALPHA_B16( H5T_ALPHA_B16 ); +const PredType PredType::ALPHA_B32( H5T_ALPHA_B32 ); +const PredType PredType::ALPHA_B64( H5T_ALPHA_B64 ); +const PredType PredType::ALPHA_F32( H5T_ALPHA_F32 ); +const PredType PredType::ALPHA_F64( H5T_ALPHA_F64 ); + +const PredType PredType::MIPS_I8( H5T_MIPS_I8 ); +const PredType PredType::MIPS_I16( H5T_MIPS_I16 ); +const PredType PredType::MIPS_I32( H5T_MIPS_I32 ); +const PredType PredType::MIPS_I64( H5T_MIPS_I64 ); +const PredType PredType::MIPS_U8( H5T_MIPS_U8 ); +const PredType PredType::MIPS_U16( H5T_MIPS_U16 ); +const PredType PredType::MIPS_U32( H5T_MIPS_U32 ); +const PredType PredType::MIPS_U64( H5T_MIPS_U64 ); +const PredType PredType::MIPS_B8( H5T_MIPS_B8 ); +const PredType PredType::MIPS_B16( H5T_MIPS_B16 ); +const PredType PredType::MIPS_B32( H5T_MIPS_B32 ); +const PredType PredType::MIPS_B64( H5T_MIPS_B64 ); +const PredType PredType::MIPS_F32( H5T_MIPS_F32 ); +const PredType PredType::MIPS_F64( H5T_MIPS_F64 ); + +const PredType PredType::NATIVE_CHAR( H5T_NATIVE_CHAR ); +const PredType PredType::NATIVE_INT( H5T_NATIVE_INT ); +const PredType PredType::NATIVE_FLOAT( H5T_NATIVE_FLOAT ); +const PredType PredType::NATIVE_SCHAR( H5T_NATIVE_SCHAR ); +const PredType PredType::NATIVE_UCHAR( H5T_NATIVE_UCHAR ); +const PredType PredType::NATIVE_SHORT( H5T_NATIVE_SHORT ); +const PredType PredType::NATIVE_USHORT( H5T_NATIVE_USHORT ); +const PredType PredType::NATIVE_UINT( H5T_NATIVE_UINT ); +const PredType PredType::NATIVE_LONG( H5T_NATIVE_LONG ); +const PredType PredType::NATIVE_ULONG( H5T_NATIVE_ULONG ); +const PredType PredType::NATIVE_LLONG( H5T_NATIVE_LLONG ); +const PredType PredType::NATIVE_ULLONG( H5T_NATIVE_ULLONG ); +const PredType PredType::NATIVE_DOUBLE( H5T_NATIVE_DOUBLE ); +const PredType PredType::NATIVE_LDOUBLE( H5T_NATIVE_LDOUBLE ); +const PredType PredType::NATIVE_B8( H5T_NATIVE_B8 ); +const PredType PredType::NATIVE_B16( H5T_NATIVE_B16 ); +const PredType PredType::NATIVE_B32( H5T_NATIVE_B32 ); +const PredType PredType::NATIVE_B64( H5T_NATIVE_B64 ); +const PredType PredType::NATIVE_OPAQUE( H5T_NATIVE_OPAQUE ); +const PredType PredType::NATIVE_HSIZE( H5T_NATIVE_HSIZE ); +const PredType PredType::NATIVE_HSSIZE( H5T_NATIVE_HSSIZE ); +const PredType PredType::NATIVE_HERR( H5T_NATIVE_HERR ); +const PredType PredType::NATIVE_HBOOL( H5T_NATIVE_HBOOL ); + +const PredType PredType::NATIVE_INT8( H5T_NATIVE_INT8 ); +const PredType PredType::NATIVE_UINT8( H5T_NATIVE_UINT8 ); +const PredType PredType::NATIVE_INT_LEAST8( H5T_NATIVE_INT_LEAST8 ); +const PredType PredType::NATIVE_UINT_LEAST8( H5T_NATIVE_UINT_LEAST8 ); +const PredType PredType::NATIVE_INT_FAST8( H5T_NATIVE_INT_FAST8 ); +const PredType PredType::NATIVE_UINT_FAST8( H5T_NATIVE_UINT_FAST8 ); + +const PredType PredType::NATIVE_INT16( H5T_NATIVE_INT16 ); +const PredType PredType::NATIVE_UINT16( H5T_NATIVE_UINT16 ); +const PredType PredType::NATIVE_INT_LEAST16( H5T_NATIVE_INT_LEAST16 ); +const PredType PredType::NATIVE_UINT_LEAST16( H5T_NATIVE_UINT_LEAST16 ); +const PredType PredType::NATIVE_INT_FAST16( H5T_NATIVE_INT_FAST16 ); +const PredType PredType::NATIVE_UINT_FAST16( H5T_NATIVE_UINT_FAST16 ); + +const PredType PredType::NATIVE_INT32( H5T_NATIVE_INT32 ); +const PredType PredType::NATIVE_UINT32( H5T_NATIVE_UINT32 ); +const PredType PredType::NATIVE_INT_LEAST32( H5T_NATIVE_INT_LEAST32 ); +const PredType PredType::NATIVE_UINT_LEAST32( H5T_NATIVE_UINT_LEAST32 ); +const PredType PredType::NATIVE_INT_FAST32( H5T_NATIVE_INT_FAST32 ); +const PredType PredType::NATIVE_UINT_FAST32( H5T_NATIVE_UINT_FAST32 ); + +const PredType PredType::NATIVE_INT64( H5T_NATIVE_INT64 ); +const PredType PredType::NATIVE_UINT64( H5T_NATIVE_UINT64 ); +const PredType PredType::NATIVE_INT_LEAST64( H5T_NATIVE_INT_LEAST64 ); +const PredType PredType::NATIVE_UINT_LEAST64( H5T_NATIVE_UINT_LEAST64 ); +const PredType PredType::NATIVE_INT_FAST64( H5T_NATIVE_INT_FAST64 ); +const PredType PredType::NATIVE_UINT_FAST64( H5T_NATIVE_UINT_FAST64 ); + +// These dummy functions do not inherit from DataType - they'll +// throw an DataTypeIException if invoked. +void PredType::commit( H5Object& loc, const char* name ) +{ + throw DataTypeIException( "Attempting to commit a predefined datatype. This operation is invalid" ); +} + +void PredType::commit( H5Object& loc, const string& name ) +{ + commit( loc, name.c_str()); +} + +bool PredType::committed() +{ + throw DataTypeIException( "Attempting to check for commit status on a predefined datatype. This operation is invalid" ); +} + +// Destructor: calls ~AtomType immediately +PredType::~PredType() {} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5PredType.h b/c++/src/H5PredType.h new file mode 100644 index 0000000..15168fb --- /dev/null +++ b/c++/src/H5PredType.h @@ -0,0 +1,181 @@ +// PredType holds the definition of all the HDF5 predefined datatypes. +// These types can only be made copy of, not created by H5Tcreate or +// closed by H5Tclose. They are treated as constants. +///////////////////////////////////////////////////////////////////// + +#ifndef _H5PredType_H +#define _H5PredType_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class PredType : public AtomType { + public: + // Default destructor + virtual ~PredType(); + + // Copy constructor - makes copy of the original object + PredType( const PredType& original ); + + + // Declaration of predefined types; their definition is in Predtype.C + static const PredType STD_I8BE; + static const PredType STD_I8LE; + static const PredType STD_I16BE; + static const PredType STD_I16LE; + static const PredType STD_I32BE; + static const PredType STD_I32LE; + static const PredType STD_I64BE; + static const PredType STD_I64LE; + static const PredType STD_U8BE; + static const PredType STD_U8LE; + static const PredType STD_U16BE; + static const PredType STD_U16LE; + static const PredType STD_U32BE; + static const PredType STD_U32LE; + static const PredType STD_U64BE; + static const PredType STD_U64LE; + static const PredType STD_B8BE; + static const PredType STD_B8LE; + static const PredType STD_B16BE; + static const PredType STD_B16LE; + static const PredType STD_B32BE; + static const PredType STD_B32LE; + static const PredType STD_B64BE; + static const PredType STD_B64LE; + static const PredType STD_REF_OBJ; + static const PredType STD_REF_DSETREG; + + static const PredType C_S1; + static const PredType FORTRAN_S1; + + static const PredType IEEE_F32BE; + static const PredType IEEE_F32LE; + static const PredType IEEE_F64BE; + static const PredType IEEE_F64LE; + + static const PredType UNIX_D32BE; + static const PredType UNIX_D32LE; + static const PredType UNIX_D64BE; + static const PredType UNIX_D64LE; + + static const PredType INTEL_I8; + static const PredType INTEL_I16; + static const PredType INTEL_I32; + static const PredType INTEL_I64; + static const PredType INTEL_U8; + static const PredType INTEL_U16; + static const PredType INTEL_U32; + static const PredType INTEL_U64; + static const PredType INTEL_B8; + static const PredType INTEL_B16; + static const PredType INTEL_B32; + static const PredType INTEL_B64; + static const PredType INTEL_F32; + static const PredType INTEL_F64; + + static const PredType ALPHA_I8; + static const PredType ALPHA_I16; + static const PredType ALPHA_I32; + static const PredType ALPHA_I64; + static const PredType ALPHA_U8; + static const PredType ALPHA_U16; + static const PredType ALPHA_U32; + static const PredType ALPHA_U64; + static const PredType ALPHA_B8; + static const PredType ALPHA_B16; + static const PredType ALPHA_B32; + static const PredType ALPHA_B64; + static const PredType ALPHA_F32; + static const PredType ALPHA_F64; + + static const PredType MIPS_I8; + static const PredType MIPS_I16; + static const PredType MIPS_I32; + static const PredType MIPS_I64; + static const PredType MIPS_U8; + static const PredType MIPS_U16; + static const PredType MIPS_U32; + static const PredType MIPS_U64; + static const PredType MIPS_B8; + static const PredType MIPS_B16; + static const PredType MIPS_B32; + static const PredType MIPS_B64; + static const PredType MIPS_F32; + static const PredType MIPS_F64; + + static const PredType NATIVE_CHAR; + static const PredType NATIVE_SCHAR; + static const PredType NATIVE_UCHAR; + static const PredType NATIVE_SHORT; + static const PredType NATIVE_USHORT; + static const PredType NATIVE_INT; + static const PredType NATIVE_UINT; + static const PredType NATIVE_LONG; + static const PredType NATIVE_ULONG; + static const PredType NATIVE_LLONG; + static const PredType NATIVE_ULLONG; + static const PredType NATIVE_FLOAT; + static const PredType NATIVE_DOUBLE; + static const PredType NATIVE_LDOUBLE; + static const PredType NATIVE_B8; + static const PredType NATIVE_B16; + static const PredType NATIVE_B32; + static const PredType NATIVE_B64; + static const PredType NATIVE_OPAQUE; + static const PredType NATIVE_HSIZE; + static const PredType NATIVE_HSSIZE; + static const PredType NATIVE_HERR; + static const PredType NATIVE_HBOOL; + + static const PredType NATIVE_INT8; + static const PredType NATIVE_UINT8; + static const PredType NATIVE_INT_LEAST8; + static const PredType NATIVE_UINT_LEAST8; + static const PredType NATIVE_INT_FAST8; + static const PredType NATIVE_UINT_FAST8; + + static const PredType NATIVE_INT16; + static const PredType NATIVE_UINT16; + static const PredType NATIVE_INT_LEAST16; + static const PredType NATIVE_UINT_LEAST16; + static const PredType NATIVE_INT_FAST16; + static const PredType NATIVE_UINT_FAST16; + + static const PredType NATIVE_INT32; + static const PredType NATIVE_UINT32; + static const PredType NATIVE_INT_LEAST32; + static const PredType NATIVE_UINT_LEAST32; + static const PredType NATIVE_INT_FAST32; + static const PredType NATIVE_UINT_FAST32; + + static const PredType NATIVE_INT64; + static const PredType NATIVE_UINT64; + static const PredType NATIVE_INT_LEAST64; + static const PredType NATIVE_UINT_LEAST64; + static const PredType NATIVE_INT_FAST64; + static const PredType NATIVE_UINT_FAST64; + + // These dummy functions do not inherit from DataType - they'll + // throw a DataTypeIException if invoked. + void commit( H5Object& loc, const string& name ); + void commit( H5Object& loc, const char* name ); + bool committed(); + + private: + // added this to work around the atexit/global destructor problem + // temporarily - it'll prevent the use of atexit to clean up + static const PredType NotAtexit; + + protected: + // Default constructor + PredType(); + + // Creates a pre-defined type using an HDF5 pre-defined constant + PredType( const hid_t predtype_id ); // used by the library only +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5PropList.C b/c++/src/H5PropList.C new file mode 100644 index 0000000..5279be0 --- /dev/null +++ b/c++/src/H5PropList.C @@ -0,0 +1,103 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5Idtemplates.h" +#include "H5PropList.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +const PropList PropList::DEFAULT( H5P_DEFAULT ); + +// Default constructor - set id to 0 by default here but may be set +// to a valid one, if any, by a subclass constructor. +PropList::PropList() : IdComponent( 0 ) +{ +// id_obj = new IdComponent( 0 ); // init default object's id to 0 +} + +// Creates a new property of specified type +PropList::PropList( H5P_class_t type ) : IdComponent( 0 ) +{ + // call C routine to create the new property + id = H5Pcreate(type ); + if( id <= 0 ) + { + throw PropListIException(); + } +} + +// Copy constructor: makes a copy of the original object +PropList::PropList( const PropList& original ) : IdComponent( original ) {} + +/* Constructor that takes an existing property list id. +Description: + Uses an HDF5 id to create a PropList identifier object. This id + can be either an existing property list id or a default property + list id. Design note: in the case of default property list, + the identifier still has reference counter; the p_close function + will take care of not to call H5Pclose on the default id. +*/ +PropList::PropList( const hid_t plist_id ) : IdComponent( plist_id ) { } + +// Makes a copy of an existing property list +void PropList::copy( const PropList& like_plist ) +{ + // reset the identifier of this PropList - send 'this' in so that + // H5Pclose can be called appropriately + resetIdComponent( this ); + + // call C routine to copy the property list + id = H5Pcopy( like_plist.getId() ); + + // points to the same ref counter + ref_count = like_plist.ref_count; + + // increment ref counter to indicate additional references to this id + ref_count->increment(); + + if( id <= 0 ) + { + throw PropListIException(); + } +} + +// Closes the property list if it is not a default one +void PropList::p_close() const +{ + if( id != H5P_DEFAULT ) // not a constant, should call H5Pclose + { + herr_t ret_value = H5Pclose( id ); + if( ret_value < 0 ) + { + throw PropListIException("PropList::p_close: unable to close the property list. Please report this bug to HDF." ); + } + } +} + +// Returns the class of this property list, i.e. H5P_FILE_CREATE... +H5P_class_t PropList::getClass() const +{ + H5P_class_t plist_class = H5Pget_class( id ); + if( plist_class == H5P_NO_CLASS ) + { + throw PropListIException(); + } + return( plist_class ); +} + +// The destructor of this instance calls the template resetIdComponent to +// reset its identifier +PropList::~PropList() +{ + // The property list id will be closed properly + resetIdComponent( this ); +} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5PropList.h b/c++/src/H5PropList.h new file mode 100644 index 0000000..5e4a656 --- /dev/null +++ b/c++/src/H5PropList.h @@ -0,0 +1,50 @@ +#ifndef _H5PropList_H +#define _H5PropList_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class PropList : public IdComponent { + public: + // Default property list + static const PropList DEFAULT; + + // Creates a property list given the property list type. + PropList( H5P_class_t type ); + + // Default constructor: creates a PropList object - this object + // does not represent any property list yet. + PropList(); + + // Copy constructor: creates a copy of a PropList object. + PropList( const PropList& original ); + + // Makes a copy of the given property list. + void copy( const PropList& like_plist ); + + // Make a copy of the given property list using assignment statement + //PropList& operator=( const PropList& rhs ); + + // Sets and gets PropList's data member + //hid_t getId () const; + //void setId( hid_t new_plist_id ); + + // Gets the class of this property list, i.e. H5P_FILE_CREATE, + // H5P_FILE_ACCESS, ... + H5P_class_t getClass() const; + + // Creates a default property list or creates a copy of an + // existing property list giving the property list id + PropList( const hid_t plist_id ); + + // Used by the API to close the property list + void p_close() const; + + virtual ~PropList(); +}; + +#ifndef H5_NO_NAMESPACE +} +#endif +#endif // _H5PropList_H diff --git a/c++/src/H5RefCounter.C b/c++/src/H5RefCounter.C new file mode 100644 index 0000000..f98f7d1 --- /dev/null +++ b/c++/src/H5RefCounter.C @@ -0,0 +1,35 @@ +#include "H5RefCounter.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +using namespace std; +#endif + +// Creates a reference counter to be used by an HDF5 object +RefCounter::RefCounter() : counter(1) { }; + +// Returns the current value of the reference counter +int RefCounter::getCounter () const { return counter; } + +// Increments the reference counter as a copy of the object that uses +// this counter is created. +void RefCounter::increment() { counter++; } + +// Decrements the reference counter as a copy of the object that uses +// this counter is destroyed. +void RefCounter::decrement() { counter--; } + +// Decrements the reference counter then determines if there are no more +// reference to the object that uses this counter +bool RefCounter::noReference() +{ + if( counter > 0 ) + counter--; + return( counter == 0 ? true:false ); +} + +RefCounter::~RefCounter() {} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5RefCounter.h b/c++/src/H5RefCounter.h new file mode 100644 index 0000000..dec1b3c --- /dev/null +++ b/c++/src/H5RefCounter.h @@ -0,0 +1,29 @@ +#ifndef _H5RefCounter_H +#define _H5RefCounter_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class RefCounter { + public: + // Creates a reference counter to be used by an HDF5 object + RefCounter(); + + int getCounter () const; + void increment(); + void decrement(); + + // this bool function is used to determine whether to close an + // HDF5 object when there are no more reference to that object + bool noReference(); + + ~RefCounter(); + + private: + int counter; // keeps track of number of copies of an object +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5StrType.C b/c++/src/H5StrType.C new file mode 100644 index 0000000..51840db --- /dev/null +++ b/c++/src/H5StrType.C @@ -0,0 +1,103 @@ +#include <string> + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5DataType.h" +#include "H5AtomType.h" +#include "H5AbstractDs.h" +#include "H5DxferProp.h" +#include "H5DataSpace.h" +#include "H5StrType.h" +#include "H5DataSet.h" +#include "H5PredType.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +// Default constructor +StrType::StrType() : AtomType() {} + +// Creates a string type using a predefined type +StrType::StrType( const PredType& pred_type ) : AtomType() +{ + // use DataType::copy to make a copy of this predefined type + copy( pred_type ); +} + +// Creates a string datatype using an existing id +StrType::StrType( const hid_t existing_id ) : AtomType( existing_id ) {} + +// Copy constructor: makes copy of the original StrType object +StrType::StrType( const StrType& original ) : AtomType ( original ) {} + +// Gets the string datatype of the specified dataset - will reimplement +StrType::StrType( const DataSet& dataset ) : AtomType () +{ + // Calls C function H5Dget_type to get the id of the datatype + id = H5Dget_type( dataset.getId() ); + + if( id <= 0 ) + { + throw DataSetIException(); + } +} + +// Retrieves the character set type of a string datatype. +H5T_cset_t StrType::getCset() const +{ + H5T_cset_t cset = H5Tget_cset( id ); + + // Returns a valid character set type if successful + if( cset == H5T_CSET_ERROR ) + { + throw DataTypeIException(); + } + return( cset ); +} + +// Sets character set to be used. +void StrType::setCset( H5T_cset_t cset ) const +{ + herr_t ret_value = H5Tset_cset( id, cset ); + + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// Retrieves the string padding method for a string datatype. +H5T_str_t StrType::getStrpad() const +{ + H5T_str_t strpad = H5Tget_strpad( id ); + + // Returns a valid string padding type if successful + if( strpad == H5T_STR_ERROR ) + { + throw DataTypeIException(); + } + return( strpad ); +} + +// Defines the storage mechanism for character strings. +void StrType::setStrpad( H5T_str_t strpad ) const +{ + herr_t ret_value = H5Tset_strpad( id, strpad ); + + if( ret_value < 0 ) + { + throw DataTypeIException(); + } +} + +// This destructor terminates access to the datatype +StrType::~StrType() {} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5StrType.h b/c++/src/H5StrType.h new file mode 100644 index 0000000..2ba6779 --- /dev/null +++ b/c++/src/H5StrType.h @@ -0,0 +1,42 @@ +#ifndef _H5StrType_H +#define _H5StrType_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +class StrType : public AtomType { + public: + // default constructor + StrType(); + + // Creates a string type using a predefined type + StrType( const PredType& pred_type ); + + // Creates a string datatype using an existing id + StrType( hid_t existing_id ); + + // Copy constructor - makes a copy of the original object + StrType( const StrType& original ); + + // Gets the string datatype of the specified dataset + StrType( const DataSet& dataset ); + + // Retrieves the character set type of this string datatype. + H5T_cset_t getCset() const; + + // Sets character set to be used. + void setCset( H5T_cset_t cset ) const; + + // Retrieves the string padding method for this string datatype. + H5T_str_t getStrpad() const; + + // Defines the storage mechanism for character strings. + void setStrpad( H5T_str_t strpad ) const; + + virtual ~StrType(); +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif |