mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-11-27 02:10:55 +08:00
[svn-r10014] Purpose:
new test Description: add a test for the get number of scales function Solution: Platforms tested: linux solaris Misc. update:
This commit is contained in:
parent
adf0f3e317
commit
b625ca2b74
410
hl/src/H5DS.c
410
hl/src/H5DS.c
@ -15,8 +15,6 @@
|
||||
#include "H5LT.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5DSset_scale
|
||||
*
|
||||
@ -739,6 +737,127 @@ out:
|
||||
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5DSget_nscales
|
||||
*
|
||||
* Purpose: get the number of scales linked to the IDX dimension of DNAME
|
||||
*
|
||||
* Return:
|
||||
* Success: SUCCESS: both the DS and the dataset exist
|
||||
* Failure: FAIL: if either one of them does not exist
|
||||
*
|
||||
* Programmer: pvn@ncsa.uiuc.edu
|
||||
*
|
||||
* Date: January 13, 2005
|
||||
*
|
||||
* Comments:
|
||||
*
|
||||
* Modifications:
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
herr_t H5DSget_nscales(hid_t did,
|
||||
unsigned int dim,
|
||||
int *nscales)
|
||||
{
|
||||
int has_dimlist;
|
||||
hid_t sid; /* space ID */
|
||||
hid_t tid; /* attribute type ID */
|
||||
hid_t aid; /* attribute ID */
|
||||
int rank; /* rank of dataset */
|
||||
hvl_t *buf; /* VL buffer to store in the attribute */
|
||||
hobj_ref_t ref; /* reference to the DS */
|
||||
int i, n;
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* the attribute "DIMENSION_LIST" on the >>data<< dataset must exist
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
/* get dataset space */
|
||||
if ((sid = H5Dget_space(did))<0)
|
||||
goto out;
|
||||
|
||||
/* get rank */
|
||||
if ((rank=H5Sget_simple_extent_ndims(sid))<0)
|
||||
goto out;
|
||||
|
||||
/* close dataset space */
|
||||
if (H5Sclose(sid)<0)
|
||||
goto out;
|
||||
|
||||
/* DIM range checking */
|
||||
if (dim>=(unsigned int )rank)
|
||||
goto out;
|
||||
|
||||
/* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
|
||||
if ((has_dimlist = H5LT_find_attribute(did,DIMENSION_LIST))<0)
|
||||
return FAIL;
|
||||
|
||||
/* it does not exist */
|
||||
if (has_dimlist == 0)
|
||||
goto out;
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* the attribute exists, open it
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
else if ( has_dimlist == 1 )
|
||||
{
|
||||
if ((aid = H5Aopen_name(did,DIMENSION_LIST))<0)
|
||||
goto out;
|
||||
if ((tid = H5Aget_type(aid))<0)
|
||||
goto out;
|
||||
if ((sid = H5Aget_space(aid))<0)
|
||||
goto out;
|
||||
|
||||
/* allocate and initialize the VL */
|
||||
buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
|
||||
|
||||
if (buf == NULL)
|
||||
goto out;
|
||||
|
||||
/* read */
|
||||
if (H5Aread(aid,tid,buf)<0)
|
||||
goto out;
|
||||
|
||||
for(i=0,n=0; i<(int)buf[dim].len; i++)
|
||||
{
|
||||
ref = ((hobj_ref_t *)buf[dim].p)[i];
|
||||
if (ref) n++;
|
||||
}
|
||||
/* return value */
|
||||
*nscales =n;
|
||||
|
||||
/* close */
|
||||
if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf)<0)
|
||||
goto out;
|
||||
if (H5Sclose(sid)<0)
|
||||
goto out;
|
||||
if (H5Tclose(tid)<0)
|
||||
goto out;
|
||||
if (H5Aclose(aid)<0)
|
||||
goto out;
|
||||
if (buf)
|
||||
free(buf);
|
||||
|
||||
} /* has_dimlist */
|
||||
|
||||
return SUCCESS;
|
||||
|
||||
/* error zone, gracefully close */
|
||||
out:
|
||||
H5E_BEGIN_TRY {
|
||||
H5Dclose(did);
|
||||
H5Sclose(sid);
|
||||
H5Aclose(aid);
|
||||
H5Tclose(tid);
|
||||
} H5E_END_TRY;
|
||||
return FAIL;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5DSset_label
|
||||
@ -1135,293 +1254,6 @@ out:
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5DShas_scale
|
||||
*
|
||||
* Purpose: check if the dataset DID has associated
|
||||
* valid dimension scales; valid means the dimension scales exist and they
|
||||
* are as many as the dataset rank
|
||||
*
|
||||
* Return: 1, has, 0, not, FAIL, error
|
||||
*
|
||||
* Programmer: pvn@ncsa.uiuc.edu
|
||||
*
|
||||
* Date: January 04, 2005
|
||||
*
|
||||
* Comments:
|
||||
*
|
||||
* Modifications:
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
herr_t H5DShas_scale(hid_t did)
|
||||
{
|
||||
int has_dimlist; /* do we have the "DIMENSION_LIST" attribute */
|
||||
hid_t sid; /* space ID */
|
||||
hid_t dsid; /* DS dataset ID */
|
||||
hid_t dssid; /* DS space ID */
|
||||
hid_t tid; /* attribute type ID */
|
||||
hid_t aid; /* attribute ID */
|
||||
hssize_t dsnelmts; /* size of a dimension scale array */
|
||||
herr_t has_ds; /* boolean return value */
|
||||
int rank; /* rank of dataset */
|
||||
hsize_t dims[H5S_MAX_RANK]; /* dimensions of dataset */
|
||||
hvl_t *buf; /* VL buffer stored in the attribute */
|
||||
hobj_ref_t ref; /* reference to the DS */
|
||||
int i;
|
||||
|
||||
has_ds = 1;
|
||||
|
||||
/* get dataset space */
|
||||
if ((sid = H5Dget_space(did))<0)
|
||||
goto out;
|
||||
|
||||
/* get rank */
|
||||
if ((rank=H5Sget_simple_extent_ndims(sid))<0)
|
||||
goto out;
|
||||
|
||||
/* get dimensions of dataset */
|
||||
if (H5Sget_simple_extent_dims(sid,dims,NULL)<0)
|
||||
goto out;
|
||||
|
||||
/* close the dataspace id */
|
||||
if (H5Sclose(sid)<0)
|
||||
goto out;
|
||||
|
||||
/* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
|
||||
if ((has_dimlist = H5LT_find_attribute(did,DIMENSION_LIST))<0)
|
||||
goto out;
|
||||
|
||||
if (has_dimlist == 0)
|
||||
has_ds = 0;
|
||||
|
||||
else if (has_dimlist == 1 )
|
||||
{
|
||||
if ((aid = H5Aopen_name(did,DIMENSION_LIST))<0)
|
||||
goto out;
|
||||
|
||||
if ((tid = H5Aget_type(aid))<0)
|
||||
goto out;
|
||||
|
||||
if ((sid = H5Aget_space(aid))<0)
|
||||
goto out;
|
||||
|
||||
/* allocate and initialize the VL */
|
||||
buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
|
||||
|
||||
if (buf == NULL)
|
||||
goto out;
|
||||
|
||||
/* read */
|
||||
if (H5Aread(aid,tid,buf)<0)
|
||||
goto out;
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* check if we have at least one entry for each dimension
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
for(i=0; i<rank; i++)
|
||||
{
|
||||
if (buf[i].len == 0)
|
||||
has_ds = 0;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* check if the DSs are valid
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
for(i=0; i<rank; i++)
|
||||
{
|
||||
if (buf[i].len)
|
||||
{
|
||||
/* get the reference */
|
||||
ref = ((hobj_ref_t *)buf[i].p)[0];
|
||||
|
||||
if (ref==0)
|
||||
has_ds = 0;
|
||||
|
||||
if (ref)
|
||||
{
|
||||
/* get the DS id */
|
||||
if ((dsid = H5Rdereference(did,H5R_OBJECT,&ref))<0)
|
||||
goto out;
|
||||
|
||||
/* check information in referenced dataset */
|
||||
if ((dssid = H5Dget_space(dsid))<0)
|
||||
goto out;
|
||||
|
||||
/* get size of the DS array */
|
||||
if ((dsnelmts = H5Sget_simple_extent_npoints(dssid))<0)
|
||||
goto out;
|
||||
|
||||
/* the size of the DS array must match the dimension of the dataset */
|
||||
if (dsnelmts != (hssize_t)dims[i])
|
||||
has_ds = 0;
|
||||
|
||||
/* close the dereferenced dataset */
|
||||
if (H5Dclose(dsid)<0)
|
||||
goto out;
|
||||
if (H5Sclose(dssid)<0)
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* close */
|
||||
if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf)<0)
|
||||
goto out;
|
||||
if (H5Sclose(sid)<0)
|
||||
goto out;
|
||||
if (H5Tclose(tid)<0)
|
||||
goto out;
|
||||
if (H5Aclose(aid)<0)
|
||||
goto out;
|
||||
/* free the VL buffer */
|
||||
if (buf)
|
||||
free(buf);
|
||||
|
||||
} /* has_dimlist */
|
||||
|
||||
return has_ds;
|
||||
|
||||
/* error zone, gracefully close */
|
||||
out:
|
||||
H5E_BEGIN_TRY {
|
||||
H5Sclose(sid);
|
||||
H5Tclose(tid);
|
||||
H5Aclose(aid);
|
||||
} H5E_END_TRY;
|
||||
return FAIL;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5DSget_nscales
|
||||
*
|
||||
* Purpose: get the number of scales linked to the IDX dimension of DNAME
|
||||
*
|
||||
* Return:
|
||||
* Success: SUCCESS: both the DS and the dataset exist
|
||||
* Failure: FAIL: if either one of them does not exist
|
||||
*
|
||||
* Programmer: pvn@ncsa.uiuc.edu
|
||||
*
|
||||
* Date: January 13, 2005
|
||||
*
|
||||
* Comments:
|
||||
*
|
||||
* Modifications:
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
herr_t H5DSget_nscales(hid_t did,
|
||||
unsigned int dim,
|
||||
int *nscales)
|
||||
{
|
||||
int has_dimlist;
|
||||
hid_t sid; /* space ID */
|
||||
hid_t tid; /* attribute type ID */
|
||||
hid_t aid; /* attribute ID */
|
||||
int rank; /* rank of dataset */
|
||||
hvl_t *buf; /* VL buffer to store in the attribute */
|
||||
hobj_ref_t ref; /* reference to the DS */
|
||||
int i, n;
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* the attribute "DIMENSION_LIST" on the >>data<< dataset must exist
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
/* get dataset space */
|
||||
if ((sid = H5Dget_space(did))<0)
|
||||
goto out;
|
||||
|
||||
/* get rank */
|
||||
if ((rank=H5Sget_simple_extent_ndims(sid))<0)
|
||||
goto out;
|
||||
|
||||
/* close dataset space */
|
||||
if (H5Sclose(sid)<0)
|
||||
goto out;
|
||||
|
||||
/* DIM range checking */
|
||||
if (dim>=(unsigned int )rank)
|
||||
goto out;
|
||||
|
||||
/* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
|
||||
if ((has_dimlist = H5LT_find_attribute(did,DIMENSION_LIST))<0)
|
||||
return FAIL;
|
||||
|
||||
/* it does not exist */
|
||||
if (has_dimlist == 0)
|
||||
goto out;
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* the attribute exists, open it
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
else if ( has_dimlist == 1 )
|
||||
{
|
||||
if ((aid = H5Aopen_name(did,DIMENSION_LIST))<0)
|
||||
goto out;
|
||||
if ((tid = H5Aget_type(aid))<0)
|
||||
goto out;
|
||||
if ((sid = H5Aget_space(aid))<0)
|
||||
goto out;
|
||||
|
||||
/* allocate and initialize the VL */
|
||||
buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
|
||||
|
||||
if (buf == NULL)
|
||||
goto out;
|
||||
|
||||
/* read */
|
||||
if (H5Aread(aid,tid,buf)<0)
|
||||
goto out;
|
||||
|
||||
for(i=0,n=0; i<(int)buf[dim].len; i++)
|
||||
{
|
||||
ref = ((hobj_ref_t *)buf[dim].p)[i];
|
||||
if (ref) n++;
|
||||
}
|
||||
/* return value */
|
||||
*nscales =n;
|
||||
|
||||
/* close */
|
||||
if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf)<0)
|
||||
goto out;
|
||||
if (H5Sclose(sid)<0)
|
||||
goto out;
|
||||
if (H5Tclose(tid)<0)
|
||||
goto out;
|
||||
if (H5Aclose(aid)<0)
|
||||
goto out;
|
||||
if (buf)
|
||||
free(buf);
|
||||
|
||||
} /* has_dimlist */
|
||||
|
||||
return SUCCESS;
|
||||
|
||||
/* error zone, gracefully close */
|
||||
out:
|
||||
H5E_BEGIN_TRY {
|
||||
H5Dclose(did);
|
||||
H5Sclose(sid);
|
||||
H5Aclose(aid);
|
||||
H5Tclose(tid);
|
||||
} H5E_END_TRY;
|
||||
return FAIL;
|
||||
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5DSiterate_scales
|
||||
*
|
||||
|
@ -51,6 +51,10 @@ herr_t H5DSdetach_scale(hid_t did,
|
||||
hid_t dsid,
|
||||
unsigned int idx);
|
||||
|
||||
herr_t H5DSget_nscales(hid_t did,
|
||||
unsigned int dim,
|
||||
int *nscales);
|
||||
|
||||
herr_t H5DSset_label(hid_t did,
|
||||
char *label,
|
||||
unsigned int idx);
|
||||
@ -65,12 +69,6 @@ herr_t H5DSget_scale_name(hid_t did,
|
||||
|
||||
herr_t H5DSis_scale(hid_t did);
|
||||
|
||||
herr_t H5DShas_scale(hid_t did);
|
||||
|
||||
herr_t H5DSget_nscales(hid_t did,
|
||||
unsigned int dim,
|
||||
int *nscales);
|
||||
|
||||
|
||||
herr_t H5DSiterate_scales(hid_t did,
|
||||
unsigned int dim,
|
||||
|
@ -86,7 +86,8 @@ static int test_simple(void)
|
||||
char s1_label[16]; /* read label for DS 1 */
|
||||
char s2_label[16]; /* read label for DS 2 */
|
||||
unsigned int dim; /* dataset dimension index */
|
||||
int scale_idx;
|
||||
int scale_idx; /* scale index */
|
||||
int nscales; /* number of scales in DIM */
|
||||
|
||||
|
||||
printf("Testing API functions\n");
|
||||
@ -277,11 +278,11 @@ static int test_simple(void)
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* test 2: has scales
|
||||
* test 2: get number of scales
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
TESTING2("has scales");
|
||||
TESTING2("get number of scales");
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* verify that "dset_a" has dimension scales
|
||||
@ -292,8 +293,18 @@ static int test_simple(void)
|
||||
if ((did = H5Dopen(fid,"dset_a"))<0)
|
||||
goto out;
|
||||
|
||||
/* verify that "dset_a" has dimension scales */
|
||||
if ((H5DShas_scale(did))==0)
|
||||
/* verify that "dset_a" has 1 dimension scale at DIM 0 */
|
||||
dim=0;
|
||||
if (H5DSget_nscales(did,dim,&nscales)<0)
|
||||
goto out;
|
||||
if (nscales!=1)
|
||||
goto out;
|
||||
|
||||
/* verify that "dset_a" has 3 dimension scales at DIM 1 */
|
||||
dim=1;
|
||||
if (H5DSget_nscales(did,dim,&nscales)<0)
|
||||
goto out;
|
||||
if (nscales!=3)
|
||||
goto out;
|
||||
|
||||
/* close dataset ID of "dset_a" */
|
||||
@ -310,8 +321,18 @@ static int test_simple(void)
|
||||
if ((did = H5Dopen(fid,"dset_b"))<0)
|
||||
goto out;
|
||||
|
||||
/* verify that "dset_b" does not have a complete definition of dimension scales */
|
||||
if ((H5DShas_scale(did))==1)
|
||||
/* verify that "dset_b" has 1 dimension scale at DIM 0 */
|
||||
dim=0;
|
||||
if (H5DSget_nscales(did,dim,&nscales)<0)
|
||||
goto out;
|
||||
if (nscales!=1)
|
||||
goto out;
|
||||
|
||||
/* verify that "dset_b" has 0 dimension scales at DIM 1 */
|
||||
dim=1;
|
||||
if (H5DSget_nscales(did,dim,&nscales)<0)
|
||||
goto out;
|
||||
if (nscales!=0)
|
||||
goto out;
|
||||
|
||||
/* close dataset ID of "dset_b" */
|
||||
@ -376,7 +397,17 @@ static int test_simple(void)
|
||||
|
||||
if ((did = H5Dopen(fid,"dset_c"))<0)
|
||||
goto out;
|
||||
if ((H5DShas_scale(did))==0)
|
||||
/* verify that "dset_c" has 1 dimension scale at DIM 0 */
|
||||
dim=0;
|
||||
if (H5DSget_nscales(did,dim,&nscales)<0)
|
||||
goto out;
|
||||
if (nscales!=1)
|
||||
goto out;
|
||||
/* verify that "dset_c" has 1 dimension scale at DIM 1 */
|
||||
dim=1;
|
||||
if (H5DSget_nscales(did,dim,&nscales)<0)
|
||||
goto out;
|
||||
if (nscales!=1)
|
||||
goto out;
|
||||
if (H5Dclose(did)<0)
|
||||
goto out;
|
||||
@ -413,7 +444,11 @@ static int test_simple(void)
|
||||
|
||||
if ((did = H5Dopen(fid,"dset_c"))<0)
|
||||
goto out;
|
||||
if ((H5DShas_scale(did))==1)
|
||||
/* verify that "dset_c" has 0 dimension scale at DIM 0 */
|
||||
dim=0;
|
||||
if (H5DSget_nscales(did,dim,&nscales)<0)
|
||||
goto out;
|
||||
if (nscales!=0)
|
||||
goto out;
|
||||
if (H5Dclose(did)<0)
|
||||
goto out;
|
||||
|
Loading…
Reference in New Issue
Block a user