* Snapshot version 1.12 release 1-3. Update version to 1.12.1-4. * First cut of the H5 public API documentation. (#80) * First cut of the H5 public API documentation. * Added H5Z "bonus track." * Applied Quincey's patch. * Added the missing patches from Quincey's original patch. * H5PL (complete) and basic H5VL API documentation. * Added H5I API docs. * Added H5L API docs. * First installment from Elena's H5T batch. * Second installment of Elena's H5T batch. * Final installment of Elena's H5T batch. * Full set of current H5F documentation. (#105) * First cut of the H5 public API documentation. * Added H5Z "bonus track." * Applied Quincey's patch. * Added the missing patches from Quincey's original patch. * H5PL (complete) and basic H5VL API documentation. * Added H5I API docs. * Added H5L API docs. * First installment from Elena's H5T batch. * Second installment of Elena's H5T batch. * Final installment of Elena's H5T batch. * Migrated documentation for SWMR functions. * Catching up on MDC functions. * Integrated the H5F MDC function documentation. * Added MDC and parallel H5F functions. * Slightly updated main page. * Added doxygen/dox/H5AC_cache_config_t.dox to MANIFEST. * Doxygen - added (mostly) beginner functions (#112) * Doxygen - added (mostly) beginner functions * Removed duplicate H5Pset_szip function * Add src/H5module.h to MANIFEST. * close #195. (#196) * Update HDF5PluginMacros.cmake * Update HDF5PluginMacros.cmake * Avoid aligned access for references by decoding into temporary buffer and then copying the result into the actual buffer. Update test to be more thorough with using compound datatype fields everywhere. (#206) * Modify temporary rpath for testing in java example scripts. (#230) * Fix undefined left shifting of negative numbers (#338) Undefined Bahavior Sanitizer errored here about left shifting negative numbers. * Fixes various warnings noticed on Windows (#425) * Fixes various warnings noticed on Windows - Adds a prototype for our implementation of vasprintf - Return type of H5_get_utf16_str() is now non-const - Fixes possible uninitialized return type in Wremove_utf8 - Better isolation of fork() code in accum.c:test_swmr_write_big() - Better isolation of non-zlib code in dsets.c:test_filter_delete() - Removed unused variable in trefer.c:test_reference_cmpnd_obj() * Fixes clang-format issues * Applied clang-tidy readability-non-const-parameter warning fixes auto… (#429) * Automatically applied clang-tidy readability-avoid-const-params-in-decls fixes Removes useless const declarations. * Fixed most readability-non-const-parameter warnings These changes were made automatically by clang-tidy, but I manually reverted the changes related to the H5Z_func_t signature. * Reformat source with clang v10.0.1. Co-authored-by: Larry Knox <lrknox@hdfgroup.org> * Added C++11 override keyword where appropriate (#433) Added H5_OVERRIDE macro for compatibility with both C++11 and older. * Various clang tidy warning fixes (#448) * Fixed clang-tidy bugprone-reserved-identifier warnings * Fixed clang-tidy bugprone-assert-side-effect warnings * Fixed clang-tidy bugprone-copy-constructor-init warning * Fixed clang-tidy readability-redundant-preprocessor warning For error_test.c the removed code was already dead, because it was in the else of an `#if H5_USE_16_API` block. Based on H5Location.h, I think p_get_ref_obj_type was meant to be in `#ifndef DOXYGEN_SHOULD_SKIP_THIS` and an `#endif` was missing. Similarly, in the header, getObjTypeByIdx is only in H5_NO_DEPRECATED_SYMBOLS, not DOXYGEN_SHOULD_SKIP_THIS. * Fixed clang-tidy readability-redundant-string-init warnings * Fixed some clang-tidy performance-type-promotion-in-math-fn warnings * Fixed clang-tidy performance-unnecessary-value-param warnings * Reformat source with clang v10.0.1. Co-authored-by: Larry Knox <lrknox@hdfgroup.org> * Removed checks/workarounds for pre-C++89 compatibility (#449) After 30+ years, just assume that the following exist: - extension-less includes - namespaces - std:: - static_cast - bool * Fixed all clang-tidy bugprone-suspicious-string-compare warnings (#451) * Fixed all clang-tidy bugprone-suspicious-string-compare warnings This change was generated entirely by clang-tidy itself. * Reformat code with clang v10.0.1. Co-authored-by: Larry Knox <lrknox@hdfgroup.org> * Remove 2 functions incorrectly merged from develop in a cherry-pick merge of PR #451. Co-authored-by: Gerd Heber <gheber@hdfgroup.org> Co-authored-by: bljhdf <58825073+bljhdf@users.noreply.github.com> Co-authored-by: H. Joe Lee <hyoklee@hdfgroup.org> Co-authored-by: Quincey Koziol <quincey@koziol.cc> Co-authored-by: Sean McBride <sean@rogue-research.com> Co-authored-by: Dana Robinson <43805+derobins@users.noreply.github.com>
571 lines
22 KiB
C++
571 lines
22 KiB
C++
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
* Copyright by The HDF Group. *
|
|
* Copyright by the Board of Trustees of the University of Illinois. *
|
|
* All rights reserved. *
|
|
* *
|
|
* This file is part of HDF5. The full HDF5 copyright notice, including *
|
|
* terms governing use, modification, and redistribution, is contained in *
|
|
* the COPYING file, which can be found at the root of the source code *
|
|
* distribution tree, or in https://www.hdfgroup.org/licenses. *
|
|
* If you do not have access to either file, you may request a copy from *
|
|
* help@hdfgroup.org. *
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
|
|
/*****************************************************************************
|
|
FILE
|
|
th5s.cpp - HDF5 C++ testing the functionalities associated with the
|
|
C dataspace interface (H5S)
|
|
|
|
EXTERNAL ROUTINES/VARIABLES:
|
|
|
|
***************************************************************************/
|
|
#include <iostream>
|
|
using std::cerr;
|
|
using std::endl;
|
|
|
|
#include <string>
|
|
#include "H5Cpp.h" // C++ API header file
|
|
using namespace H5;
|
|
|
|
#include "h5test.h"
|
|
#include "h5cpputil.h" // C++ utilility header file
|
|
#include "H5srcdir.h" // srcdir querying header file
|
|
|
|
const H5std_string TESTFILE("th5s.h5");
|
|
const H5std_string DATAFILE("th5s1.h5");
|
|
|
|
/* 3-D dataset with fixed dimensions */
|
|
const H5std_string SPACE1_NAME("Space1");
|
|
const int SPACE1_RANK = 3;
|
|
const int SPACE1_DIM1 = 3;
|
|
const int SPACE1_DIM2 = 15;
|
|
const int SPACE1_DIM3 = 13;
|
|
|
|
/* 4-D dataset with one unlimited dimension */
|
|
const H5std_string SPACE2_NAME("Space2");
|
|
const int SPACE2_RANK = 4;
|
|
const int SPACE2_DIM1 = 0;
|
|
const int SPACE2_DIM2 = 15;
|
|
const int SPACE2_DIM3 = 13;
|
|
const int SPACE2_DIM4 = 23;
|
|
const hsize_t SPACE2_MAX1 = H5S_UNLIMITED;
|
|
const hsize_t SPACE2_MAX2 = 15;
|
|
const hsize_t SPACE2_MAX3 = 13;
|
|
const hsize_t SPACE2_MAX4 = 23;
|
|
|
|
/* Scalar dataset with simple datatype */
|
|
const H5std_string SPACE3_NAME("Scalar1");
|
|
const int SPACE3_RANK = 0;
|
|
unsigned space3_data = 65;
|
|
|
|
/* Scalar dataset with compound datatype */
|
|
const H5std_string SPACE4_NAME("Scalar2");
|
|
const H5std_string SPACE4_FIELDNAME1("c1");
|
|
const H5std_string SPACE4_FIELDNAME2("u");
|
|
const H5std_string SPACE4_FIELDNAME3("f");
|
|
const H5std_string SPACE4_FIELDNAME4("c2");
|
|
size_t space4_field1_off = 0;
|
|
size_t space4_field2_off = 0;
|
|
size_t space4_field3_off = 0;
|
|
size_t space4_field4_off = 0;
|
|
struct space4_struct {
|
|
char c1;
|
|
unsigned u;
|
|
float f;
|
|
char c2;
|
|
} space4_data = {'v', 987123, (float)-3.14, 'g'}; /* Test data for 4th dataspace */
|
|
|
|
/* Null dataspace */
|
|
int space5_data = 7;
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_h5s_basic
|
|
*
|
|
* Purpose Test basic H5S (dataspace) code
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Binh-Minh Ribler (using C version)
|
|
* Mar 2001
|
|
*
|
|
* Modifications:
|
|
* January, 2005: C tests' macro VERIFY casts values to 'long' for all
|
|
* cases. Since there are no operator<< for 'long long'
|
|
* or int64 in VS C++ ostream, I casted the hssize_t values
|
|
* passed to verify_val to 'long' as well. If problems
|
|
* arises later, this will have to be specifically handled
|
|
* with a special routine.
|
|
* April 12, 2011: Raymond Lu
|
|
* Starting from the 1.8.7 release, we allow dimension
|
|
* size to be zero. So I took out the test against it.
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
static void
|
|
test_h5s_basic()
|
|
{
|
|
hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3};
|
|
hsize_t dims2[] = {SPACE2_DIM1, SPACE2_DIM2, SPACE2_DIM3, SPACE2_DIM4};
|
|
hsize_t dims3[H5S_MAX_RANK + 1];
|
|
hsize_t tmax[4];
|
|
|
|
// Output message about test being performed
|
|
SUBTEST("Dataspace Manipulation");
|
|
|
|
try {
|
|
// Create simple dataspace sid1
|
|
DataSpace sid1(SPACE1_RANK, dims1);
|
|
|
|
// Get simple extent npoints of the dataspace sid1 and verify it
|
|
hssize_t n; // Number of dataspace elements
|
|
n = sid1.getSimpleExtentNpoints();
|
|
verify_val((long)n, (long)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3),
|
|
"DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
|
|
|
|
// Get the logical rank of dataspace sid1 and verify it
|
|
int rank; // Logical rank of dataspace
|
|
rank = sid1.getSimpleExtentNdims();
|
|
verify_val(rank, SPACE1_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
|
|
|
|
// Retrieves dimension size of dataspace sid1 and verify it
|
|
int ndims; // Number of dimensions
|
|
hsize_t tdims[4]; // Dimension array to test with
|
|
ndims = sid1.getSimpleExtentDims(tdims);
|
|
verify_val(ndims, SPACE1_RANK, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
|
|
verify_val(HDmemcmp(tdims, dims1, SPACE1_RANK * sizeof(unsigned)), 0,
|
|
"DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
|
|
|
|
// Create simple dataspace sid2
|
|
hsize_t max2[] = {SPACE2_MAX1, SPACE2_MAX2, SPACE2_MAX3, SPACE2_MAX4};
|
|
DataSpace sid2(SPACE2_RANK, dims2, max2);
|
|
|
|
// Get simple extent npoints of dataspace sid2 and verify it
|
|
n = sid2.getSimpleExtentNpoints();
|
|
verify_val((long)n, (long)(SPACE2_DIM1 * SPACE2_DIM2 * SPACE2_DIM3 * SPACE2_DIM4),
|
|
"DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
|
|
|
|
// Get the logical rank of dataspace sid2 and verify it
|
|
rank = sid2.getSimpleExtentNdims();
|
|
verify_val(rank, SPACE2_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
|
|
|
|
// Retrieves dimension size and max size of dataspace sid2 and
|
|
// verify them
|
|
ndims = sid2.getSimpleExtentDims(tdims, tmax);
|
|
verify_val(HDmemcmp(tdims, dims2, SPACE2_RANK * sizeof(unsigned)), 0,
|
|
"DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
|
|
verify_val(HDmemcmp(tmax, max2, SPACE2_RANK * sizeof(unsigned)), 0, "DataSpace::getSimpleExtentDims",
|
|
__LINE__, __FILE__);
|
|
|
|
// Check to be sure we can't create a simple data space that has too
|
|
// many dimensions.
|
|
try {
|
|
DataSpace manydims_ds(H5S_MAX_RANK + 1, dims3, NULL);
|
|
|
|
// Should FAIL but didn't, so throw an invalid action exception
|
|
throw InvalidActionException("DataSpace constructor",
|
|
"Library allowed overwrite of existing dataset");
|
|
}
|
|
catch (DataSpaceIException &E) // Simple data space with too many dims
|
|
{
|
|
} // do nothing, exception expected
|
|
|
|
/*
|
|
* Try reading a file that has been prepared that has a dataset with a
|
|
* higher dimensionality than what the library can handle.
|
|
*
|
|
* If this test fails and the H5S_MAX_RANK variable has changed, follow
|
|
* the instructions in space_overflow.c for regenating the th5s.h5 file.
|
|
*/
|
|
char *tmp_str = new char[TESTFILE.length() + 1];
|
|
strcpy(tmp_str, TESTFILE.c_str());
|
|
const char *testfile = H5_get_srcdir_filename(tmp_str);
|
|
delete[] tmp_str;
|
|
|
|
// Create file
|
|
H5File fid1(testfile, H5F_ACC_RDONLY);
|
|
|
|
// Try to open the dataset that has higher dimensionality than
|
|
// what the library can handle and this operation should fail.
|
|
try {
|
|
DataSet dset1 = fid1.openDataSet("dset");
|
|
|
|
// Should FAIL but didn't, so throw an invalid action exception
|
|
throw InvalidActionException(
|
|
"H5File::openDataSet",
|
|
"Opening a dataset with higher dimensionality than what the library can handle");
|
|
}
|
|
catch (FileIException &E) // catching higher dimensionality dataset
|
|
{
|
|
} // do nothing, exception expected
|
|
|
|
// CHECK_I(ret, "H5Fclose"); // leave this here, later, fake a failure
|
|
// in the p_close see how this will handle it. - BMR
|
|
|
|
PASSED();
|
|
} // end of try block
|
|
|
|
catch (InvalidActionException &E) {
|
|
cerr << " FAILED" << endl;
|
|
cerr << " <<< " << E.getDetailMsg() << " >>>" << endl << endl;
|
|
}
|
|
// catch all other exceptions
|
|
catch (Exception &E) {
|
|
issue_fail_msg("test_h5s_basic()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
}
|
|
} // test_h5s_basic()
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_h5s_scalar_write
|
|
*
|
|
* Purpose Test scalar H5S (dataspace) writing code
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Binh-Minh Ribler (using C version)
|
|
* Mar 2001
|
|
*
|
|
* Modifications:
|
|
* January, 2005: C tests' macro VERIFY casts values to 'long' for all
|
|
* cases. Since there are no operator<< for 'long long'
|
|
* or int64 in VS C++ ostream, I casted the hssize_t values
|
|
* passed to verify_val to 'long' as well. If problems
|
|
* arises later, this will have to be specifically handled
|
|
* with a special routine.
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
static void
|
|
test_h5s_scalar_write()
|
|
{
|
|
// Output message about test being performed
|
|
SUBTEST("Scalar Dataspace Writing");
|
|
|
|
try {
|
|
// Create file
|
|
H5File fid1(DATAFILE, H5F_ACC_TRUNC);
|
|
|
|
// Create scalar dataspace
|
|
DataSpace sid1(SPACE3_RANK, NULL);
|
|
|
|
// n = H5Sget_simple_extent_npoints(sid1);
|
|
hssize_t n; // Number of dataspace elements
|
|
n = sid1.getSimpleExtentNpoints();
|
|
verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
|
|
|
|
int rank; // Logical rank of dataspace
|
|
rank = sid1.getSimpleExtentNdims();
|
|
verify_val(rank, SPACE3_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
|
|
|
|
// Retrieves dimension size of dataspace sid1 and verify it
|
|
int ndims; // Number of dimensions
|
|
hsize_t tdims[4]; // Dimension array to test with
|
|
ndims = sid1.getSimpleExtentDims(tdims);
|
|
verify_val(ndims, 0, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
|
|
|
|
// Verify extent type
|
|
H5S_class_t ext_type; // Extent type
|
|
ext_type = sid1.getSimpleExtentType();
|
|
verify_val(ext_type, H5S_SCALAR, "DataSpace::getSimpleExtentType", __LINE__, __FILE__);
|
|
|
|
// Create and write a dataset
|
|
DataSet dataset = fid1.createDataSet("Dataset1", PredType::NATIVE_UINT, sid1);
|
|
dataset.write(&space3_data, PredType::NATIVE_UINT);
|
|
|
|
PASSED();
|
|
} // end of try block
|
|
catch (Exception &E) {
|
|
issue_fail_msg("test_h5s_scalar_write()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
}
|
|
} // test_h5s_scalar_write()
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_h5s_scalar_read
|
|
*
|
|
* Purpose Test scalar H5S (dataspace) reading code
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Binh-Minh Ribler (using C version)
|
|
* Mar 2001
|
|
*
|
|
* Modifications:
|
|
* January, 2005: C tests' macro VERIFY casts values to 'long' for all
|
|
* cases. Since there are no operator<< for 'long long'
|
|
* or int64 in VS C++ ostream, I casted the hssize_t values
|
|
* passed to verify_val to 'long' as well. If problems
|
|
* arises later, this will have to be specifically handled
|
|
* with a special routine.
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
static void
|
|
test_h5s_scalar_read()
|
|
{
|
|
hsize_t tdims[4]; // Dimension array to test with
|
|
|
|
// Output message about test being performed
|
|
SUBTEST("Scalar Dataspace Reading");
|
|
|
|
try {
|
|
// Open file
|
|
H5File fid1(DATAFILE, H5F_ACC_RDWR);
|
|
|
|
// Create a dataset
|
|
DataSet dataset = fid1.openDataSet("Dataset1");
|
|
|
|
DataSpace sid1 = dataset.getSpace();
|
|
|
|
// Get the number of dataspace elements
|
|
hssize_t n = sid1.getSimpleExtentNpoints();
|
|
verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
|
|
|
|
// Get the logical rank of the dataspace
|
|
int ndims = sid1.getSimpleExtentNdims();
|
|
verify_val(ndims, SPACE3_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
|
|
|
|
ndims = sid1.getSimpleExtentDims(tdims);
|
|
verify_val(ndims, 0, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
|
|
|
|
// Read data back and verify it
|
|
unsigned rdata; // Scalar data read in
|
|
dataset.read(&rdata, PredType::NATIVE_UINT);
|
|
verify_val(rdata, space3_data, "DataSet::read", __LINE__, __FILE__);
|
|
|
|
PASSED();
|
|
} // end of try block
|
|
catch (Exception &E) {
|
|
// all the exceptions caused by negative returned values by C APIs
|
|
issue_fail_msg("test_h5s_scalar_read()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
}
|
|
|
|
} // test_h5s_scalar_read()
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_h5s_null
|
|
*
|
|
* Purpose Test null H5S (dataspace) code
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Raymond Lu (using C version)
|
|
* May 18, 2004
|
|
*
|
|
* Modifications:
|
|
* January, 2005: C tests' macro VERIFY casts values to 'long' for all
|
|
* cases. Since there are no operator<< for 'long long'
|
|
* or int64 in VS C++ ostream, I casted the hssize_t values
|
|
* passed to verify_val to 'long' as well. If problems
|
|
* arises later, this will have to be specifically handled
|
|
* with a special routine.
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
static void
|
|
test_h5s_null()
|
|
{
|
|
// Output message about test being performed
|
|
SUBTEST("Null Dataspace Writing");
|
|
|
|
try {
|
|
// Create file
|
|
H5File fid1(DATAFILE, H5F_ACC_TRUNC);
|
|
|
|
// Create scalar dataspace
|
|
DataSpace sid1(H5S_NULL);
|
|
|
|
hssize_t n; // Number of dataspace elements
|
|
n = sid1.getSimpleExtentNpoints();
|
|
verify_val((long)n, 0, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
|
|
|
|
// Create a dataset
|
|
DataSet dataset = fid1.createDataSet("Dataset1", PredType::NATIVE_UINT, sid1);
|
|
|
|
// Try to write nothing to the dataset
|
|
dataset.write(&space5_data, PredType::NATIVE_INT);
|
|
|
|
// Read the data. Make sure no change to the buffer
|
|
dataset.read(&space5_data, PredType::NATIVE_INT);
|
|
verify_val(space5_data, 7, "DataSet::read", __LINE__, __FILE__);
|
|
|
|
PASSED();
|
|
} // end of try block
|
|
catch (Exception &E) {
|
|
issue_fail_msg("test_h5s_null()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
}
|
|
} // test_h5s_null()
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_h5s_compound_scalar_write
|
|
*
|
|
* Purpose Test scalar H5S (dataspace) writing for compound
|
|
* datatypes
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Binh-Minh Ribler (using C version)
|
|
* Mar 2001
|
|
*
|
|
* Modifications:
|
|
* January, 2005: C tests' macro VERIFY casts values to 'long' for all
|
|
* cases. Since there are no operator<< for 'long long'
|
|
* or int64 in VS C++ ostream, I casted the hssize_t values
|
|
* passed to verify_val to 'long' as well. If problems
|
|
* arises later, this will have to be specifically handled
|
|
* with a special routine.
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
static void
|
|
test_h5s_compound_scalar_write()
|
|
{
|
|
// Output message about test being performed
|
|
SUBTEST("Compound Dataspace Writing");
|
|
|
|
try {
|
|
// Create file
|
|
H5File fid1(DATAFILE, H5F_ACC_TRUNC);
|
|
|
|
// Create the compound datatype.
|
|
CompType tid1(sizeof(struct space4_struct));
|
|
space4_field1_off = HOFFSET(struct space4_struct, c1);
|
|
tid1.insertMember(SPACE4_FIELDNAME1, space4_field1_off, PredType::NATIVE_SCHAR);
|
|
space4_field2_off = HOFFSET(struct space4_struct, u);
|
|
tid1.insertMember(SPACE4_FIELDNAME2, space4_field2_off, PredType::NATIVE_UINT);
|
|
space4_field3_off = HOFFSET(struct space4_struct, f);
|
|
tid1.insertMember(SPACE4_FIELDNAME3, space4_field3_off, PredType::NATIVE_FLOAT);
|
|
space4_field4_off = HOFFSET(struct space4_struct, c2);
|
|
tid1.insertMember(SPACE4_FIELDNAME4, space4_field4_off, PredType::NATIVE_SCHAR);
|
|
|
|
// Create scalar dataspace
|
|
DataSpace sid1(SPACE3_RANK, NULL);
|
|
|
|
// Get the number of dataspace elements
|
|
hssize_t n = sid1.getSimpleExtentNpoints();
|
|
verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
|
|
|
|
// Get the logical rank of the dataspace
|
|
int ndims = sid1.getSimpleExtentNdims();
|
|
verify_val(ndims, SPACE3_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
|
|
|
|
hsize_t tdims[4]; // Dimension array to test with
|
|
ndims = sid1.getSimpleExtentDims(tdims);
|
|
verify_val(ndims, 0, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
|
|
|
|
// Create and write a dataset
|
|
DataSet dataset = fid1.createDataSet("Dataset1", tid1, sid1);
|
|
dataset.write(&space4_data, tid1);
|
|
|
|
PASSED();
|
|
} // end of try block
|
|
catch (Exception &E) {
|
|
// all the exceptions caused by negative returned values by C APIs
|
|
issue_fail_msg("test_h5s_compound_scalar_write()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
}
|
|
} // test_h5s_compound_scalar_write()
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_h5s_compound_scalar_read
|
|
*
|
|
* Purpose Test scalar H5S (dataspace) reading for compound
|
|
* datatypes
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Binh-Minh Ribler (using C version)
|
|
* Mar 2001
|
|
*
|
|
* Modifications:
|
|
* January, 2005: C tests' macro VERIFY casts values to 'long' for all
|
|
* cases. Since there are no operator<< for 'long long'
|
|
* or int64 in VS C++ ostream, I casted the hssize_t values
|
|
* passed to verify_val to 'long' as well. If problems
|
|
* arises later, this will have to be specifically handled
|
|
* with a special routine.
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
static void
|
|
test_h5s_compound_scalar_read()
|
|
{
|
|
hsize_t tdims[4]; // Dimension array to test with
|
|
|
|
// Output message about test being performed
|
|
SUBTEST("Compound Dataspace Reading");
|
|
try {
|
|
// Open file
|
|
H5File fid1(DATAFILE, H5F_ACC_RDWR);
|
|
|
|
// Create a dataset
|
|
DataSet dataset = fid1.openDataSet("Dataset1");
|
|
|
|
DataSpace sid1 = dataset.getSpace();
|
|
|
|
// Get the number of dataspace elements
|
|
hssize_t n = sid1.getSimpleExtentNpoints();
|
|
verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
|
|
|
|
// Get the logical rank of the dataspace
|
|
int ndims = sid1.getSimpleExtentNdims();
|
|
verify_val(ndims, SPACE3_RANK, "DataSpace::getSimpleExtentNdims", __LINE__, __FILE__);
|
|
|
|
ndims = sid1.getSimpleExtentDims(tdims);
|
|
verify_val(ndims, 0, "DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
|
|
|
|
// Get the datatype of this dataset.
|
|
CompType type(dataset);
|
|
|
|
struct space4_struct rdata; // Scalar data read in
|
|
dataset.read(&rdata, type);
|
|
|
|
// Verify read data
|
|
if (HDmemcmp(&space4_data, &rdata, sizeof(struct space4_struct)) != 0) {
|
|
cerr << "scalar data different: space4_data.c1=" << space4_data.c1
|
|
<< ", read_data4.c1=" << rdata.c1 << endl;
|
|
cerr << "scalar data different: space4_data.u=" << space4_data.u << ", read_data4.u=" << rdata.u
|
|
<< endl;
|
|
cerr << "scalar data different: space4_data.f=" << space4_data.f << ", read_data4.f=" << rdata.f
|
|
<< endl;
|
|
TestErrPrintf("scalar data different: space4_data.c1=%c, read_data4.c1=%c\n", space4_data.c1,
|
|
rdata.c2);
|
|
} // end if
|
|
PASSED();
|
|
} // end of try block
|
|
catch (Exception &E) {
|
|
// all the exceptions caused by negative returned values by C APIs
|
|
issue_fail_msg("test_h5s_compound_scalar_read()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
}
|
|
} // test_h5s_compound_scalar_read()
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_h5s
|
|
*
|
|
* Purpose Main dataspace testing routine
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Binh-Minh Ribler (using C version)
|
|
* Mar 2001
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
extern "C" void
|
|
test_h5s()
|
|
{
|
|
// Output message about test being performed
|
|
MESSAGE(5, ("Testing Dataspaces\n"));
|
|
|
|
test_h5s_basic(); // Test basic H5S code
|
|
test_h5s_scalar_write(); // Test scalar H5S writing code
|
|
test_h5s_scalar_read(); // Test scalar H5S reading code
|
|
test_h5s_null(); // Test null H5S code
|
|
test_h5s_compound_scalar_write(); // Test compound datatype scalar H5S writing code
|
|
test_h5s_compound_scalar_read(); // Test compound datatype scalar H5S reading code
|
|
} // test_h5s()
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: cleanup_h5s
|
|
*
|
|
* Purpose Cleanup temporary test files
|
|
*
|
|
* Return None
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
extern "C" void
|
|
cleanup_h5s()
|
|
{
|
|
HDremove(DATAFILE.c_str());
|
|
} // cleanup_h5s
|