Merge pull request #671 in HDFFV/hdf5 from ~BMRIBLER/hdf5_bmr_cpp3:develop to develop

New overloaded functions and tests

* commit 'd708dca2831839714be6593b314acd59726b532f':
  New overloaded functions and tests Description:     - Added VarLenType::VarLenType(const DataType& base_type)     - Marked VarLenType::VarLenType(const DataType* base_type) deprecated     - Added a static wrapper for H5Tdetect_class for PredType         static bool DataType::detectClass(const PredType& pred_type, ...)     - Removed the deprecated function Exception::printError() from code     - Miscellaneous improvements in comments     - Added test functions test_detect_type_class() and test_vltype() Platforms tested:     Linux/32 2.6 (jam)     Linux/64 (jelly)     Darwin (osx1010test)
This commit is contained in:
Binh-Minh Ribler 2017-09-13 22:20:56 -05:00
commit a6151aa4f2
19 changed files with 415 additions and 108 deletions

View File

@ -31,7 +31,7 @@ class DataSpace;
and DataSet.
It provides a collection of services that are common to both Attribute
and DataSet. AbstractDs inherits from H5Object.
and DataSet.
*/
class H5_DLLCPP AbstractDs {
public:

View File

@ -24,10 +24,9 @@ class ArrayType;
class VarLenType;
/*! \class CommonFG
\brief \a CommonFG is an abstract base class of H5File and H5Group.
It provides common operations of H5File and H5Group.
\brief \a CommonFG is an abstract base class of H5Group.
*/
/* Note: This class is being deprecated gradually. */
class H5_DLLCPP CommonFG {
public:
// Opens a generic named datatype in this location.
@ -87,3 +86,12 @@ class H5_DLLCPP CommonFG {
#endif // __CommonFG_H
/***************************************************************************
Design Note
===========
September 2017:
This class used to be base class of H5File as well, until the
restructure that moved H5File to be subclass of H5Group.
*/

View File

@ -216,7 +216,6 @@ int CompType::getMemberIndex(const H5std_string& name) const
/// respect to the beginning of the compound data type datum.
///\param member_num - IN: Zero-based index of the member
///\return Byte offset
///\exception H5::DataTypeIException
// Programmer Binh-Minh Ribler - 2000
// Description
/// Members are stored in no particular order with numbers 0

View File

@ -796,6 +796,28 @@ bool DataType::detectClass(H5T_class_t cls) const
}
}
//--------------------------------------------------------------------------
// Function: DataType::detectClass (static)
///\brief Checks whether a predtype is a certain class of datatype.
///\return true if this predtype is the specified type class, and false,
/// otherwise.
///\exception H5::DataTypeIException
// Programmer Binh-Minh Ribler - August, 2017
//--------------------------------------------------------------------------
bool DataType::detectClass(const PredType& pred_type, H5T_class_t cls)
{
htri_t ret_value = H5Tdetect_class(pred_type.getId(), cls);
if (ret_value > 0)
return true;
else if (ret_value == 0)
return false;
else
{
throw DataTypeIException("detectClass on PredType",
"H5Tdetect_class returns negative value");
}
}
//--------------------------------------------------------------------------
// Function: DataType::isVariableStr
///\brief Check whether this datatype is a variable-length string.

View File

@ -114,6 +114,7 @@ class H5_DLLCPP DataType : public H5Object {
// Checks whether this datatype contains (or is) a certain type class.
bool detectClass(H5T_class_t cls) const;
static bool detectClass(const PredType& pred_type, H5T_class_t cls);
// Checks whether this datatype is a variable-length string.
bool isVariableStr() const;

View File

@ -17,6 +17,7 @@
namespace H5 {
// Class forwarding
class DataType;
class DataSpace;

View File

@ -21,7 +21,7 @@ namespace H5 {
\brief Class DSetCreatPropList inherits from PropList and provides
wrappers for the HDF5 dataset memory and transfer property list.
Inheritance: ObjCreatPropList -> PropList -> IdComponent
Inheritance: PropList -> IdComponent
*/
class H5_DLLCPP DSetMemXferPropList : public PropList {
public:

View File

@ -317,11 +317,12 @@ void Exception::printErrorStack(FILE* stream, hid_t err_stack)
// This function can be removed in next major release.
// -BMR, 2014/04/24
// Removed from documentation. -BMR, 2016/03/23
// Removed from code. -BMR, 2017/08/11 1.8.20 and 1.10.2
//--------------------------------------------------------------------------
void Exception::printError(FILE* stream) const
{
Exception::printErrorStack(stream, H5E_DEFAULT);
}
//void Exception::printError(FILE* stream) const
//{
// Exception::printErrorStack(stream, H5E_DEFAULT);
//}
//--------------------------------------------------------------------------
// Function: Exception destructor

View File

@ -70,7 +70,9 @@ class H5_DLLCPP Exception {
// Prints the error stack in a default manner.
static void printErrorStack(FILE* stream = stderr,
hid_t err_stack = H5E_DEFAULT);
virtual void printError(FILE* stream = NULL) const;
// Deprecated in favor of printErrorStack.
// Removed from code. -BMR, 2017/08/11 1.8.20 and 1.10.2
// virtual void printError(FILE* stream = NULL) const;
// Default constructor
Exception();

View File

@ -368,8 +368,10 @@ IdComponent::IdComponent()
// Exception: H5::IdComponentException
// Description:
// This function is protected so that the user applications can
// only have access to its code via allowable classes, namely,
// Attribute and H5Location subclasses.
// only have access to its code via H5Location subclasses.
// September 2017
// This function should be moved to H5Location now that Attribute
// inherits from H5Location.
// Programmer Binh-Minh Ribler - Jul, 2004
//--------------------------------------------------------------------------
H5std_string IdComponent::p_get_file_name() const

View File

@ -93,7 +93,7 @@ bool H5Location::exists(const char* name, const LinkAccPropList& lapl) const
return false;
else // Raise exception when H5Lexists returns a negative value
{
throwException("exists", "H5Lexists failed");
throw LocationException(inMemFunc("exists"), "H5Lexists failed");
}
}
@ -118,7 +118,7 @@ bool H5Location::exists(const H5std_string& name, const LinkAccPropList& lapl) c
/// which can be either of these values:
/// \li \c H5F_SCOPE_GLOBAL - Flushes the entire virtual file
/// \li \c H5F_SCOPE_LOCAL - Flushes only the specified file
///\exception H5::Exception
///\exception H5::LocationException
///\par Description
/// This location is used to identify the file to be flushed.
// Programmer Binh-Minh Ribler - 2012
@ -147,8 +147,8 @@ H5std_string H5Location::getFileName() const
try {
return(p_get_file_name());
}
catch (LocationException& E) {
throw FileIException(inMemFunc("getFileName"), E.getDetailMsg());
catch (IdComponentException& E) {
throw LocationException(inMemFunc("getFileName"), E.getDetailMsg());
}
}
@ -495,7 +495,7 @@ hid_t H5Location::p_dereference(hid_t loc_id, const void* ref, H5R_type_t ref_ty
hid_t temp_id = H5Rdereference2(loc_id, plist_id, ref_type, ref);
if (temp_id < 0)
{
throw ReferenceException(inMemFunc(from_func), "H5Rdereference failed");
throw ReferenceException(inMemFunc(from_func), "H5Rdereference2 failed");
}
return(temp_id);
@ -557,7 +557,7 @@ void H5Location::dereference(const H5Location& loc, const void* ref, H5R_type_t
/// \li \c H5G_TYPE Object - is a named datatype
/// \li \c H5G_LINK - Object is a symbolic link.
/// \li \c H5G_UDLINK - Object is a user-defined link.
///\exception H5::ReferenceException
///\exception H5::LocationException
// Programmer Binh-Minh Ribler - May, 2004
// Modification
// Sep 2012: Moved up from H5File, Group, DataSet, and DataType
@ -717,19 +717,21 @@ DataSpace H5Location::getRegion(void *ref, H5R_type_t ref_type) const
// ***Updated: after HDFFV-9920, methods in classes H5Location and Group
// use throwException to distinguish the FileIException and GroupIException.
// CommonFG is no longer used in the library. Aug 18, 2016 -BMR
// H5Location::throwException is changed to throw LocationException for any
// subclass that is not H5File or Group. Aug 14, 2017 -BMR
// ***Note: following the changes in HDFFV-9920, some of the methods could
// throw different exceptions, but for backward-compatibility, throwException
// is kept in those methods as well. Sep 17, 2016 -BMR
//
//--------------------------------------------------------------------------
// Function: H5Location::createGroup
///\brief Creates a new group at this location which can be a file
/// or another group.
///\brief Creates a new group at this location.
///\param name - IN: Name of the group to create
///\param size_hint - IN: Indicates the number of bytes to reserve for
/// the names that will appear in the group
///\return Group instance
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
///\par Description
/// The optional \a size_hint specifies how much file space to
/// reserve for storing the names that will appear in this new
@ -793,7 +795,7 @@ Group H5Location::createGroup(const H5std_string& name, size_t size_hint) const
/// or another group.
///\param name - IN: Name of the group to open
///\return Group instance
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
// Programmer Binh-Minh Ribler - 2000
//--------------------------------------------------------------------------
Group H5Location::openGroup(const char* name) const
@ -834,7 +836,7 @@ Group H5Location::openGroup(const H5std_string& name) const
///\param data_space - IN: Dataspace for the dataset
///\param create_plist - IN: Creation properly list for the dataset
///\return DataSet instance
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
// Programmer Binh-Minh Ribler - 2000
//--------------------------------------------------------------------------
DataSet H5Location::createDataSet(const char* name, const DataType& data_type, const DataSpace& data_space, const DSetCreatPropList& create_plist) const
@ -874,7 +876,7 @@ DataSet H5Location::createDataSet(const H5std_string& name, const DataType& data
///\brief Opens an existing dataset at this location.
///\param name - IN: Name of the dataset to open
///\return DataSet instance
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
// Programmer Binh-Minh Ribler - 2000
//--------------------------------------------------------------------------
DataSet H5Location::openDataSet(const char* name) const
@ -915,7 +917,7 @@ DataSet H5Location::openDataSet(const H5std_string& name) const
///\param curr_name - IN: Name of the existing object if link is a hard
/// link; can be anything for the soft link
///\param new_name - IN: New name for the object
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
///\par Description
/// Note that both names are interpreted relative to the
/// specified location.
@ -968,7 +970,7 @@ void H5Location::link(H5L_type_t link_type, const H5std_string& curr_name, const
// Function: H5Location::unlink
///\brief Removes the specified name at this location.
///\param name - IN: Name of the object to be removed
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
// Programmer Binh-Minh Ribler - 2000
// Modification
// 2007: QAK modified to use H5L APIs - BMR
@ -997,7 +999,7 @@ void H5Location::unlink(const H5std_string& name) const
///\brief Renames an object at this location.
///\param src - IN: Object's original name
///\param dst - IN: Object's new name
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
///\note
/// Exercise care in moving groups as it is possible to render
/// data in a file inaccessible with H5Location::move. Please refer
@ -1033,7 +1035,7 @@ void H5Location::move(const H5std_string& src, const H5std_string& dst) const
///\param name - IN: Name of the object
///\param follow_link - IN: Link flag
///\param statbuf - OUT: Buffer to return information about the object
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
///\par Description
/// For more information, please refer to the C layer Reference
/// Manual at:
@ -1093,7 +1095,7 @@ void H5Location::getObjinfo(const H5std_string& name, H5G_stat_t& statbuf) const
///\param name - IN: Symbolic link to the object
///\param size - IN: Maximum number of characters of value to be returned
///\return Name of the object
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
// Programmer Binh-Minh Ribler - 2000
//--------------------------------------------------------------------------
H5std_string H5Location::getLinkval(const char* name, size_t size) const
@ -1219,7 +1221,7 @@ void H5Location::mount(const H5std_string& name, const H5File& child, const Prop
// Function: H5Location::unmount
///\brief Unmounts the specified file.
///\param name - IN: Name of the file to unmount
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
// Programmer Binh-Minh Ribler - 2000
//--------------------------------------------------------------------------
void H5Location::unmount(const char* name) const
@ -1255,7 +1257,7 @@ void H5Location::unmount(const H5std_string& name) const
///\return The return value of the first operator that returns non-zero,
/// or zero if all members were processed with no operator
/// returning non-zero.
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
// Programmer Binh-Minh Ribler - 2000
//--------------------------------------------------------------------------
int H5Location::iterateElems(const char* name, int *idx, H5G_iterate_t op , void* op_data)
@ -1304,7 +1306,7 @@ hsize_t H5Location::getNumObjs() const
/// object's index.
///\param idx - IN: Transient index of the object
///\return Object name
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
///\par Description
/// The value of idx can be any nonnegative number less than the
/// total number of objects in the group, which is returned by
@ -1346,7 +1348,7 @@ H5std_string H5Location::getObjnameByIdx(hsize_t idx) const
///\param name - IN/OUT: Retrieved name of the object
///\param size - IN: Length to retrieve
///\return Actual size of the object name or 0, if object has no name
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
///\par Description
/// The value of idx can be any nonnegative number less than the
/// total number of objects in the group, which is returned by
@ -1402,7 +1404,7 @@ ssize_t H5Location::getObjnameByIdx(hsize_t idx, H5std_string& name, size_t size
/// \li \c H5O_TYPE_NAMED_DATATYPE
/// Refer to the C API documentation for more details:
/// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5O.html#Object-GetInfo
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
/// Exception will be thrown when:
/// - an error returned by the C API
/// - object type is not one of the valid values above
@ -1443,7 +1445,7 @@ H5O_type_t H5Location::childObjType(const char* objname) const
///\brief Returns the type of an object in this group, given the
/// object's name.
///\param objname - IN: Name of the object (H5std_string&)
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
// Programmer Binh-Minh Ribler - April, 2014
//--------------------------------------------------------------------------
H5O_type_t H5Location::childObjType(const H5std_string& objname) const
@ -1468,7 +1470,7 @@ H5O_type_t H5Location::childObjType(const H5std_string& objname) const
/// \li \c H5O_TYPE_NAMED_DATATYPE
/// Refer to the C API documentation for more details:
/// http://www.hdfgroup.org/HDF5/doc/RM/RM_H5O.html#Object-GetInfo
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
/// Exception will be thrown when:
/// - an error returned by the C API
/// - object type is not one of the valid values above
@ -1519,7 +1521,7 @@ H5O_type_t H5Location::childObjType(hsize_t index, H5_index_t index_type, H5_ite
///\return Object version, which can have the following values:
/// \li \c H5O_VERSION_1
/// \li \c H5O_VERSION_2
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
/// Exception will be thrown when:
/// - an error returned by the C API
/// - version number is not one of the valid values above
@ -1553,7 +1555,7 @@ unsigned H5Location::childObjVersion(const char* objname) const
///\brief Returns the type of an object in this group, given the
/// object's name.
///\param objname - IN: Name of the object (H5std_string&)
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
// Programmer Binh-Minh Ribler - April, 2014
//--------------------------------------------------------------------------
unsigned H5Location::childObjVersion(const H5std_string& objname) const
@ -1571,7 +1573,7 @@ unsigned H5Location::childObjVersion(const H5std_string& objname) const
/// object's index.
///\param idx - IN: Transient index of the object
///\return Object type
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
// Programmer Binh-Minh Ribler - January, 2003
//--------------------------------------------------------------------------
H5G_obj_t H5Location::getObjTypeByIdx(hsize_t idx) const
@ -1591,7 +1593,7 @@ H5G_obj_t H5Location::getObjTypeByIdx(hsize_t idx) const
///\param idx - IN: Transient index of the object
///\param type_name - OUT: Object type in text
///\return Object type
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
// Programmer Binh-Minh Ribler - May, 2010
// Modification
// Modified to use the other function. -BMR, 2016/03/07
@ -1609,7 +1611,7 @@ H5G_obj_t H5Location::getObjTypeByIdx(hsize_t idx, char* type_name) const
///\param idx - IN: Transient index of the object
///\param type_name - OUT: Object type in text
///\return Object type
///\exception H5::FileIException or H5::GroupIException
///\exception H5::FileIException/H5::GroupIException/H5::LocationException
// Programmer Binh-Minh Ribler - January, 2003
//--------------------------------------------------------------------------
H5G_obj_t H5Location::getObjTypeByIdx(hsize_t idx, H5std_string& type_name) const
@ -1642,10 +1644,15 @@ H5G_obj_t H5Location::getObjTypeByIdx(hsize_t idx, H5std_string& type_name) cons
///\param msg - Message describing the failure
///\exception H5::GroupIException
// Programmer Binh-Minh Ribler - 2000
// Modification
// August 2017 - BMR
// Keep Group::throwException and H5File::throwException to
// maintain backward compatibility. For other subclasses, throw
// LocationException.
//--------------------------------------------------------------------------
void H5Location::throwException(const H5std_string& func_name, const H5std_string& msg) const
{
throwException(func_name, msg);
throw LocationException(inMemFunc(func_name.c_str()), msg);
}
//--------------------------------------------------------------------------

View File

@ -30,9 +30,9 @@ namespace H5 {
Inheritance: IdComponent
*/
// Class forwarding
class H5_DLLCPP ArrayType;
class H5_DLLCPP LinkAccPropList;
class H5_DLLCPP VarLenType;
//class H5_DLLCPP ArrayType;
//class H5_DLLCPP LinkAccPropList;
//class H5_DLLCPP VarLenType;
class H5_DLLCPP H5Location : public IdComponent {
public:
// Checks if a link of a given name exists in a location

View File

@ -391,7 +391,6 @@ void H5Object::renameAttr(const H5std_string& oldname, const H5std_string& newna
renameAttr (oldname.c_str(), newname.c_str());
}
#ifndef DOXYGEN_SHOULD_SKIP_THIS
//--------------------------------------------------------------------------
// Function: getObjName
///\brief Given an id, returns the type of the object.
@ -503,6 +502,7 @@ ssize_t H5Object::getObjName(H5std_string& obj_name, size_t len) const
return(name_size);
}
#ifndef DOXYGEN_SHOULD_SKIP_THIS
//--------------------------------------------------------------------------
// Function: H5Object destructor
///\brief Noop destructor.

View File

@ -39,9 +39,6 @@ namespace H5 {
Inheritance: H5Location -> IdComponent
*/
// Class forwarding
class H5_DLLCPP H5Object;
class H5_DLLCPP Attribute;
// Define the operator function pointer for H5Aiterate().
typedef void (*attr_operator_t)(H5Object& loc/*in*/,
@ -96,13 +93,14 @@ class H5_DLLCPP H5Object : public H5Location {
// Returns an identifier.
virtual hid_t getId() const = 0;
#ifndef DOXYGEN_SHOULD_SKIP_THIS
// Gets the name of this HDF5 object, i.e., Group, DataSet, or
// DataType. These should have const but are retiring anyway.
// DataType.
ssize_t getObjName(char *obj_name, size_t buf_size = 0) const;
ssize_t getObjName(H5std_string& obj_name, size_t len = 0) const;
H5std_string getObjName() const;
#ifndef DOXYGEN_SHOULD_SKIP_THIS
protected:
// Default constructor
H5Object();

View File

@ -17,7 +17,6 @@
namespace H5 {
//! Class PropList provides operations for generic property lists.
/*! \class PropList
\brief Class PropList inherits from IdComponent and provides wrappers for
the HDF5 generic property list.

View File

@ -51,13 +51,14 @@ VarLenType::VarLenType(const VarLenType& original) : DataType(original) {}
//--------------------------------------------------------------------------
// Function: VarLenType overloaded constructor
///\brief Creates a new variable-length datatype based on the specified
/// \a base_type.
///\brief Deprecated - will be removed after 1.10.2
///\param base_type - IN: Pointer to existing datatype
///\exception H5::DataTypeIException
// Description
// DataType passed by pointer to avoid clashing with copy
// constructor.
// Updated: this is unnecessary.
// -BMR, Sep, 2017
// Programmer Binh-Minh Ribler - May, 2004
//--------------------------------------------------------------------------
VarLenType::VarLenType(const DataType* base_type) : DataType()
@ -70,6 +71,24 @@ VarLenType::VarLenType(const DataType* base_type) : DataType()
}
}
//--------------------------------------------------------------------------
// Function: VarLenType overloaded constructor
///\brief Creates a new variable-length datatype based on the specified
/// \a base_type.
///\param base_type - IN: An existing datatype
///\exception H5::DataTypeIException
// Programmer Binh-Minh Ribler - May, 2004
//--------------------------------------------------------------------------
VarLenType::VarLenType(const DataType& base_type) : DataType()
{
id = H5Tvlen_create(base_type.getId());
if (id < 0)
{
throw DataTypeIException("VarLenType constructor",
"H5Tvlen_create returns negative value");
}
}
//--------------------------------------------------------------------------
// Function: VarLenType overloaded constructor
///\brief Creates an VarLenType instance by opening an HDF5 variable

View File

@ -27,6 +27,9 @@ class H5_DLLCPP VarLenType : public DataType {
public:
// Constructor that creates a variable-length datatype based
// on the specified base type.
VarLenType(const DataType& base_type);
// Deprecated - will be removed after 1.10.2
VarLenType(const DataType* base_type);
// Returns an VarLenType object via DataType* by decoding the

View File

@ -12,8 +12,8 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*****************************************************************************
FILE
titerate.cpp - HDF5 C++ testing iterate related functionality
FILE
titerate.cpp - HDF5 C++ testing iterate related functionality
***************************************************************************/
#ifdef OLD_HEADER_FILENAME
@ -94,8 +94,7 @@ int iter_strcmp(const void *s1, const void *s2)
**
****************************************************************/
static herr_t
liter_cb(hid_t H5_ATTR_UNUSED group, const char *name, const H5L_info_t H5_ATTR_UNUSED *link_info,
void *op_data)
liter_cb(hid_t H5_ATTR_UNUSED group, const char *name, const H5L_info_t H5_ATTR_UNUSED *link_info, void *op_data)
{
iter_info *info = (iter_info *)op_data;
static int count = 0;
@ -208,7 +207,7 @@ static void test_iter_group(FileAccPropList& fapl)
H5std_string obj_name;
for (i = 0; i < nobjs; i++)
{
//H5O_info_t oinfo; /* Object info */
//H5O_info_t oinfo; /* Object info */
obj_name = root_group.getObjnameByIdx(i);
//ret = (herr_t)H5Lget_name_by_idx(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, dataset_name, (size_t)NAMELEN, H5P_DEFAULT);
@ -380,23 +379,11 @@ void printelems(const Group& group, const H5std_string& dsname, const H5std_stri
a1.close();
}
// catch failure caused by the DataSpace operations
catch( DataSpaceIException error )
{
error.printError();
}
// catch failure caused by the Group operations
catch( GroupIException error )
{
error.printError();
}
// catch failure caused by the DataSet operations
catch( DataSetIException error )
{
error.printError();
}
// Catch all exceptions and rethrow so caller can handle
catch (Exception& E)
{
throw;
}
}
/*-------------------------------------------------------------------------
@ -413,11 +400,11 @@ void printelems(const Group& group, const H5std_string& dsname, const H5std_stri
*/
static void test_HDFFV_9920()
{
int attr_data[2] = { 100, 200};
hsize_t dims[1] = { DIM1 };
try
{
int attr_data[2] = { 100, 200};
hsize_t dims[1] = { DIM1 };
try
{
// Create a new file and a group in it
H5File file( FILE_NAME, H5F_ACC_TRUNC );
@ -448,31 +435,13 @@ static void test_HDFFV_9920()
printelems(file, FDATASET_NAME, FATTR_NAME);
printelems(gr1, GDATASET_NAME, GATTR_NAME);
} // end of try block
} // end of try block
// catch failure caused by the H5File operations
catch( DataSpaceIException error )
{
error.printError();
}
// catch failure caused by the H5File operations
catch( AttributeIException error )
{
error.printError();
}
// catch failure caused by the H5File operations
catch( FileIException error )
{
error.printError();
}
// catch failure caused by the DataSet operations
catch( DataSetIException error )
{
error.printError();
}
// Catch all failures for handling in the same way
catch (Exception& E)
{
issue_fail_msg("test_HDFFV_9920()", __LINE__, __FILE__, E.getCDetailMsg());
}
}
@ -503,9 +472,9 @@ void test_iterate()
test_iter_group(fapl); // Test iterating groups
test_HDFFV_9920(); // Test the fix of HDFFV-9920
//test_iter_attr(fapl); // Test iterating attributes
//test_iter_attr(fapl); // Test iterating attributes
} // test_iterate
} // test_iterate
/*-------------------------------------------------------------------------
* Function: cleanup_iterate

View File

@ -60,6 +60,7 @@ const char *FILENAME[] = {
"dtypes1.h5",
"dtypes2.h5",
"dtypes3.h5",
"dtypes4.h5",
NULL
};
@ -181,6 +182,279 @@ static void test_copy()
}
}
/*-------------------------------------------------------------------------
* Function: test_detect_type_class
*
* Purpose Test DataType::detectClass()
*
* Return None
*
* Programmer Binh-Minh Ribler (using C version)
* August, 2017
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
typedef struct { /* Struct with atomic fields */
int i;
float f;
char c;
double d;
short s;
} atomic_typ_t;
typedef struct { /* Struct with complex fields */
hobj_ref_t arr_r[3][3];
int i;
hvl_t vl_f;
hvl_t vl_s;
char c;
short s;
} complex_typ_t;
static void test_detect_type_class()
{
SUBTEST("DataType::detectClass()");
try {
bool in_class = false; // indicates whether a datatype is in a class
/*
* Test class of some atomic types.
*/
// Native integers should be in the integer class
in_class = DataType::detectClass(PredType::NATIVE_INT, H5T_INTEGER);
verify_val(in_class, true, "DataType::detectClass() with H5T_INTEGER", __LINE__, __FILE__);
// Native integers should _not_ be in other classes
in_class = DataType::detectClass(PredType::NATIVE_INT, H5T_FLOAT);
verify_val(in_class, false, "DataType::detectClass() with H5T_FLOAT", __LINE__, __FILE__);
in_class = DataType::detectClass(PredType::NATIVE_INT, H5T_ARRAY);
verify_val(in_class, false, "DataType::detectClass() with H5T_ARRAY", __LINE__, __FILE__);
in_class = DataType::detectClass(PredType::NATIVE_INT, H5T_ENUM);
verify_val(in_class, false, "DataType::detectClass() with H5T_ENUM", __LINE__, __FILE__);
/*
* Test class of a compound type with some atomic types as fields.
*/
// Create a compound datatype and insert some atomic types
CompType atom_cmpd(sizeof(atomic_typ_t));
atom_cmpd.insertMember("i", HOFFSET(atomic_typ_t, i), PredType::NATIVE_INT);
atom_cmpd.insertMember("f", HOFFSET(atomic_typ_t, f), PredType::NATIVE_FLOAT);
atom_cmpd.insertMember("c", HOFFSET(atomic_typ_t, c), PredType::NATIVE_CHAR);
atom_cmpd.insertMember("d", HOFFSET(atomic_typ_t, d), PredType::NATIVE_DOUBLE);
atom_cmpd.insertMember("s", HOFFSET(atomic_typ_t, s), PredType::NATIVE_SHORT);
// Make certain that atom_cmpd is a compound type,
in_class = atom_cmpd.detectClass(H5T_COMPOUND);
verify_val(in_class, true, "CompType::detectClass() with H5T_COMPOUND", __LINE__, __FILE__);
// and that it contains a field of type integer
in_class = atom_cmpd.detectClass(H5T_INTEGER);
verify_val(in_class, true, "CompType::detectClass() with H5T_INTEGER", __LINE__, __FILE__);
// and a field of type float,
in_class = atom_cmpd.detectClass(H5T_FLOAT);
verify_val(in_class, true, "CompType::detectClass() with H5T_FLOAT", __LINE__, __FILE__);
// and that it doesn't contain any field of variable-length
in_class = atom_cmpd.detectClass(H5T_VLEN);
verify_val(in_class, false, "CompType::detectClass() with H5T_VLEN", __LINE__, __FILE__);
/*
* Test class of array datatype
*/
// Create an array datatype with an atomic base type
unsigned rank = 2; // Rank for array datatype
hsize_t dims[2] = {3,3}; // Dimensions for array datatype
ArrayType atom_arr(PredType::STD_REF_OBJ, rank, dims);
// Make certain that the correct classes can be detected
in_class = atom_arr.detectClass(H5T_ARRAY);
verify_val(in_class, true, "CompType::detectClass() with H5T_ARRAY", __LINE__, __FILE__);
in_class = atom_arr.detectClass(H5T_REFERENCE);
verify_val(in_class, true, "CompType::detectClass() with H5T_REFERENCE", __LINE__, __FILE__);
// Make certain that an incorrect class is not detected
in_class = atom_arr.detectClass(H5T_VLEN);
verify_val(in_class, false, "CompType::detectClass() with H5T_VLEN", __LINE__, __FILE__);
in_class = atom_arr.detectClass(H5T_FLOAT);
verify_val(in_class, false, "CompType::detectClass() with H5T_FLOAT", __LINE__, __FILE__);
in_class = atom_arr.detectClass(H5T_INTEGER);
verify_val(in_class, false, "CompType::detectClass() with H5T_INTEGER", __LINE__, __FILE__);
/*
* Test class of VL datatype
*/
// Create a VL datatype with an atomic base type of float
VarLenType atom_vlf(PredType::NATIVE_FLOAT);
// Make certain that the correct classes can be detected
in_class = atom_vlf.detectClass(H5T_VLEN);
verify_val(in_class, true, "CompType::detectClass() with H5T_VLEN", __LINE__, __FILE__);
in_class = atom_vlf.detectClass(H5T_FLOAT);
verify_val(in_class, true, "CompType::detectClass() with H5T_FLOAT", __LINE__, __FILE__);
// Make certain that an incorrect class is not detected
in_class = atom_vlf.detectClass(H5T_COMPOUND);
verify_val(in_class, false, "CompType::detectClass() with H5T_COMPOUND", __LINE__, __FILE__);
in_class = atom_vlf.detectClass(H5T_INTEGER);
verify_val(in_class, false, "CompType::detectClass() with H5T_INTEGER", __LINE__, __FILE__);
/*
* Test class of VL datatype
*/
// Create a VL datatype with an atomic base type of char. It should be a VL
// but not a string class.
VarLenType atom_vlc(PredType::NATIVE_CHAR);
// Make certain that the correct classes can be detected
in_class = atom_vlc.detectClass(H5T_VLEN);
verify_val(in_class, true, "CompType::detectClass() with H5T_VLEN", __LINE__, __FILE__);
in_class = atom_vlc.detectClass(H5T_INTEGER);
verify_val(in_class, true, "CompType::detectClass() with H5T_INTEGER", __LINE__, __FILE__);
// Make certain that an incorrect class is not detected
in_class = atom_vlc.detectClass(H5T_STRING);
verify_val(in_class, false, "CompType::detectClass() with H5T_STRING", __LINE__, __FILE__);
/*
* Test class of VL string datatype
*/
// Create a VL string. It should be a string, not a VL class.
StrType atom_vls(0, H5T_VARIABLE);
// Make certain that the correct classes can be detected
in_class = atom_vls.detectClass(H5T_STRING);
verify_val(in_class, true, "CompType::detectClass() with H5T_STRING", __LINE__, __FILE__);
// Make certain that an incorrect class is not detected
in_class = atom_vls.detectClass(H5T_VLEN);
verify_val(in_class, false, "CompType::detectClass() with H5T_VLEN", __LINE__, __FILE__);
/*
* Test class of a compound type with some complex types as fields.
*/
// Create a compound datatype with complex type fields
CompType cplx_cmpd(sizeof(complex_typ_t));
cplx_cmpd.insertMember("arr_r", HOFFSET(complex_typ_t, arr_r), atom_arr);
cplx_cmpd.insertMember("i", HOFFSET(complex_typ_t, i), PredType::NATIVE_INT);
cplx_cmpd.insertMember("vl_f", HOFFSET(complex_typ_t, vl_f), atom_vlf);
cplx_cmpd.insertMember("vl_s", HOFFSET(complex_typ_t, vl_s), atom_vls);
cplx_cmpd.insertMember("c", HOFFSET(complex_typ_t, c), PredType::NATIVE_CHAR);
cplx_cmpd.insertMember("s", HOFFSET(complex_typ_t, s), PredType::NATIVE_SHORT);
// Make certain that the correct classes can be detected
in_class = cplx_cmpd.detectClass(H5T_COMPOUND);
verify_val(in_class, true, "CompType::detectClass() with H5T_COMPOUND", __LINE__, __FILE__);
in_class = cplx_cmpd.detectClass(H5T_ARRAY);
verify_val(in_class, true, "CompType::detectClass() with H5T_ARRAY", __LINE__, __FILE__);
in_class = cplx_cmpd.detectClass(H5T_REFERENCE);
verify_val(in_class, true, "CompType::detectClass() with H5T_REFERENCE", __LINE__, __FILE__);
in_class = cplx_cmpd.detectClass(H5T_INTEGER);
verify_val(in_class, true, "CompType::detectClass() with H5T_INTEGER", __LINE__, __FILE__);
in_class = cplx_cmpd.detectClass(H5T_FLOAT);
verify_val(in_class, true, "CompType::detectClass() with H5T_FLOAT", __LINE__, __FILE__);
in_class = cplx_cmpd.detectClass(H5T_STRING);
verify_val(in_class, true, "CompType::detectClass() with H5T_STRING", __LINE__, __FILE__);
in_class = cplx_cmpd.detectClass(H5T_VLEN);
verify_val(in_class, true, "CompType::detectClass() with H5T_VLEN", __LINE__, __FILE__);
// Make certain that an incorrect class is not detected
in_class = cplx_cmpd.detectClass(H5T_TIME);
verify_val(in_class, false, "CompType::detectClass() with H5T_TIME", __LINE__, __FILE__);
in_class = cplx_cmpd.detectClass(H5T_ENUM);
verify_val(in_class, false, "CompType::detectClass() with H5T_ENUM", __LINE__, __FILE__);
PASSED();
}
catch (Exception& E)
{
issue_fail_msg("test_detect_type_class", __LINE__, __FILE__, E.getCDetailMsg());
}
}
/*-------------------------------------------------------------------------
* Function: test_vltype
*
* Purpose Tests VarLenType class
*
* Return None
*
* Programmer Binh-Minh Ribler (use C version)
* August, 2017
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
static void test_vltype()
{
// Output message about test being performed
SUBTEST("VarLenType functions");
try
{
VarLenType vltype(PredType::NATIVE_INT);
bool in_class = vltype.detectClass(H5T_VLEN);
verify_val(in_class, true, "VarLenType::detectClass() with H5T_VLEN", __LINE__, __FILE__);
in_class = vltype.detectClass(H5T_INTEGER);
verify_val(in_class, true, "VarLenType::detectClass() with H5T_INTEGER", __LINE__, __FILE__);
// Test copy constructor
VarLenType vltype2(vltype);
// Verify that the copied type has a valid id
bool is_valid = IdComponent::isValid(vltype2.getId());
verify_val(in_class, true, "isValid on vltype2", __LINE__, __FILE__);
in_class = vltype2.detectClass(H5T_VLEN);
verify_val(in_class, true, "VarLenType::detectClass() with H5T_VLEN for vltype2", __LINE__, __FILE__);
in_class = vltype2.detectClass(H5T_INTEGER);
verify_val(in_class, true, "VarLenType::detectClass() with H5T_INTEGER for vltype2", __LINE__, __FILE__);
in_class = vltype2.detectClass(H5T_FLOAT);
verify_val(in_class, false, "VarLenType::detectClass() with H5T_FLOAT for vltype2", __LINE__, __FILE__);
// Create a new file to use in this test
H5File file(FILENAME[3], H5F_ACC_TRUNC);
// Create a group in the file, to hold some varlentype
Group top_group(file.createGroup("top group"));
// Create a variable-length type
VarLenType first_vlt(PredType::NATIVE_FLOAT);
// Commit the type to the group
first_vlt.commit(top_group, "first variable-length type");
// Close it
first_vlt.close();
// Reopen it
VarLenType first_vlt_again(top_group, "first variable-length type");
// Trying to detect H5T_VLEN and H5T_FLOAT classes on this type,
// should both be true
in_class = vltype2.detectClass(H5T_VLEN);
verify_val(in_class, true, "VarLenType::detectClass() with H5T_VLEN for vltype2", __LINE__, __FILE__);
in_class = first_vlt_again.detectClass(H5T_FLOAT);
verify_val(in_class, true, "VarLenType::detectClass() with H5T_FLOAT for first_vlt_again", __LINE__, __FILE__);
PASSED();
} // end of try block
catch (Exception& E)
{
issue_fail_msg("test_vltype", __LINE__, __FILE__, E.getCDetailMsg());
}
} // test_vltype
/*-------------------------------------------------------------------------
* Function: test_query
@ -785,6 +1059,8 @@ void test_types()
// Test basic datatypes
test_classes();
test_copy();
test_detect_type_class();
test_vltype();
test_query();
test_transient();
test_named();