diff options
-rw-r--r-- | src/H5Shyper.c | 156 | ||||
-rw-r--r-- | src/H5Spoint.c | 79 | ||||
-rw-r--r-- | src/H5Sprivate.h | 3 | ||||
-rw-r--r-- | src/H5Sselect.c | 41 | ||||
-rw-r--r-- | src/H5public.h | 2 |
5 files changed, 280 insertions, 1 deletions
diff --git a/src/H5Shyper.c b/src/H5Shyper.c index bd69f91..7a646aa 100644 --- a/src/H5Shyper.c +++ b/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() */ + diff --git a/src/H5Spoint.c b/src/H5Spoint.c index a291d8a..91141a4 100644 --- a/src/H5Spoint.c +++ b/src/H5Spoint.c @@ -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() */ diff --git a/src/H5Sprivate.h b/src/H5Sprivate.h index e5aeabc..eb1897f 100644 --- a/src/H5Sprivate.h +++ b/src/H5Sprivate.h @@ -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 diff --git a/src/H5Sselect.c b/src/H5Sselect.c index af3dbcd..062b2a1 100644 --- a/src/H5Sselect.c +++ b/src/H5Sselect.c @@ -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() */ diff --git a/src/H5public.h b/src/H5public.h index 104ed28..641c6de 100644 --- a/src/H5public.h +++ b/src/H5public.h @@ -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) |