diff options
Diffstat (limited to 'hl')
-rw-r--r-- | hl/src/H5DS.c | 290 | ||||
-rw-r--r-- | hl/test/test_ds.c | 254 |
2 files changed, 256 insertions, 288 deletions
diff --git a/hl/src/H5DS.c b/hl/src/H5DS.c index 0615a80..902fb9b 100644 --- a/hl/src/H5DS.c +++ b/hl/src/H5DS.c @@ -1267,7 +1267,7 @@ out: * Parameters: * * hid_t DID; IN: the dataset - * unsigned int dim; IN: the dimension of dset + * unsigned int dim; IN: the dimension of the dataset * int *idx; IN/OUT: input the index to start iterating, output the next index * to visit. If NULL, start at the first position. * H5DS_iterate_t visitor; IN: the visitor function @@ -1303,7 +1303,7 @@ herr_t H5DSiterate_scales(hid_t did, H5DS_iterate_t visitor, void *visitor_data ) { - hid_t scale_id; + hid_t scale_id=0; int rank; hobj_ref_t ref; /* reference to the DS */ hid_t sid; /* space ID */ @@ -1369,14 +1369,18 @@ herr_t H5DSiterate_scales(hid_t did, for(i=j_idx; i<nscales; i++) { /* get the reference */ - ref = ((hobj_ref_t *)buf[dim].p)[j_idx]; + ref = ((hobj_ref_t *)buf[dim].p)[ i ]; /* get the DS id */ if ((scale_id = H5Rdereference(did,H5R_OBJECT,&ref))<0) goto out; if((ret_value=(visitor)(did,dim,scale_id,visitor_data))!=0) + { + /* set the return IDX OUT value at current scale index and break */ + if (idx!=NULL) *idx = i; break; + } } /* i */ } /* if */ @@ -1390,7 +1394,7 @@ herr_t H5DSiterate_scales(hid_t did, goto out; if (H5Aclose(aid)<0) goto out; - if (H5Dclose(scale_id)<0) + if (scale_id && H5Dclose(scale_id)<0) goto out; if (buf) free(buf); @@ -1404,281 +1408,3 @@ out: } -#if 0 -/*------------------------------------------------------------------------- - * 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<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 - * - * Purpose: H5DSiterate_scales iterates over the scales attached to dimension dim - * of dataset dset. For each scale in the list, the visitor_data and some - * additional information, specified below, are passed to the visitor function. - * The iteration begins with the idx object in the group and the next element - * to be processed by the operator is returned in idx. If idx is NULL, then the - * iterator starts at zero. - * - * Parameters: - * - * hid_t DID; IN: the dataset - * unsigned int dim; IN: the dimension of dset - * int *idx; IN/OUT: input the index to start iterating, output the next index - * to visit. If NULL, start at the first position. - * H5DS_iterate_t visitor; IN: the visitor function - * void *visitor_data; IN: arbitrary data to pass to the visitor function. - * - * Programmer: pvn@ncsa.uiuc.edu - * - * Date: January 31, 2005 - * - * Comments: - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -herr_t H5DSiterate_scales(hid_t did, - unsigned int dim, - int *idx, - H5DS_iterate_t visitor, - void *visitor_data ) -{ - hid_t scale_id; - int rank; - hobj_ref_t ref; /* reference to the DS */ - hid_t sid; /* space ID */ - hid_t tid; /* attribute type ID */ - hid_t aid; /* attribute ID */ - hvl_t *buf=NULL; /* VL buffer to store in the attribute */ - herr_t ret_value=0; - int j_idx; - int nscales; - int has_dimlist; - int i; - - /* get the number of scales assotiated with this DIM */ - if (H5DSget_nscales(did,dim,&nscales)<0) - goto out; - - /* 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; - - /* 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) - return SUCCESS; - - 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; - - if ( buf[dim].len > 0 ) - { - if (idx!=NULL) - j_idx = *idx; - else - j_idx=0; - - /* iterate */ - for(i=j_idx; i<nscales; i++) - { - /* get the reference */ - ref = ((hobj_ref_t *)buf[dim].p)[j_idx]; - - /* get the DS id */ - if ((scale_id = H5Rdereference(did,H5R_OBJECT,&ref))<0) - goto out; - - if((ret_value=(visitor)(did,dim,scale_id,visitor_data))==1) - { - /* 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 (H5Dclose(scale_id)<0) - goto out; - if (buf) - free(buf); - return SUCCESS; - } /* if */ - } /* i */ - } /* if */ - - /* 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 (H5Dclose(scale_id)<0) - goto out; - if (buf) - free(buf); - - if (ret_value<0) - goto out; - - } /* if has_dimlist */ - - return 0; - -out: - return FAIL; -} - -#endif - - diff --git a/hl/test/test_ds.c b/hl/test/test_ds.c index f891889..8ab29da 100644 --- a/hl/test/test_ds.c +++ b/hl/test/test_ds.c @@ -20,6 +20,8 @@ /* operator functions */ static herr_t verifiy_scale(hid_t dset, unsigned dim, hid_t scale, void *visitor_data); static herr_t read_scale(hid_t dset, unsigned dim, hid_t scale, void *visitor_data); +static herr_t match_dim_scale(hid_t did, unsigned dim, hid_t dsid, void *visitor_data); + /* prototypes */ static int test_simple(void); static int test_errors(void); @@ -74,6 +76,7 @@ static int test_simple(void) hid_t fid; /* file ID */ hid_t did; /* dataset ID */ hid_t dsid; /* DS dataset ID */ + hid_t sid; /* space ID */ int rank = RANK; /* rank of data dataset */ int rankds = 1; /* rank of DS dataset */ hsize_t dims[RANK] = {DIM1_SIZE,DIM2_SIZE}; /* size of data dataset */ @@ -532,7 +535,7 @@ static int test_simple(void) * test 6: test iterate scales with a function verifiy_scale *------------------------------------------------------------------------- */ - TESTING2("iterate scales"); + TESTING2("iterate scales (verify scale)"); /* get the dataset id for "dset_a" */ if ((did = H5Dopen(fid,"dset_a"))<0) @@ -560,10 +563,11 @@ static int test_simple(void) /*------------------------------------------------------------------------- - * test 6: test iterate scales with a function read_scale + * test 7: test iterate scales with a function read_scale *------------------------------------------------------------------------- */ - TESTING2("read scale values with iterate scales"); + TESTING2("iterate scales (read scale values)"); + /* get the dataset id for "dset_a" */ if ((did = H5Dopen(fid,"dset_a"))<0) @@ -590,6 +594,162 @@ static int test_simple(void) PASSED(); /*------------------------------------------------------------------------- + * test 8: test iterate scales with a function match_dim_scale + *------------------------------------------------------------------------- + */ + TESTING2("iterate scales (verify the scale sizes match)"); + + /* get the dataset id for "dset_a" */ + if ((did = H5Dopen(fid,"dset_a"))<0) + goto out; + + /* 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; + + { + int match_size; /* does this scale size matches the dataset DIM size */ + int idx=0; /* scale index to start iterating, on return, index where iterator stoped */ + + /* iterate trough all the dimensions */ + for(dim=0; dim<(unsigned)rank; dim++) + { + if ((match_size=H5DSiterate_scales(did,dim,&idx,match_dim_scale,NULL))<0) + goto out; + + /* "dset_a" was defined with all dimension scales size matching the size of its dimensions */ + if (match_size==0) + goto out; + + /* both "ds1" and "ds2" are the on the first index */ + if (idx!=0) + goto out; + } + } + + + /* close */ + if (H5Dclose(did)<0) + goto out; + if (H5Sclose(sid)<0) + goto out; + + PASSED(); + +/*------------------------------------------------------------------------- + * test 9: test iterate scales with a function match_dim_scale + *------------------------------------------------------------------------- + */ + TESTING2("iterate scales (verify the scale sizes do not match)"); + +/*------------------------------------------------------------------------- + * create 3 datasets: 1 "data" dataset and dimension scales (some are empty) + *------------------------------------------------------------------------- + */ + if (H5LTmake_dataset_int(fid,"dset_d",rank,dims,buf)<0) + goto out; + if (H5LTmake_dataset_int(fid,"ds6_1_1",rankds,s1_dim,NULL)<0) + goto out; + if (H5LTmake_dataset_int(fid,"ds6_1_2",rankds,s1_dim,s1_wbuf)<0) + goto out; + if (H5LTmake_dataset_int(fid,"ds7_2_1",rankds,s2_dim,NULL)<0) + goto out; + +/*------------------------------------------------------------------------- + * attach them + *------------------------------------------------------------------------- + */ + if ((did = H5Dopen(fid,"dset_d"))<0) + goto out; + + if ((dsid = H5Dopen(fid,"ds6_1_1"))<0) + goto out; + if (H5DSattach_scale(did,dsid,0)<0) + goto out; + if (H5Dclose(dsid)<0) + goto out; + if ((dsid = H5Dopen(fid,"ds6_1_2"))<0) + goto out; + if (H5DSattach_scale(did,dsid,0)<0) + goto out; + if (H5Dclose(dsid)<0) + goto out; + if ((dsid = H5Dopen(fid,"ds7_2_1"))<0) + goto out; + if (H5DSattach_scale(did,dsid,1)<0) + goto out; + if (H5Dclose(dsid)<0) + goto out; + + if (H5Dclose(did)<0) + goto out; + +/*------------------------------------------------------------------------- + * verify match + *------------------------------------------------------------------------- + */ + /* get the dataset id for "dset_d" */ + if ((did = H5Dopen(fid,"dset_d"))<0) + goto out; + + /* 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; + + { + int match_size; /* does this scale size matches the dataset DIM size */ + int idx; /* scale index to start iterating, on return, index where iterator stoped */ + + /* iterate trough all the dimensions */ + for(dim=0; dim<(unsigned)rank; dim++) + { + /* always start at 1st scale */ + idx=0; + + if ((match_size=H5DSiterate_scales(did,dim,&idx,match_dim_scale,NULL))<0) + goto out; + + /* "dset_d" was defined with : + dim 0: 2 scales, first is empty + dim 1: 1 scale, empty */ + switch(dim) + { + case 0: /* for DIM 0, we get a valid scale at IDX 1 */ + if (match_size!=1 && idx!=1) + goto out; + break; + case 1: /* for DIM 1, we get no valid scales */ + if (match_size!=0 && idx!=0) + goto out; + }/*switch*/ + }/*for*/ + } + + /* close */ + if (H5Dclose(did)<0) + goto out; + if (H5Sclose(sid)<0) + goto out; + + PASSED(); + +/*------------------------------------------------------------------------- * end *------------------------------------------------------------------------- */ @@ -730,7 +890,7 @@ out: * Function: verifiy_scale * * Purpose: example operator function used by H5DSiterate_scales, used - * to veify that SCALE_ID refers to a valid DS dataset + * to verify that SCALE_ID refers to a valid DS dataset * * Return: * The return values from an operator are: @@ -745,9 +905,7 @@ out: static herr_t verifiy_scale(hid_t dset, unsigned dim, hid_t scale_id, void *visitor_data) { - /* define a default zero value for return. This will cause the iterator to continue */ - int ret = 0; /* unused */ @@ -863,3 +1021,87 @@ static herr_t read_scale(hid_t dset, unsigned dim, hid_t scale_id, void *visitor return FAIL; } + +/*------------------------------------------------------------------------- + * Function: match_dim_scale + * + * Purpose: example operator function used by H5DSiterate_scales, used + * to verify the the DSID scale size matches the dataset DIM size + * + * Return: + * The return values from an operator are: + * Zero causes the iterator to continue, returning zero when all group members have been processed. + * Positive causes the iterator to immediately return that positive value, indicating + * short-circuit success. The iterator can be restarted at the next group member. + * Negative causes the iterator to immediately return that value, indicating failure. + * The iterator can be restarted at the next group member. + * + *------------------------------------------------------------------------- + */ + +static herr_t match_dim_scale(hid_t did, unsigned dim, hid_t dsid, void *visitor_data) +{ + int ret = 0; /* define a default zero value for return. This will cause the iterator to continue */ + hid_t sid; /* space ID */ + hssize_t nelmts; /* size of a dimension scale array */ + int rank; /* rank of dataset */ + hsize_t dims[H5S_MAX_RANK]; /* dimensions of dataset */ + hsize_t storage_size; + +/*------------------------------------------------------------------------- + * get DID (dataset) space info + *------------------------------------------------------------------------- + */ + + /* 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; + +/*------------------------------------------------------------------------- + * get DSID (scale) space info + *------------------------------------------------------------------------- + */ + + /* get the space for the scale */ + if ((sid = H5Dget_space(dsid))<0) + goto out; + + /* get size of the DS array */ + if ((nelmts = H5Sget_simple_extent_npoints(sid))<0) + goto out; + + /* close */ + if (H5Sclose(sid)<0) + goto out; + + /* the size of the DS array must match the dimension of the dataset */ + if (nelmts == (hssize_t)dims[dim]) + ret = 1; + + /* if the scale is empty assume it cannot be used */ + if ((storage_size=H5Dget_storage_size(dsid))<0) + goto out; + + if (storage_size==0) + ret = 0; + + return ret; + +out: + H5E_BEGIN_TRY { + H5Sclose(sid); + } H5E_END_TRY; + return FAIL; +}
\ No newline at end of file |