mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-12-09 07:32:32 +08:00
[svn-r530] Added code so H5Scopy copies selections properly.
This commit is contained in:
parent
29a029d7e7
commit
b970dce3ec
156
src/H5Shyper.c
156
src/H5Shyper.c
@ -1760,3 +1760,159 @@ H5S_hyper_sel_iter_release (H5S_sel_iter_t *sel_iter)
|
||||
|
||||
FUNC_LEAVE (SUCCEED);
|
||||
} /* H5S_hyper_sel_iter_release() */
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Function: H5S_hyper_compare_bounds
|
||||
*
|
||||
* Purpose: Compares two bounds for equality
|
||||
*
|
||||
* Return: an integer less than, equal to, or greater than zero if the first
|
||||
* region is considered to be respectively less than, equal to, or
|
||||
* greater than the second
|
||||
*
|
||||
* Programmer: Quincey Koziol
|
||||
* Friday, July 17, 1998
|
||||
*
|
||||
* Modifications:
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
int
|
||||
H5S_hyper_compare_bounds (const void *r1, const void *r2)
|
||||
{
|
||||
if(((const H5S_hyper_bound_t *)r1)->bound<((const H5S_hyper_bound_t *)r2)->bound)
|
||||
return(-1);
|
||||
else
|
||||
if(((const H5S_hyper_bound_t *)r1)->bound>((const H5S_hyper_bound_t *)r2)->bound)
|
||||
return(1);
|
||||
else
|
||||
return(0);
|
||||
} /* end H5S_hyper_compare_bounds */
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
NAME
|
||||
H5S_hyper_copy
|
||||
PURPOSE
|
||||
Copy a selection from one dataspace to another
|
||||
USAGE
|
||||
herr_t H5S_hyper_copy(dst, src)
|
||||
H5S_t *dst; OUT: Pointer to the destination dataspace
|
||||
H5S_t *src; IN: Pointer to the source dataspace
|
||||
RETURNS
|
||||
SUCCEED/FAIL
|
||||
DESCRIPTION
|
||||
Copies all the hyperslab selection information from the source
|
||||
dataspace to the destination dataspace.
|
||||
GLOBAL VARIABLES
|
||||
COMMENTS, BUGS, ASSUMPTIONS
|
||||
EXAMPLES
|
||||
REVISION LOG
|
||||
--------------------------------------------------------------------------*/
|
||||
herr_t
|
||||
H5S_hyper_copy (H5S_t *dst, const H5S_t *src)
|
||||
{
|
||||
H5S_hyper_list_t *new_hyper; /* New hyperslab selection */
|
||||
H5S_hyper_node_t *curr, *new, *new_head; /* Hyperslab information nodes */
|
||||
intn i; /* Counters */
|
||||
size_t u; /* Counters */
|
||||
herr_t ret_value=SUCCEED; /* return value */
|
||||
|
||||
FUNC_ENTER (H5S_hyper_copy, FAIL);
|
||||
|
||||
assert(src);
|
||||
assert(dst);
|
||||
|
||||
#ifdef QAK
|
||||
printf("%s: check 3.0\n", FUNC);
|
||||
#endif /* QAK */
|
||||
/* Create the new hyperslab information node */
|
||||
if((new_hyper = H5MM_malloc(sizeof(H5S_hyper_list_t)))==NULL)
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
|
||||
"can't allocate point node");
|
||||
|
||||
/* Copy the basic hyperslab selection information */
|
||||
*new_hyper=*(src->select.sel_info.hyper_lst);
|
||||
|
||||
/* Attach the hyperslab information to the destination dataspace */
|
||||
dst->select.sel_info.hyper_lst=new_hyper;
|
||||
|
||||
#ifdef QAK
|
||||
printf("%s: check 4.0\n", FUNC);
|
||||
#endif /* QAK */
|
||||
/* Allocate space for the low & high bound arrays */
|
||||
if((new_hyper->lo_bounds = H5MM_malloc(sizeof(H5S_hyper_bound_t *)*src->extent.u.simple.rank))==NULL)
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
|
||||
"can't allocate point node");
|
||||
if((new_hyper->hi_bounds = H5MM_malloc(sizeof(H5S_hyper_bound_t *)*src->extent.u.simple.rank))==NULL)
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
|
||||
"can't allocate point node");
|
||||
for(i=0; i<src->extent.u.simple.rank; i++) {
|
||||
if((new_hyper->lo_bounds[i] = H5MM_malloc(sizeof(H5S_hyper_bound_t)*src->select.sel_info.hyper_lst->count))==NULL)
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
|
||||
"can't allocate point node");
|
||||
if((new_hyper->hi_bounds[i] = H5MM_malloc(sizeof(H5S_hyper_bound_t)*src->select.sel_info.hyper_lst->count))==NULL)
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
|
||||
"can't allocate point node");
|
||||
} /* end for */
|
||||
|
||||
#ifdef QAK
|
||||
printf("%s: check 5.0\n", FUNC);
|
||||
#endif /* QAK */
|
||||
/* Copy the hyperslab selection nodes, adding them to the lo & hi bound arrays also */
|
||||
curr=src->select.sel_info.hyper_lst->head;
|
||||
new_head=NULL;
|
||||
u=0;
|
||||
while(curr!=NULL) {
|
||||
#ifdef QAK
|
||||
printf("%s: check 5.1\n", FUNC);
|
||||
#endif /* QAK */
|
||||
/* Create each point */
|
||||
if((new = H5MM_malloc(sizeof(H5S_hyper_node_t)))==NULL)
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
|
||||
"can't allocate point node");
|
||||
if((new->start = H5MM_malloc(src->extent.u.simple.rank*sizeof(hssize_t)))==NULL)
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
|
||||
"can't allocate coordinate information");
|
||||
if((new->end = H5MM_malloc(src->extent.u.simple.rank*sizeof(hssize_t)))==NULL)
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
|
||||
"can't allocate coordinate information");
|
||||
HDmemcpy(new->start,curr->start,(src->extent.u.simple.rank*sizeof(hssize_t)));
|
||||
HDmemcpy(new->end,curr->end,(src->extent.u.simple.rank*sizeof(hssize_t)));
|
||||
new->next=NULL;
|
||||
|
||||
/* Insert into low & high bound arrays */
|
||||
for(i=0; i<src->extent.u.simple.rank; i++) {
|
||||
new_hyper->lo_bounds[i][u].bound=new->start[i];
|
||||
new_hyper->lo_bounds[i][u].node=new;
|
||||
new_hyper->hi_bounds[i][u].bound=new->end[i];
|
||||
new_hyper->hi_bounds[i][u].node=new;
|
||||
} /* end for */
|
||||
u++; /* Increment the location of the next node in the boundary arrays */
|
||||
|
||||
/* Keep the order the same when copying */
|
||||
if(new_head==NULL)
|
||||
new_head=new_hyper->head=new;
|
||||
else {
|
||||
new_head->next=new;
|
||||
new_head=new;
|
||||
} /* end else */
|
||||
|
||||
curr=curr->next;
|
||||
} /* end while */
|
||||
#ifdef QAK
|
||||
printf("%s: check 6.0\n", FUNC);
|
||||
#endif /* QAK */
|
||||
|
||||
/* Sort the boundary arrays */
|
||||
for(i=0; i<src->extent.u.simple.rank; i++) {
|
||||
qsort(new_hyper->lo_bounds[i],new_hyper->count,sizeof(H5S_hyper_bound_t),H5S_hyper_compare_bounds);
|
||||
qsort(new_hyper->hi_bounds[i],new_hyper->count,sizeof(H5S_hyper_bound_t),H5S_hyper_compare_bounds);
|
||||
} /* end for */
|
||||
#ifdef QAK
|
||||
printf("%s: check 7.0\n", FUNC);
|
||||
#endif /* QAK */
|
||||
|
||||
done:
|
||||
FUNC_LEAVE (ret_value);
|
||||
} /* end H5S_hyper_copy() */
|
||||
|
||||
|
@ -639,4 +639,83 @@ H5S_hyper_npoints (const H5S_t *space)
|
||||
|
||||
FUNC_LEAVE (space->select.num_elem);
|
||||
} /* H5S_hyper_npoints() */
|
||||
|
||||
/*--------------------------------------------------------------------------
|
||||
NAME
|
||||
H5S_point_copy
|
||||
PURPOSE
|
||||
Copy a selection from one dataspace to another
|
||||
USAGE
|
||||
herr_t H5S_point_copy(dst, src)
|
||||
H5S_t *dst; OUT: Pointer to the destination dataspace
|
||||
H5S_t *src; IN: Pointer to the source dataspace
|
||||
RETURNS
|
||||
SUCCEED/FAIL
|
||||
DESCRIPTION
|
||||
Copies all the point selection information from the source
|
||||
dataspace to the destination dataspace.
|
||||
GLOBAL VARIABLES
|
||||
COMMENTS, BUGS, ASSUMPTIONS
|
||||
EXAMPLES
|
||||
REVISION LOG
|
||||
--------------------------------------------------------------------------*/
|
||||
herr_t
|
||||
H5S_point_copy (H5S_t *dst, const H5S_t *src)
|
||||
{
|
||||
H5S_pnt_node_t *curr, *new, *new_head; /* Point information nodes */
|
||||
herr_t ret_value=SUCCEED; /* return value */
|
||||
|
||||
FUNC_ENTER (H5S_point_copy, FAIL);
|
||||
|
||||
assert(src);
|
||||
assert(dst);
|
||||
|
||||
#ifdef QAK
|
||||
printf("%s: check 1.0\n",FUNC);
|
||||
#endif /* QAK */
|
||||
/* Allocate room for the head of the point list */
|
||||
if((dst->select.sel_info.pnt_lst=H5MM_malloc(sizeof(H5S_pnt_list_t)))==NULL)
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
|
||||
"can't allocate point node");
|
||||
|
||||
curr=src->select.sel_info.pnt_lst->head;
|
||||
new_head=NULL;
|
||||
while(curr!=NULL) {
|
||||
/* Create each point */
|
||||
if((new=H5MM_malloc(sizeof(H5S_pnt_node_t)))==NULL)
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
|
||||
"can't allocate point node");
|
||||
if((new->pnt = H5MM_malloc(src->extent.u.simple.rank*sizeof(hssize_t)))==NULL)
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL,
|
||||
"can't allocate coordinate information");
|
||||
HDmemcpy(new->pnt,curr->pnt,(src->extent.u.simple.rank*sizeof(hssize_t)));
|
||||
new->next=NULL;
|
||||
|
||||
#ifdef QAK
|
||||
printf("%s: check 5.0\n",FUNC);
|
||||
{
|
||||
intn i;
|
||||
for(i=0; i<src->extent.u.simple.rank; i++)
|
||||
printf("%s: check 5.1, new->pnt[%d]=%d\n",FUNC,i,(int)new->pnt[i]);
|
||||
}
|
||||
#endif /* QAK */
|
||||
|
||||
/* Keep the order the same when copying */
|
||||
if(new_head==NULL)
|
||||
new_head=dst->select.sel_info.pnt_lst->head=new;
|
||||
else {
|
||||
new_head->next=new;
|
||||
new_head=new;
|
||||
} /* end else */
|
||||
|
||||
curr=curr->next;
|
||||
} /* end while */
|
||||
#ifdef QAK
|
||||
printf("%s: check 10.0 src->select.sel_info.pnt_lst=%p, dst->select.sel_info.pnt_lst=%p\n",FUNC,src->select.sel_info.pnt_lst,dst->select.sel_info.pnt_lst);
|
||||
printf("%s: check 10.0 src->select.sel_info.pnt_lst->head=%p, dst->select.sel_info.pnt_lst->head=%p\n",FUNC,src->select.sel_info.pnt_lst->head,dst->select.sel_info.pnt_lst->head);
|
||||
#endif /* QAK */
|
||||
|
||||
done:
|
||||
FUNC_LEAVE (ret_value);
|
||||
} /* end H5S_point_copy() */
|
||||
|
||||
|
@ -286,6 +286,7 @@ herr_t H5S_point_mscat (const void *_tconv_buf, size_t elmt_size,
|
||||
herr_t H5S_point_add (H5S_t *space, size_t num_elemn, const hssize_t **coord);
|
||||
herr_t H5S_point_release (H5S_t *space);
|
||||
hsize_t H5S_point_npoints (const H5S_t *space);
|
||||
herr_t H5S_point_copy (H5S_t *dst, const H5S_t *src);
|
||||
|
||||
/* "All" select functions */
|
||||
herr_t H5S_all_init (const struct H5O_layout_t *layout,
|
||||
@ -337,5 +338,7 @@ herr_t H5S_hyper_release (H5S_t *space);
|
||||
herr_t H5S_hyper_sel_iter_release (H5S_sel_iter_t *sel_iter);
|
||||
hsize_t H5S_hyper_npoints (const H5S_t *space);
|
||||
int H5S_hyper_compare_regions (const void *r1, const void *r2);
|
||||
int H5S_hyper_compare_bounds (const void *r1, const void *r2);
|
||||
herr_t H5S_hyper_copy (H5S_t *dst, const H5S_t *src);
|
||||
|
||||
#endif
|
||||
|
@ -93,14 +93,55 @@ H5S_select_term(void)
|
||||
herr_t
|
||||
H5S_select_copy (H5S_t *dst, const H5S_t *src)
|
||||
{
|
||||
herr_t ret_value=SUCCEED; /* return value */
|
||||
|
||||
FUNC_ENTER (H5S_select_copy, FAIL);
|
||||
|
||||
/* Check args */
|
||||
assert(dst);
|
||||
assert(src);
|
||||
|
||||
/* Copy regular fields */
|
||||
dst->select=src->select;
|
||||
|
||||
/* Need to copy offset and order information still */
|
||||
|
||||
/* Perform correct type of copy based on the type of selection */
|
||||
switch (src->extent.type) {
|
||||
case H5S_SCALAR:
|
||||
/*nothing needed */
|
||||
break;
|
||||
|
||||
case H5S_SIMPLE:
|
||||
/* Deep copy extra stuff */
|
||||
switch(src->select.type) {
|
||||
case H5S_SEL_NONE:
|
||||
case H5S_SEL_ALL:
|
||||
/*nothing needed */
|
||||
break;
|
||||
|
||||
case H5S_SEL_POINTS:
|
||||
ret_value=H5S_point_copy(dst,src);
|
||||
break;
|
||||
|
||||
case H5S_SEL_HYPERSLABS:
|
||||
ret_value=H5S_hyper_copy(dst,src);
|
||||
break;
|
||||
|
||||
default:
|
||||
assert("unknown selection type" && 0);
|
||||
break;
|
||||
} /* end switch */
|
||||
break;
|
||||
|
||||
case H5S_COMPLEX:
|
||||
/*void */
|
||||
break;
|
||||
|
||||
default:
|
||||
assert("unknown data space type" && 0);
|
||||
break;
|
||||
}
|
||||
|
||||
FUNC_LEAVE (SUCCEED);
|
||||
} /* H5S_select_copy() */
|
||||
|
@ -27,7 +27,7 @@
|
||||
/* Version numbers */
|
||||
#define H5_VERS_MAJOR 1 /* For major interface/format changes */
|
||||
#define H5_VERS_MINOR 0 /* For minor interface/format changes */
|
||||
#define H5_VERS_RELEASE 25 /* For tweaks, bug-fixes, or development */
|
||||
#define H5_VERS_RELEASE 28 /* For tweaks, bug-fixes, or development */
|
||||
|
||||
#define H5check() H5vers_check(H5_VERS_MAJOR,H5_VERS_MINOR, \
|
||||
H5_VERS_RELEASE)
|
||||
|
Loading…
Reference in New Issue
Block a user