/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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://support.hdfgroup.org/ftp/HDF5/releases. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /***************************************************************************** FILE tarray.cpp - HDF5 C++ testing the array datatype functionality ***************************************************************************/ #ifdef OLD_HEADER_FILENAME #include #else #include #endif using std::cerr; using std::endl; #include #include "H5Cpp.h" // C++ API header file using namespace H5; #include "h5test.h" #include "h5cpputil.h" // C++ utilility header file const H5std_string FILENAME("tarray.h5"); const H5std_string ARRAYTYPE_NAME("/Array type 1"); const int SPACE1_RANK = 1; const hsize_t SPACE1_DIM1 = 4; const int ARRAY1_RANK = 1; const hsize_t ARRAY1_DIM1 = 4; typedef enum flt_t { FLT_FLOAT, FLT_DOUBLE, FLT_LDOUBLE, FLT_OTHER } flt_t; typedef enum int_t { INT_CHAR, INT_UCHAR, INT_SHORT, INT_USHORT, INT_INT, INT_UINT, INT_LONG, INT_ULONG, INT_LLONG, INT_ULLONG, INT_OTHER } int_t; /*------------------------------------------------------------------------- * Function: test_array_compound_array * * Purpose Tests 1-D array of compound datatypes (with array fields) * * Return None * * Programmer Binh-Minh Ribler (using C version) * January, 2016 *------------------------------------------------------------------------- */ static void test_array_compound_array() { SUBTEST("ArrayType::getArrayNDims & ArrayType::getArrayDims"); typedef struct { // Typedef for compound datatype */ int i; float f[ARRAY1_DIM1]; } s1_t; s1_t wdata[SPACE1_DIM1][ARRAY1_DIM1]; // Information to write s1_t rdata[SPACE1_DIM1][ARRAY1_DIM1]; // Information read in hsize_t sdims1[] = {SPACE1_DIM1}; hsize_t tdims1[] = {ARRAY1_DIM1}; int nmemb; // Number of compound members int ii; // counting variables hsize_t idxi, idxj, idxk; // dimension indicing variables H5T_class_t mclass; // Datatype class for field // Initialize array data to write for (idxi =0; idxi < SPACE1_DIM1; idxi++) for (idxj = 0; idxj < ARRAY1_DIM1; idxj++) { wdata[idxi][idxj].i = idxi * 10 + idxj; for(idxk = 0; idxk < ARRAY1_DIM1; idxk++) { float temp = idxi * 10.0 + idxj * 2.5 + idxk; wdata[idxi][idxj].f[idxk] = temp; } } // end for try { // Create File H5File file1(FILENAME, H5F_ACC_TRUNC); // Create dataspace for datasets DataSpace space(SPACE1_RANK, sdims1, NULL); /* * Create an array datatype of compounds, arrtype. Each compound * datatype, comptype, contains an integer and an array of floats, * arrfltype. */ // Create a compound datatype CompType comptype(sizeof(s1_t)); // Insert integer field comptype.insertMember("i", HOFFSET(s1_t, i), PredType::NATIVE_INT); // Create an array of floats datatype ArrayType arrfltype(PredType::NATIVE_FLOAT, ARRAY1_RANK, tdims1); // Insert float array field comptype.insertMember("f", HOFFSET(s1_t, f), arrfltype); // Close array of floats field datatype arrfltype.close(); // Create an array datatype of the compound datatype ArrayType arrtype(comptype, ARRAY1_RANK, tdims1); // Close compound datatype comptype comptype.close(); // Create a dataset DataSet dataset = file1.createDataSet("Dataset1", arrtype, space); // Write dataset to disk dataset.write(wdata, arrtype); // Test opening ArrayType with opening constructor (Dec 2016) // Commit the arrtype to give it a name arrtype.commit(file1, ARRAYTYPE_NAME); // Close it, then re-open with the opening constructor arrtype.close(); ArrayType named_type(file1, ARRAYTYPE_NAME); // Get and verify the type's name H5std_string type_name = named_type.getObjName(); verify_val(type_name, ARRAYTYPE_NAME, "DataType::getObjName tests constructor", __LINE__, __FILE__); named_type.close(); // Close all dataset.close(); space.close(); file1.close(); // Re-open file file1.openFile(FILENAME, H5F_ACC_RDONLY); // Open the dataset dataset = file1.openDataSet("Dataset1"); /* * Check the datatype array of compounds */ // Verify that it is an array of compounds DataType dstype = dataset.getDataType(); mclass = dstype.getClass(); verify_val(mclass==H5T_ARRAY, true, "f2_type.getClass", __LINE__, __FILE__); dstype.close(); // Get the array datatype to check ArrayType atype_check = dataset.getArrayType(); // Check the array rank int ndims = atype_check.getArrayNDims(); verify_val(ndims, ARRAY1_RANK, "atype_check.getArrayNDims", __LINE__, __FILE__); // Get the array dimensions hsize_t rdims1[H5S_MAX_RANK]; atype_check.getArrayDims(rdims1); // Check the array dimensions for (ii =0; ii