From 66be6f05d417671d1ef202931d769743ad8a83d9 Mon Sep 17 00:00:00 2001 From: cvs2svn Date: Thu, 27 May 2004 15:26:32 -0500 Subject: [svn-r8591] This commit was manufactured by cvs2svn to create branch 'hdf5_1_6'. --- c++/src/H5ArrayType.cpp | 171 +++++++++++++++++++++++++++++++++++++++++++++++ c++/src/H5ArrayType.h | 57 ++++++++++++++++ c++/src/H5VarLenType.cpp | 83 +++++++++++++++++++++++ c++/src/H5VarLenType.h | 47 +++++++++++++ src/H5Dtest.c | 116 ++++++++++++++++++++++++++++++++ test/gen_old_layout.c | 95 ++++++++++++++++++++++++++ test/tlayouto.h5 | Bin 0 -> 1576 bytes tools/testfiles/file7.h5 | Bin 0 -> 20584 bytes tools/testfiles/file8.h5 | Bin 0 -> 20584 bytes 9 files changed, 569 insertions(+) create mode 100644 c++/src/H5ArrayType.cpp create mode 100644 c++/src/H5ArrayType.h create mode 100644 c++/src/H5VarLenType.cpp create mode 100644 c++/src/H5VarLenType.h create mode 100644 src/H5Dtest.c create mode 100644 test/gen_old_layout.c create mode 100644 test/tlayouto.h5 create mode 100644 tools/testfiles/file7.h5 create mode 100644 tools/testfiles/file8.h5 diff --git a/c++/src/H5ArrayType.cpp b/c++/src/H5ArrayType.cpp new file mode 100644 index 0000000..041108c --- /dev/null +++ b/c++/src/H5ArrayType.cpp @@ -0,0 +1,171 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5DataType.h" +#include "H5ArrayType.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + +//-------------------------------------------------------------------------- +// Function: ArrayType default constructor +///\brief Default constructor: Creates a stub ArrayType +// Programmer Binh-Minh Ribler - May 2004 +//-------------------------------------------------------------------------- +ArrayType::ArrayType() : DataType() +{ + // Initialize members + rank = -1; + dimensions = NULL; +} + +//-------------------------------------------------------------------------- +// Function: ArrayType overloaded constructor +///\brief Creates an ArrayType object using an existing id. +///\param existing_id - IN: Id of an existing datatype +///\exception H5::DataTypeIException +// Programmer Binh-Minh Ribler - May 2004 +//-------------------------------------------------------------------------- +ArrayType::ArrayType( const hid_t existing_id ) : DataType( existing_id ) +{ + // Get the rank of the existing array and store it in this array + rank = H5Tget_array_ndims(existing_id); + if (rank < 0) + { + throw DataTypeIException("ArrayType overloaded constructor", "H5Tget_array_ndims failed"); + } + + // Get the dimensions of the existing array and store it in this array + dimensions = new hsize_t[rank]; + //hsize_t rdims2[H5S_MAX_RANK]; + int ret_value = H5Tget_array_dims(id, dimensions, NULL); + if (ret_value < 0) + { + throw DataTypeIException("ArrayType::getArrayDims", "H5Tget_array_dims failed"); + } +} + +//-------------------------------------------------------------------------- +// Function: ArrayType copy constructor +///\brief Copy constructor: makes a copy of the original ArrayType object. +// Programmer Binh-Minh Ribler - May 2004 +//-------------------------------------------------------------------------- +ArrayType::ArrayType( const ArrayType& original ) : DataType( original ) +{ + rank = original.rank; + dimensions = new hsize_t[rank]; + for (int i = 0; i < rank; i++) + dimensions[i] = original.dimensions[i]; +} + +//-------------------------------------------------------------------------- +// Function: ArrayType overloaded constructor +///\brief Creates a new array data type based on the specified +/// \a base_type. +///\param base_type - IN: Existing datatype +///\param ndims - IN: Rank of the array, [0..H5S_MAX_RANK] +///\param dims - IN: Size of each array dimension +///\exception H5::DataTypeIException +// Programmer Binh-Minh Ribler - May 2004 +//-------------------------------------------------------------------------- +ArrayType::ArrayType(const DataType& base_type, int ndims, const hsize_t* dims) : DataType() +{ + hid_t new_type_id = H5Tarray_create(base_type.getId(), ndims, dims, NULL); + if (new_type_id <= 0) + { + throw DataTypeIException("ArrayType constructor", "H5Tarray_create failed"); + } + id = new_type_id; + rank = ndims; + dimensions = new hsize_t[rank]; + for (int i = 0; i < rank; i++) + dimensions[i] = dims[i]; +} + +//-------------------------------------------------------------------------- +// Function: ArrayType::getArrayNDims +///\brief Returns the number of dimensions for an array datatype. +///\return Number of dimensions +///\exception H5::DataTypeIException +// Programmer Binh-Minh Ribler - May 2004 +//-------------------------------------------------------------------------- +int ArrayType::getArrayNDims() +{ + // If the array's rank has not been stored, i.e. rank is init to -1, + // retrieve it via the C API + if (rank < 0) + { + rank = H5Tget_array_ndims(id); + if (rank < 0) + { + throw DataTypeIException("ArrayType::getArrayNDims", "H5Tget_array_ndims failed"); + } + } + return(rank); +} + +//-------------------------------------------------------------------------- +// Function: ArrayType::getArrayDims +///\brief Retrieves the size of all dimensions of an array datatype. +///\param dims - OUT: Sizes of dimensions +///\return Number of dimensions +///\exception H5::DataTypeIException +// Programmer Binh-Minh Ribler - May 2004 +//-------------------------------------------------------------------------- +int ArrayType::getArrayDims(hsize_t* dims) +{ + // if the array's dimensions have not been stored, retrieve them via C API + if (dimensions == NULL) + { + int ndims = H5Tget_array_dims(id, dims, NULL); + if (ndims < 0) + { + throw DataTypeIException("ArrayType::getArrayDims", "H5Tget_array_dims failed"); + } + // store the array's info in memory + rank = ndims; + dimensions = new hsize_t[rank]; + for (int i = 0; i < rank; i++) + dimensions[i] = dims[i]; + } + // otherwise, simply copy what's in 'dimensions' to 'dims' + for (int i = 0; i < rank; i++) + dims[i] = dimensions[i]; + return(rank); +} + +//-------------------------------------------------------------------------- +// Function: ArrayType destructor +///\brief Properly terminates access to this array datatype. +// Programmer Binh-Minh Ribler - May 2004 +//-------------------------------------------------------------------------- +ArrayType::~ArrayType() +{ + // Free allocated memory + if (dimensions != NULL) + delete [] dimensions; +} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5ArrayType.h b/c++/src/H5ArrayType.h new file mode 100644 index 0000000..d98488e --- /dev/null +++ b/c++/src/H5ArrayType.h @@ -0,0 +1,57 @@ +// C++ informative line for the emacs editor: -*- C++ -*- +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Class ArrayType inherits from DataType and provides wrappers for the +// HDF5 C's Array Datatypes. + +#ifndef _H5ArrayType_H +#define _H5ArrayType_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif +class H5_DLLCPP ArrayType : public DataType { + public: + // Constructor that creates a new array data type based on the + // specified base type. + ArrayType(const DataType& base_type, int ndims, const hsize_t* dims); + + // Returns the number of dimensions of this array datatype. + int getArrayNDims(); + + // Returns the sizes of dimensions of this array datatype. + int getArrayDims(hsize_t* dims); + + // Copy constructor - makes copy of the original object + ArrayType( const ArrayType& original ); + + // Default destructor + virtual ~ArrayType(); + + protected: + // Default constructor + ArrayType(); + + // Constructor that takes an existing id + ArrayType( const hid_t existing_id ); + + private: + int rank; // Rank of the array + hsize_t* dimensions; // Sizes of the array dimensions +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/c++/src/H5VarLenType.cpp b/c++/src/H5VarLenType.cpp new file mode 100644 index 0000000..45524f0 --- /dev/null +++ b/c++/src/H5VarLenType.cpp @@ -0,0 +1,83 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include + +#include "H5Include.h" +#include "H5RefCounter.h" +#include "H5Exception.h" +#include "H5IdComponent.h" +#include "H5PropList.h" +#include "H5Object.h" +#include "H5DataType.h" +#include "H5VarLenType.h" + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif + + +//-------------------------------------------------------------------------- +// Function: VarLenType default constructor +///\brief Default constructor: Creates a stub variable-length datatype. +//-------------------------------------------------------------------------- +VarLenType::VarLenType() : DataType() {} + +//-------------------------------------------------------------------------- +// Function: VarLenType overloaded constructor +///\brief Creates an VarLenType object using an existing id. +///\param existing_id - IN: Id of an existing datatype +///\exception H5::DataTypeIException +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +VarLenType::VarLenType(const hid_t existing_id) : DataType(existing_id) {} + +//-------------------------------------------------------------------------- +// Function: VarLenType copy constructor +///\brief Copy constructor: makes a copy of the original VarLenType object. +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +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. +///\param base_type - IN: Pointer to existing datatype +///\exception H5::DataTypeIException +// Description +// DataType passed by pointer to avoid clashing with copy +// constructor. +// 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 destructor +///\brief Properly terminates access to this datatype. +// Programmer Binh-Minh Ribler - May, 2004 +//-------------------------------------------------------------------------- +VarLenType::~VarLenType() {} + +#ifndef H5_NO_NAMESPACE +} // end namespace +#endif diff --git a/c++/src/H5VarLenType.h b/c++/src/H5VarLenType.h new file mode 100644 index 0000000..8a2572b --- /dev/null +++ b/c++/src/H5VarLenType.h @@ -0,0 +1,47 @@ +// C++ informative line for the emacs editor: -*- C++ -*- +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +// Class VarLenType inherits from DataType and provides wrappers for +// the HDF5 C's Variable-length Datatypes. + +#ifndef _H5VarLenType_H +#define _H5VarLenType_H + +#ifndef H5_NO_NAMESPACE +namespace H5 { +#endif +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); + + // Copy constructor - makes copy of the original object + VarLenType( const VarLenType& original ); + + // Default destructor + virtual ~VarLenType(); + + protected: + // Default constructor + VarLenType(); + + // Constructor that takes an existing id + VarLenType( const hid_t existing_id ); +}; +#ifndef H5_NO_NAMESPACE +} +#endif +#endif diff --git a/src/H5Dtest.c b/src/H5Dtest.c new file mode 100644 index 0000000..d3339df --- /dev/null +++ b/src/H5Dtest.c @@ -0,0 +1,116 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Programmer: Quincey Koziol + * Thusdayr, May 27, 2004 + * + * Purpose: Dataset testing functions. + */ + +#define H5D_PACKAGE /*suppress error about including H5Dpkg */ +#define H5D_TESTING /*suppress warning about H5D testing funcs*/ + +/* Pablo information */ +/* (Put before include files to avoid problems with inline functions) */ +#define PABLO_MASK H5Dtest_mask + +#include "H5private.h" /* Generic Functions */ +#include "H5Dpkg.h" /* Datasets */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Iprivate.h" /* ID Functions */ + +/* Interface initialization */ +#define INTERFACE_INIT NULL +static int interface_initialize_g = 0; + + +/*-------------------------------------------------------------------------- + NAME + H5D_layout_version_test + PURPOSE + Determine the storage layout version for a dataset's layout information + USAGE + herr_t H5D_layout_version_test(did, version) + hid_t did; IN: Dataset to query + unsigned *version; OUT: Pointer to location to place version info + RETURNS + Non-negative on success, negative on failure + DESCRIPTION + Checks the version of the storage layout information for a dataset. + GLOBAL VARIABLES + COMMENTS, BUGS, ASSUMPTIONS + DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING + EXAMPLES + REVISION LOG +--------------------------------------------------------------------------*/ +herr_t +H5D_layout_version_test(hid_t did, unsigned *version) +{ + H5D_t *dset; /* Pointer to dataset to query */ + herr_t ret_value=SUCCEED; /* return value */ + + FUNC_ENTER_NOAPI(H5D_layout_version_test, FAIL); + + /* Check args */ + if (NULL==(dset=H5I_object_verify(did, H5I_DATASET))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset") + + if(version) + *version=dset->layout.version; + +done: + FUNC_LEAVE_NOAPI(ret_value); +} /* H5D_layout_version_test() */ + + +/*-------------------------------------------------------------------------- + NAME + H5D_layout_contig_size_test + PURPOSE + Determine the size of a contiguous layout for a dataset's layout information + USAGE + herr_t H5D_layout_contig_size_test(did, size) + hid_t did; IN: Dataset to query + hsize_t *size; OUT: Pointer to location to place size info + RETURNS + Non-negative on success, negative on failure + DESCRIPTION + Checks the size of a contiguous dataset's storage. + GLOBAL VARIABLES + COMMENTS, BUGS, ASSUMPTIONS + DO NOT USE THIS FUNCTION FOR ANYTHING EXCEPT TESTING + EXAMPLES + REVISION LOG +--------------------------------------------------------------------------*/ +herr_t +H5D_layout_contig_size_test(hid_t did, hsize_t *size) +{ + H5D_t *dset; /* Pointer to dataset to query */ + herr_t ret_value=SUCCEED; /* return value */ + + FUNC_ENTER_NOAPI(H5D_layout_contig_size_test, FAIL); + + /* Check args */ + if (NULL==(dset=H5I_object_verify(did, H5I_DATASET))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset") + + if(size) { + assert(dset->layout.type==H5D_CONTIGUOUS); + *size=dset->layout.u.contig.size; + } /* end if */ + +done: + FUNC_LEAVE_NOAPI(ret_value); +} /* H5D_layout_contig_size_test() */ + diff --git a/test/gen_old_layout.c b/test/gen_old_layout.c new file mode 100644 index 0000000..473b3d3 --- /dev/null +++ b/test/gen_old_layout.c @@ -0,0 +1,95 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Programmer: Quincey Koziol + * Thursday, May 27, 2004 + * + * Purpose: Create two datasets (one for version 1 and one for version 2 of + * the layout message), which should have dimensions too large to + * represent in version 1 & 2 of the storage layout message. + * This program is used to create the test file `tlayouto.h5' which + * has truncated dimension information and can be used to verify that the + * library has fixed up the storage size correctly. + * To build the test file, this program MUST be compiled and linked + * with version hdf5-1.6.2 or _earlier_ libraries and the generated test + * file must be put into the 'test' directory in the 1.7+ (or 1.6+) branch + * of the library. + */ + +#include "hdf5.h" + +#define TESTFILE "tlayouto.h5" +#define SPACE_RANK 2 +#define SPACE_DIM0 (8*1024*1024*1024ULL) +#define SPACE_DIM1 ((4*1024*1024*1024ULL)+1ULL) + + +/*------------------------------------------------------------------------- + * Function: main + * + * Purpose: + * + * Return: Success: + * + * Failure: + * + * Programmer: Quincey Koziol + * Friday, January 3, 2003 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +int +main(void) +{ + hid_t file, space, dset, dcpl; + herr_t ret; + unsigned rank=SPACE_RANK; /* Rank of dataspace */ + hsize_t big_dims[SPACE_RANK]={SPACE_DIM0,SPACE_DIM1}; /* Large dimensions */ + + /* Create the file */ + file = H5Fcreate(TESTFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + if(file<0) + printf("file<0!\n"); + + /* Create the dataspace (for dataset) */ + space = H5Screate_simple(rank,big_dims,NULL); + if(space<0) + printf("space<0!\n"); + + /* Create a dataset creation property list */ + dcpl = H5Pcreate(H5P_DATASET_CREATE); + if(dcpl<0) + printf("dcpl<0!\n"); + + /* Make certain that the dataset's storage doesn't get allocated :-) */ + ret = H5Pset_alloc_time(dcpl,H5D_ALLOC_TIME_LATE); + if(ret<0) + printf("H5Pset_alloc_time() failed!\n"); + + /* Create the dataset with deferred storage allocation */ + dset = H5Dcreate(file, "Dataset", H5T_NATIVE_INT, space, dcpl); + if(dset<0) + printf("dset<0!\n"); + + H5Dclose(dset); + H5Sclose(space); + H5Pclose(dcpl); + H5Fclose(file); + + return 0; +} + diff --git a/test/tlayouto.h5 b/test/tlayouto.h5 new file mode 100644 index 0000000..5dba556 Binary files /dev/null and b/test/tlayouto.h5 differ diff --git a/tools/testfiles/file7.h5 b/tools/testfiles/file7.h5 new file mode 100644 index 0000000..3f891d9 Binary files /dev/null and b/tools/testfiles/file7.h5 differ diff --git a/tools/testfiles/file8.h5 b/tools/testfiles/file8.h5 new file mode 100644 index 0000000..2590a1b Binary files /dev/null and b/tools/testfiles/file8.h5 differ -- cgit v0.12