Merge pull request #298 in HDFFV/hdf5 from ~BMRIBLER/hdf5_bmr_cpp:develop to develop

New C++ wrappers for H5P[s/g]et_file_space.

* commit '5f759d6d9f804d99572f605f9d9933c897ef3671':
  Description:     Fixed and added function comments. Platform tested:     Jam (very minor)
  Description:     Fixed small typos Platform tested:     Jam (very minor)
  Purpose: Add new C++ wrappers Description:     Added wrappers for H5Pset_file_space and H5Pget_file_space
This commit is contained in:
Binh-Minh Ribler 2017-02-17 15:34:43 -06:00
commit 7e4b64bd83
3 changed files with 160 additions and 4 deletions

View File

@ -294,6 +294,77 @@ unsigned FileCreatPropList::getIstorek() const
return( ik );
}
//--------------------------------------------------------------------------
// Function: FileCreatPropList::setFileSpace
///\brief Sets the strategy and the threshold value that the library
/// will employ in managing file space.
///\param strategy - IN: Strategy for file space management
///\param threshold - IN: Free-space section threshold. The library
/// default is 1, which is to track all free-space sections.
///\exception H5::PropListIException
///\par Description
/// If the given strategy is zero, the property will not be
/// changed and the existing strategy will be retained.
/// If the given threshold value is zero, the property will not be
/// changed and the existing threshold will be retained.
/// Valid values of \a libver_low are as follows:
/// \li \c H5F_FILE_SPACE_ALL (Default)
/// \li \c H5F_FILE_SPACE_ALL_PERSIST
/// \li \c H5F_FILE_SPACE_AGGR_VFD
/// \li \c H5F_FILE_SPACE_VFD
/// For information, please see the C layer Reference Manual at:
/// https://support.hdfgroup.org/HDF5/doc/RM/RM_H5P.html#Property-SetFileSpace
// Programmer Binh-Minh Ribler - Feb, 2017
//--------------------------------------------------------------------------
void FileCreatPropList::setFileSpace(H5F_file_space_type_t strategy, hsize_t threshold) const
{
herr_t ret_value = H5Pset_file_space(id, strategy, threshold);
if( ret_value < 0 )
{
throw PropListIException("FileCreatPropList::setFileSpace",
"H5Pset_file_space failed");
}
}
//--------------------------------------------------------------------------
// Function: FileCreatPropList::getFileSpaceStrategy
///\brief Returns the strategy that the library uses in managing file space.
///\return The strategy value
///\exception H5::PropListIException
// Programmer Binh-Minh Ribler - Feb, 2017
//--------------------------------------------------------------------------
H5F_file_space_type_t FileCreatPropList::getFileSpaceStrategy() const
{
H5F_file_space_type_t strategy = H5F_FILE_SPACE_ALL;
herr_t ret_value = H5Pget_file_space(id, &strategy, NULL);
if (ret_value < 0)
{
throw PropListIException("FileCreatPropList::getFileSpaceStrategy",
"H5Pget_file_space for strategy failed");
}
return(strategy);
}
//--------------------------------------------------------------------------
// Function: FileCreatPropList::getFileSpaceThreshold
///\brief Returns the threshold value that the library uses in tracking
/// free space sections.
///\return The threshold value
///\exception H5::PropListIException
// Programmer Binh-Minh Ribler - Feb, 2017
//--------------------------------------------------------------------------
hsize_t FileCreatPropList::getFileSpaceThreshold() const
{
hsize_t threshold = 0;
herr_t ret_value = H5Pget_file_space(id, NULL, &threshold);
if (ret_value < 0)
{
throw PropListIException("FileCreatPropList::getFileSpaceThreshold",
"H5Pget_file_space for threshold failed");
}
return(threshold);
}
//--------------------------------------------------------------------------
// Function: FileCreatPropList destructor
///\brief Noop destructor.

View File

@ -65,6 +65,17 @@ class H5_DLLCPP FileCreatPropList : public PropList {
// indexing chunked datasets.
void setIstorek( unsigned ik ) const;
// Sets the strategy and the threshold value that the library will
// will employ in managing file space.
void setFileSpace(H5F_file_space_type_t strategy, hsize_t threshold) const;
// Returns the strategy that the library uses in managing file space.
H5F_file_space_type_t getFileSpaceStrategy() const;
// Returns the threshold value that the library uses in tracking free
// space sections.
hsize_t getFileSpaceThreshold() const;
///\brief Returns this class name.
virtual H5std_string fromClass () const { return("FileCreatPropList"); }

View File

@ -411,6 +411,9 @@ static void test_file_size()
// use C test utility routine to close property list.
H5Pclose(fapl_id);
herr_t ret = H5Pclose(fapl_id);
if (ret < 0)
issue_fail_msg("test_file_size()", __LINE__, __FILE__, "H5Pclose failed");
} // test_file_size()
@ -734,9 +737,7 @@ static void test_libver_bounds()
/*-------------------------------------------------------------------------
* Function: test_commonfg
*
* Purpose: Verify that a file created and modified with the
* specified libver bounds has the specified object header
* versions for the right objects.
* Purpose: Verify that H5File works as a root group.
*
* Return: None
*
@ -795,6 +796,77 @@ static void test_commonfg()
} /* end test_commonfg() */
const H5std_string FILE7("tfile7.h5");
/*-------------------------------------------------------------------------
* Function: test_filespace_info
*
* Purpose: Verify that setting and retrieving the file space strategy
* and free space section threshold work correctly.
*
* Return: None
*
* Programmer: Binh-Minh Ribler
* February, 2017
*
*-------------------------------------------------------------------------
*/
static void test_filespace_info()
{
// Output message about test being performed
SUBTEST("File space information");
hid_t fapl_id = h5_fileaccess(); // in h5test.c, returns a file access template
hsize_t in_threshold = 2; // Free space section threshold to set */
hsize_t out_threshold = 0; // Free space section threshold to get */
// File space handling strategy
H5F_file_space_type_t in_strategy = H5F_FILE_SPACE_ALL;
// File space handling strategy
H5F_file_space_type_t out_strategy = H5F_FILE_SPACE_DEFAULT;
try {
// Use the file access template id to create a file access prop.
// list object to pass in H5File::H5File
FileAccPropList fapl(fapl_id);
/* Create file-creation proplist */
FileCreatPropList fcpl;
/* Set file space strategy and free space section threshold */
fcpl.setFileSpace(in_strategy, in_threshold);
// Create a file using default properties.
H5File file7(FILE7, H5F_ACC_TRUNC, fcpl);
/* Close the file */
file7.close();
/* Re-open the file */
file7.openFile(FILE7, H5F_ACC_RDWR, fapl);
/* Get the file's creation property */
FileCreatPropList fcpl2 = file7.getCreatePlist();
/* Get and verify the file space info from the creation property list */
out_strategy = fcpl2.getFileSpaceStrategy();
verify_val(static_cast<unsigned>(out_strategy), static_cast<unsigned>(in_strategy), "FileCreatPropList::getFileSpaceStrategy", __LINE__, __FILE__);
out_threshold = fcpl2.getFileSpaceThreshold();
verify_val(static_cast<unsigned>(out_threshold), static_cast<unsigned>(in_threshold), "FileCreatPropList::getFileSpaceThreshold", __LINE__, __FILE__);
PASSED();
} // end of try block
catch (Exception& E)
{
issue_fail_msg("test_filespace_info()", __LINE__, __FILE__, E.getCDetailMsg());
}
// Close file access template.
herr_t ret = H5Pclose(fapl_id);
if (ret < 0)
issue_fail_msg("test_filespace_info()", __LINE__, __FILE__, "H5Pclose failed");
} /* test_filespace_info() */
/*-------------------------------------------------------------------------
* Function: test_file
*
@ -821,7 +893,8 @@ void test_file()
test_file_name(); // Test getting file's name
test_file_attribute(); // Test file attribute feature
test_libver_bounds(); // Test format version
test_commonfg();
test_commonfg(); // Test H5File as a root group
test_filespace_info(); // Test file space info
} // test_file()
@ -849,4 +922,5 @@ void cleanup_file()
HDremove(FILE4.c_str());
HDremove(FILE5.c_str());
HDremove(FILE6.c_str());
HDremove(FILE7.c_str());
} // cleanup_file