mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-12-03 02:32:04 +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);
|
FUNC_LEAVE (SUCCEED);
|
||||||
} /* H5S_hyper_sel_iter_release() */
|
} /* 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);
|
FUNC_LEAVE (space->select.num_elem);
|
||||||
} /* H5S_hyper_npoints() */
|
} /* 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_add (H5S_t *space, size_t num_elemn, const hssize_t **coord);
|
||||||
herr_t H5S_point_release (H5S_t *space);
|
herr_t H5S_point_release (H5S_t *space);
|
||||||
hsize_t H5S_point_npoints (const 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 */
|
/* "All" select functions */
|
||||||
herr_t H5S_all_init (const struct H5O_layout_t *layout,
|
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);
|
herr_t H5S_hyper_sel_iter_release (H5S_sel_iter_t *sel_iter);
|
||||||
hsize_t H5S_hyper_npoints (const H5S_t *space);
|
hsize_t H5S_hyper_npoints (const H5S_t *space);
|
||||||
int H5S_hyper_compare_regions (const void *r1, const void *r2);
|
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
|
#endif
|
||||||
|
@ -93,14 +93,55 @@ H5S_select_term(void)
|
|||||||
herr_t
|
herr_t
|
||||||
H5S_select_copy (H5S_t *dst, const H5S_t *src)
|
H5S_select_copy (H5S_t *dst, const H5S_t *src)
|
||||||
{
|
{
|
||||||
|
herr_t ret_value=SUCCEED; /* return value */
|
||||||
|
|
||||||
FUNC_ENTER (H5S_select_copy, FAIL);
|
FUNC_ENTER (H5S_select_copy, FAIL);
|
||||||
|
|
||||||
/* Check args */
|
/* Check args */
|
||||||
assert(dst);
|
assert(dst);
|
||||||
assert(src);
|
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 */
|
/* 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);
|
FUNC_LEAVE (SUCCEED);
|
||||||
} /* H5S_select_copy() */
|
} /* H5S_select_copy() */
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
/* Version numbers */
|
/* Version numbers */
|
||||||
#define H5_VERS_MAJOR 1 /* For major interface/format changes */
|
#define H5_VERS_MAJOR 1 /* For major interface/format changes */
|
||||||
#define H5_VERS_MINOR 0 /* For minor 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, \
|
#define H5check() H5vers_check(H5_VERS_MAJOR,H5_VERS_MINOR, \
|
||||||
H5_VERS_RELEASE)
|
H5_VERS_RELEASE)
|
||||||
|
Loading…
Reference in New Issue
Block a user