summaryrefslogtreecommitdiffstats
path: root/src/H5Sselect.c
diff options
context:
space:
mode:
authorDana Robinson <derobins@hdfgroup.org>2022-04-13 21:17:29 (GMT)
committerDana Robinson <derobins@hdfgroup.org>2022-04-13 21:17:29 (GMT)
commitcabc39c3e197e2591449d2604bfee26465fb60e1 (patch)
treed5f39f5f5965584bf9bf49646a2af617adfd3e4e /src/H5Sselect.c
parent7355f4c505092a7a85474b47f18d5206028e2c95 (diff)
parentab69f5df770ee3cc6cd6c81d905a5317b894a002 (diff)
downloadhdf5-feature/coding_standards.zip
hdf5-feature/coding_standards.tar.gz
hdf5-feature/coding_standards.tar.bz2
Merge branch 'develop' into feature/coding_standardsfeature/coding_standards
Diffstat (limited to 'src/H5Sselect.c')
-rw-r--r--src/H5Sselect.c1333
1 files changed, 826 insertions, 507 deletions
diff --git a/src/H5Sselect.c b/src/H5Sselect.c
index 1a13f2c..c931304 100644
--- a/src/H5Sselect.c
+++ b/src/H5Sselect.c
@@ -6,12 +6,12 @@
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the COPYING file, which can be found at the root of the source code *
- * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. *
+ * distribution tree, or in https://www.hdfgroup.org/licenses. *
* If you do not have access to either file, you may request a copy from *
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-/* Programmer: Quincey Koziol <koziol@ncsa.uiuc.ued>
+/* Programmer: Quincey Koziol
* Friday, May 29, 1998
*
* Purpose: Dataspace selection functions.
@@ -21,51 +21,45 @@
/* Module Setup */
/****************/
-#include "H5Smodule.h" /* This source code file is part of the H5S module */
-
+#include "H5Smodule.h" /* This source code file is part of the H5S module */
/***********/
/* Headers */
/***********/
-#include "H5private.h" /* Generic Functions */
-#include "H5Dprivate.h" /* Datasets */
-#include "H5Eprivate.h" /* Error handling */
-#include "H5FLprivate.h" /* Free Lists */
-#include "H5Iprivate.h" /* IDs */
-#include "H5Spkg.h" /* Dataspaces */
-#include "H5VMprivate.h" /* Vector and array functions */
-
+#include "H5private.h" /* Generic Functions */
+#include "H5Dprivate.h" /* Datasets */
+#include "H5Eprivate.h" /* Error handling */
+#include "H5FLprivate.h" /* Free Lists */
+#include "H5Iprivate.h" /* IDs */
+#include "H5MMprivate.h" /* Memory management */
+#include "H5Spkg.h" /* Dataspaces */
+#include "H5VMprivate.h" /* Vector and array functions */
/****************/
/* Local Macros */
/****************/
/* All the valid public flags to H5Ssel_iter_create() */
-#define H5S_SEL_ITER_ALL_PUBLIC_FLAGS (H5S_SEL_ITER_GET_SEQ_LIST_SORTED | \
- H5S_SEL_ITER_SHARE_WITH_DATASPACE)
-
+#define H5S_SEL_ITER_ALL_PUBLIC_FLAGS (H5S_SEL_ITER_GET_SEQ_LIST_SORTED | H5S_SEL_ITER_SHARE_WITH_DATASPACE)
/******************/
/* Local Typedefs */
/******************/
-
/********************/
/* Local Prototypes */
/********************/
#ifdef LATER
-static herr_t H5S_select_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end);
-static htri_t H5S_select_iter_has_next_block(const H5S_sel_iter_t *iter);
-static herr_t H5S_select_iter_next_block(H5S_sel_iter_t *iter);
+static herr_t H5S__select_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end);
+static htri_t H5S__select_iter_has_next_block(const H5S_sel_iter_t *iter);
+static herr_t H5S__select_iter_next_block(H5S_sel_iter_t *iter);
#endif /* LATER */
-
/*****************************/
/* Library Private Variables */
/*****************************/
-
/*********************/
/* Package Variables */
/*********************/
@@ -79,13 +73,10 @@ H5FL_SEQ_EXTERN(size_t);
/* Declare extern free list to manage sequences of hsize_t */
H5FL_SEQ_EXTERN(hsize_t);
-
/*******************/
/* Local Variables */
/*******************/
-
-
/*--------------------------------------------------------------------------
NAME
H5S_select_offset
@@ -124,7 +115,6 @@ H5S_select_offset(H5S_t *space, const hssize_t *offset)
FUNC_LEAVE_NOAPI(SUCCEED)
} /* end H5S_select_offset() */
-
/*--------------------------------------------------------------------------
NAME
H5Soffset_simple
@@ -137,37 +127,36 @@ H5S_select_offset(H5S_t *space, const hssize_t *offset)
RETURNS
Non-negative on success/Negative on failure
DESCRIPTION
- This function creates an offset for the selection within an extent, allowing
+ This function creates an offset for the selection within an extent, allowing
the same shaped selection to be moved to different locations within a
dataspace without requiring it to be re-defined.
--------------------------------------------------------------------------*/
herr_t
H5Soffset_simple(hid_t space_id, const hssize_t *offset)
{
- H5S_t *space; /* Dataspace to query */
+ H5S_t *space; /* Dataspace to modify */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "i*Hs", space_id, offset);
/* Check args */
- if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
- HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "not a dataspace")
- if(space->extent.rank == 0 || (H5S_GET_EXTENT_TYPE(space) == H5S_SCALAR
- || H5S_GET_EXTENT_TYPE(space) == H5S_NULL))
- HGOTO_ERROR(H5E_ATOM, H5E_UNSUPPORTED, FAIL, "can't set offset on scalar or null dataspace")
- if(offset == NULL)
+ if (NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+ HGOTO_ERROR(H5E_ID, H5E_BADID, FAIL, "not a dataspace")
+ if (space->extent.rank == 0 ||
+ (H5S_GET_EXTENT_TYPE(space) == H5S_SCALAR || H5S_GET_EXTENT_TYPE(space) == H5S_NULL))
+ HGOTO_ERROR(H5E_ID, H5E_UNSUPPORTED, FAIL, "can't set offset on scalar or null dataspace")
+ if (offset == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no offset specified")
/* Set the selection offset */
- if(H5S_select_offset(space, offset) < 0)
+ if (H5S_select_offset(space, offset) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "can't set offset")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Soffset_simple() */
-
/*--------------------------------------------------------------------------
NAME
H5Sselect_copy
@@ -192,28 +181,27 @@ done:
herr_t
H5Sselect_copy(hid_t dst_id, hid_t src_id)
{
- H5S_t *src;
- H5S_t *dst;
- herr_t ret_value = SUCCEED;
+ H5S_t *src;
+ H5S_t *dst;
+ herr_t ret_value = SUCCEED;
FUNC_ENTER_API(FAIL)
H5TRACE2("e", "ii", dst_id, src_id);
/* Check args */
- if(NULL == (src = (H5S_t *)H5I_object_verify(src_id, H5I_DATASPACE)))
+ if (NULL == (src = (H5S_t *)H5I_object_verify(src_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
- if(NULL == (dst = (H5S_t *)H5I_object_verify(dst_id, H5I_DATASPACE)))
+ if (NULL == (dst = (H5S_t *)H5I_object_verify(dst_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
/* Copy */
- if(H5S_select_copy(dst, src, FALSE) < 0)
+ if (H5S_select_copy(dst, src, FALSE) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "can't copy selection")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Sselect_copy() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_copy
@@ -242,7 +230,7 @@ done:
herr_t
H5S_select_copy(H5S_t *dst, const H5S_t *src, hbool_t share_selection)
{
- herr_t ret_value = FAIL; /* Return value */
+ herr_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
@@ -251,21 +239,20 @@ H5S_select_copy(H5S_t *dst, const H5S_t *src, hbool_t share_selection)
HDassert(src);
/* Release the current selection */
- if(H5S_SELECT_RELEASE(dst) < 0)
+ if (H5S_SELECT_RELEASE(dst) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection")
/* Copy regular fields */
dst->select = src->select;
/* Perform correct type of copy based on the type of selection */
- if((ret_value = (*src->select.type->copy)(dst, src, share_selection)) < 0)
+ if ((ret_value = (*src->select.type->copy)(dst, src, share_selection)) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "can't copy selection specific information")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_copy() */
-
/*-------------------------------------------------------------------------
* Function: H5S_select_release
*
@@ -285,21 +272,20 @@ done:
herr_t
H5S_select_release(H5S_t *ds)
{
- herr_t ret_value = SUCCEED; /* Return value */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT
HDassert(ds);
/* Call the selection type's release function */
- if((ds->select.type) && ((ret_value = (*ds->select.type->release)(ds)) < 0))
+ if ((ds->select.type) && ((ret_value = (*ds->select.type->release)(ds)) < 0))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_release() */
-
/*-------------------------------------------------------------------------
* Function: H5S_select_serial_size
*
@@ -318,9 +304,9 @@ done:
*-------------------------------------------------------------------------
*/
hssize_t
-H5S_select_serial_size(const H5S_t *space)
+H5S_select_serial_size(H5S_t *space)
{
- hssize_t ret_value = -1; /* Return value */
+ hssize_t ret_value = -1; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -332,7 +318,6 @@ H5S_select_serial_size(const H5S_t *space)
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_serial_size() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_serialize
@@ -358,9 +343,9 @@ H5S_select_serial_size(const H5S_t *space)
REVISION LOG
--------------------------------------------------------------------------*/
herr_t
-H5S_select_serialize(const H5S_t *space, uint8_t **p)
+H5S_select_serialize(H5S_t *space, uint8_t **p)
{
- herr_t ret_value = SUCCEED; /* Return value */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -373,7 +358,6 @@ H5S_select_serialize(const H5S_t *space, uint8_t **p)
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_serialize() */
-
/*--------------------------------------------------------------------------
NAME
H5Sget_select_npoints
@@ -394,14 +378,14 @@ H5S_select_serialize(const H5S_t *space, uint8_t **p)
hssize_t
H5Sget_select_npoints(hid_t spaceid)
{
- H5S_t *space; /* Dataspace to modify selection of */
- hssize_t ret_value; /* return value */
+ H5S_t * space; /* Dataspace to modify selection of */
+ hssize_t ret_value; /* return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("Hs", "i", spaceid);
/* Check args */
- if(NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
+ if (NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
ret_value = (hssize_t)H5S_GET_SELECT_NPOINTS(space);
@@ -410,7 +394,6 @@ done:
FUNC_LEAVE_API(ret_value)
} /* H5Sget_select_npoints() */
-
/*--------------------------------------------------------------------------
NAME
H5S_get_select_npoints
@@ -431,7 +414,7 @@ done:
EXAMPLES
REVISION LOG
--------------------------------------------------------------------------*/
-H5_ATTR_PURE hssize_t
+H5_ATTR_PURE hsize_t
H5S_get_select_npoints(const H5S_t *space)
{
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -439,10 +422,9 @@ H5S_get_select_npoints(const H5S_t *space)
/* Check args */
HDassert(space);
- FUNC_LEAVE_NOAPI((hssize_t)space->select.num_elem)
+ FUNC_LEAVE_NOAPI(space->select.num_elem)
} /* end H5S_get_select_npoints() */
-
/*--------------------------------------------------------------------------
NAME
H5Sselect_valid
@@ -466,14 +448,14 @@ H5S_get_select_npoints(const H5S_t *space)
htri_t
H5Sselect_valid(hid_t spaceid)
{
- H5S_t *space; /* Dataspace to modify selection of */
- htri_t ret_value; /* return value */
+ H5S_t *space; /* Dataspace to modify selection of */
+ htri_t ret_value; /* return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("t", "i", spaceid);
/* Check args */
- if(NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
+ if (NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
ret_value = H5S_SELECT_VALID(space);
@@ -482,7 +464,6 @@ done:
FUNC_LEAVE_API(ret_value)
} /* end H5Sselect_valid() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_valid
@@ -509,7 +490,7 @@ done:
htri_t
H5S_select_valid(const H5S_t *space)
{
- htri_t ret_value = FAIL; /* Return value */
+ htri_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -520,7 +501,6 @@ H5S_select_valid(const H5S_t *space)
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_valid() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_deserialize
@@ -550,8 +530,8 @@ H5S_select_valid(const H5S_t *space)
herr_t
H5S_select_deserialize(H5S_t **space, const uint8_t **p)
{
- uint32_t sel_type; /* Pointer to the selection type */
- herr_t ret_value = FAIL; /* Return value */
+ uint32_t sel_type; /* Pointer to the selection type */
+ herr_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
@@ -563,35 +543,34 @@ H5S_select_deserialize(H5S_t **space, const uint8_t **p)
UINT32DECODE(*p, sel_type);
/* Make routine for selection type */
- switch(sel_type) {
- case H5S_SEL_POINTS: /* Sequence of points selected */
+ switch (sel_type) {
+ case H5S_SEL_POINTS: /* Sequence of points selected */
ret_value = (*H5S_sel_point->deserialize)(space, p);
break;
- case H5S_SEL_HYPERSLABS: /* Hyperslab selection defined */
+ case H5S_SEL_HYPERSLABS: /* Hyperslab selection defined */
ret_value = (*H5S_sel_hyper->deserialize)(space, p);
break;
- case H5S_SEL_ALL: /* Entire extent selected */
+ case H5S_SEL_ALL: /* Entire extent selected */
ret_value = (*H5S_sel_all->deserialize)(space, p);
break;
- case H5S_SEL_NONE: /* Nothing selected */
+ case H5S_SEL_NONE: /* Nothing selected */
ret_value = (*H5S_sel_none->deserialize)(space, p);
break;
default:
break;
- } /* end switch */
+ }
- if(ret_value < 0)
+ if (ret_value < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTLOAD, FAIL, "can't deserialize selection")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_deserialize() */
-
/*--------------------------------------------------------------------------
NAME
H5Sget_select_bounds
@@ -623,18 +602,18 @@ done:
REVISION LOG
--------------------------------------------------------------------------*/
herr_t
-H5Sget_select_bounds(hid_t spaceid, hsize_t start[], hsize_t end[])
+H5Sget_select_bounds(hid_t spaceid, hsize_t start[] /*out*/, hsize_t end[] /*out*/)
{
- H5S_t *space; /* Dataspace to modify selection of */
- herr_t ret_value; /* return value */
+ H5S_t *space; /* Dataspace to modify selection of */
+ herr_t ret_value; /* return value */
FUNC_ENTER_API(FAIL)
- H5TRACE3("e", "i*h*h", spaceid, start, end);
+ H5TRACE3("e", "ixx", spaceid, start, end);
/* Check args */
- if(start == NULL || end == NULL)
+ if (start == NULL || end == NULL)
HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid pointer")
- if(NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
+ if (NULL == (space = (H5S_t *)H5I_object_verify(spaceid, H5I_DATASPACE)))
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace")
ret_value = H5S_SELECT_BOUNDS(space, start, end);
@@ -643,7 +622,6 @@ done:
FUNC_LEAVE_API(ret_value)
} /* end H5Sget_select_bounds() */
-
/*--------------------------------------------------------------------------
NAME
H5S_get_select_bounds
@@ -674,7 +652,7 @@ done:
herr_t
H5S_get_select_bounds(const H5S_t *space, hsize_t *start, hsize_t *end)
{
- herr_t ret_value = FAIL; /* Return value */
+ herr_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -688,7 +666,6 @@ H5S_get_select_bounds(const H5S_t *space, hsize_t *start, hsize_t *end)
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_get_select_bounds() */
-
/*--------------------------------------------------------------------------
NAME
H5S_get_select_offset
@@ -715,7 +692,7 @@ H5S_get_select_bounds(const H5S_t *space, hsize_t *start, hsize_t *end)
herr_t
H5S_get_select_offset(const H5S_t *space, hsize_t *offset)
{
- herr_t ret_value = FAIL; /* Return value */
+ herr_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -728,7 +705,6 @@ H5S_get_select_offset(const H5S_t *space, hsize_t *offset)
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_get_select_offset() */
-
/*--------------------------------------------------------------------------
NAME
H5S_get_select_unlim_dim
@@ -754,7 +730,7 @@ H5S_get_select_offset(const H5S_t *space, hsize_t *offset)
int
H5S_get_select_unlim_dim(const H5S_t *space)
{
- herr_t ret_value = FAIL; /* Return value */
+ herr_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -766,7 +742,6 @@ H5S_get_select_unlim_dim(const H5S_t *space)
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_get_select_unlim_dim() */
-
/*--------------------------------------------------------------------------
NAME
H5S_get_select_num_elem_non_unlim
@@ -788,8 +763,7 @@ H5S_get_select_unlim_dim(const H5S_t *space)
REVISION LOG
--------------------------------------------------------------------------*/
herr_t
-H5S_get_select_num_elem_non_unlim(const H5S_t *space,
- hsize_t *num_elem_non_unlim)
+H5S_get_select_num_elem_non_unlim(const H5S_t *space, hsize_t *num_elem_non_unlim)
{
herr_t ret_value = SUCCEED; /* return value */
@@ -800,18 +774,18 @@ H5S_get_select_num_elem_non_unlim(const H5S_t *space,
HDassert(num_elem_non_unlim);
/* Check for selection callback */
- if(!space->select.type->num_elem_non_unlim)
+ if (!space->select.type->num_elem_non_unlim)
HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "selection type has no num_elem_non_unlim callback")
/* Make selection callback */
- if((*space->select.type->num_elem_non_unlim)(space, num_elem_non_unlim) < 0)
- HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOUNT, FAIL, "can't get number of elements in non-unlimited dimension")
+ if ((*space->select.type->num_elem_non_unlim)(space, num_elem_non_unlim) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOUNT, FAIL,
+ "can't get number of elements in non-unlimited dimension")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_get_select_unlim_dim() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_is_contiguous
@@ -836,7 +810,7 @@ done:
htri_t
H5S_select_is_contiguous(const H5S_t *space)
{
- herr_t ret_value = FAIL; /* Return value */
+ herr_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -848,7 +822,6 @@ H5S_select_is_contiguous(const H5S_t *space)
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_is_contiguous() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_is_single
@@ -873,7 +846,7 @@ H5S_select_is_contiguous(const H5S_t *space)
htri_t
H5S_select_is_single(const H5S_t *space)
{
- herr_t ret_value = FAIL; /* Return value */
+ herr_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -885,7 +858,6 @@ H5S_select_is_single(const H5S_t *space)
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_is_single() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_is_regular
@@ -908,9 +880,9 @@ H5S_select_is_single(const H5S_t *space)
REVISION LOG
--------------------------------------------------------------------------*/
htri_t
-H5S_select_is_regular(const H5S_t *space)
+H5S_select_is_regular(H5S_t *space)
{
- herr_t ret_value = FAIL; /* Return value */
+ herr_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -922,7 +894,6 @@ H5S_select_is_regular(const H5S_t *space)
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_is_regular() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_adjust_u
@@ -947,9 +918,7 @@ H5S_select_is_regular(const H5S_t *space)
herr_t
H5S_select_adjust_u(H5S_t *space, const hsize_t *offset)
{
- hbool_t non_zero_offset = FALSE; /* Whether any offset is non-zero */
- unsigned u; /* Local index variable */
- herr_t ret_value = SUCCEED; /* Return value */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -957,23 +926,53 @@ H5S_select_adjust_u(H5S_t *space, const hsize_t *offset)
HDassert(space);
HDassert(offset);
- /* Check for an all-zero offset vector */
- for(u = 0; u < space->extent.rank; u++)
- if(0 != offset[u]) {
- non_zero_offset = TRUE;
- break;
- } /* end if */
-
- /* Only perform operation if the offset is non-zero */
- if(non_zero_offset)
- ret_value = (*space->select.type->adjust_u)(space, offset);
+ /* Perform operation */
+ ret_value = (*space->select.type->adjust_u)(space, offset);
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_adjust_u() */
/*--------------------------------------------------------------------------
NAME
- H5Sselect_adjust_u
+ H5S_select_adjust_s
+ PURPOSE
+ Adjust a selection by subtracting an offset
+ USAGE
+ herr_t H5S_select_adjust_u(space, offset)
+ H5S_t *space; IN/OUT: Pointer to dataspace to adjust
+ const hssize_t *offset; IN: Offset to subtract
+ RETURNS
+ Non-negative on success, negative on failure
+ DESCRIPTION
+ Moves a selection by subtracting an offset from it.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ This routine participates in the "Inlining C function pointers"
+ pattern, don't call it directly, use the appropriate macro
+ defined in H5Sprivate.h.
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5S_select_adjust_s(H5S_t *space, const hssize_t *offset)
+{
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_NOAPI_NOINIT_NOERR
+
+ /* Check args */
+ HDassert(space);
+ HDassert(offset);
+
+ /* Perform operation */
+ ret_value = (*space->select.type->adjust_s)(space, offset);
+
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S_select_adjust_s() */
+
+/*--------------------------------------------------------------------------
+ NAME
+ H5Sselect_adjust
PURPOSE
Adjust a selection by subtracting an offset
USAGE
@@ -990,27 +989,36 @@ H5S_select_adjust_u(H5S_t *space, const hsize_t *offset)
REVISION LOG
--------------------------------------------------------------------------*/
herr_t
-H5Sselect_adjust_u(hid_t space_id, const hsize_t *offset)
+H5Sselect_adjust(hid_t space_id, const hssize_t *offset)
{
- H5S_t *space;
- herr_t ret_value = SUCCEED; /* Return value */
+ H5S_t * space;
+ hsize_t low_bounds[H5S_MAX_RANK];
+ hsize_t high_bounds[H5S_MAX_RANK];
+ unsigned u;
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
- H5TRACE2("e", "i*h", space_id, offset);
+ H5TRACE2("e", "i*Hs", space_id, offset);
- if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+ if (NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace")
- if(NULL == offset)
+ if (NULL == offset)
HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "NULL offset pointer")
- if(H5S_select_adjust_u(space, offset) < 0)
- HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, FAIL, "can't adjust selection");
+ /* Check bounds */
+ if (H5S_SELECT_BOUNDS(space, low_bounds, high_bounds) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get selection bounds")
+ for (u = 0; u < space->extent.rank; u++)
+ if (offset[u] > (hssize_t)low_bounds[u])
+ HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "adjustment would move selection below zero offset")
+
+ if (H5S_select_adjust_s(space, offset) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, FAIL, "can't adjust selection")
done:
FUNC_LEAVE_API(ret_value)
-} /* end H5Sselect_adjust_u() */
+} /* end H5Sselect_adjust() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_project_scalar
@@ -1036,7 +1044,7 @@ done:
herr_t
H5S_select_project_scalar(const H5S_t *space, hsize_t *offset)
{
- herr_t ret_value = FAIL; /* Return value */
+ herr_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -1049,7 +1057,6 @@ H5S_select_project_scalar(const H5S_t *space, hsize_t *offset)
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_project_scalar() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_project_simple
@@ -1076,7 +1083,7 @@ H5S_select_project_scalar(const H5S_t *space, hsize_t *offset)
herr_t
H5S_select_project_simple(const H5S_t *space, H5S_t *new_space, hsize_t *offset)
{
- herr_t ret_value = FAIL; /* Return value */
+ herr_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -1090,7 +1097,6 @@ H5S_select_project_simple(const H5S_t *space, H5S_t *new_space, hsize_t *offset)
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_project_simple() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_iter_init
@@ -1110,10 +1116,9 @@ H5S_select_project_simple(const H5S_t *space, H5S_t *new_space, hsize_t *offset)
in the dataspace's selection.
--------------------------------------------------------------------------*/
herr_t
-H5S_select_iter_init(H5S_sel_iter_t *sel_iter, const H5S_t *space,
- size_t elmt_size, unsigned flags)
+H5S_select_iter_init(H5S_sel_iter_t *sel_iter, H5S_t *space, size_t elmt_size, unsigned flags)
{
- herr_t ret_value = FAIL; /* Return value */
+ herr_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -1127,10 +1132,10 @@ H5S_select_iter_init(H5S_sel_iter_t *sel_iter, const H5S_t *space,
sel_iter->rank = space->extent.rank;
/* If dims > 0, copy the dataspace dimensions & selection offset */
- if(sel_iter->rank > 0) {
+ if (sel_iter->rank > 0) {
H5MM_memcpy(sel_iter->dims, space->extent.size, sizeof(hsize_t) * space->extent.rank);
H5MM_memcpy(sel_iter->sel_off, space->select.offset, sizeof(hsize_t) * space->extent.rank);
- } /* end if */
+ }
/* Save the element size */
sel_iter->elmt_size = elmt_size;
@@ -1148,7 +1153,6 @@ H5S_select_iter_init(H5S_sel_iter_t *sel_iter, const H5S_t *space,
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_iter_init() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_iter_coords
@@ -1174,7 +1178,7 @@ H5S_select_iter_init(H5S_sel_iter_t *sel_iter, const H5S_t *space,
herr_t
H5S_select_iter_coords(const H5S_sel_iter_t *sel_iter, hsize_t *coords)
{
- herr_t ret_value = FAIL; /* Return value */
+ herr_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -1189,14 +1193,14 @@ H5S_select_iter_coords(const H5S_sel_iter_t *sel_iter, hsize_t *coords)
} /* end H5S_select_iter_coords() */
#ifdef LATER
-
+
/*--------------------------------------------------------------------------
NAME
- H5S_select_iter_block
+ H5S__select_iter_block
PURPOSE
Get the block of the current iterator position
USAGE
- herr_t H5S_select_iter_block(sel_iter,start,end)
+ herr_t H5S__select_iter_block(sel_iter,start,end)
const H5S_sel_iter_t *sel_iter; IN: Selection iterator to query
hsize_t *start; OUT: Array to place iterator start block coordinates
hsize_t *end; OUT: Array to place iterator end block coordinates
@@ -1214,11 +1218,11 @@ H5S_select_iter_coords(const H5S_sel_iter_t *sel_iter, hsize_t *coords)
REVISION LOG
--------------------------------------------------------------------------*/
static herr_t
-H5S_select_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end)
+H5S__select_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end)
{
- herr_t ret_value; /* return value */
+ herr_t ret_value; /* return value */
- FUNC_ENTER_NOAPI_NOINIT_NOERR
+ FUNC_ENTER_PACKAGE_NOERR
/* Check args */
HDassert(iter);
@@ -1229,10 +1233,9 @@ H5S_select_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end)
ret_value = (*iter->type->iter_block)(iter, start, end);
FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5S_select_iter_block() */
+} /* end H5S__select_iter_block() */
#endif /* LATER */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_iter_nelmts
@@ -1256,7 +1259,7 @@ H5S_select_iter_block(const H5S_sel_iter_t *iter, hsize_t *start, hsize_t *end)
hsize_t
H5S_select_iter_nelmts(const H5S_sel_iter_t *sel_iter)
{
- hsize_t ret_value = 0; /* Return value */
+ hsize_t ret_value = 0; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -1270,14 +1273,14 @@ H5S_select_iter_nelmts(const H5S_sel_iter_t *sel_iter)
} /* end H5S_select_iter_nelmts() */
#ifdef LATER
-
+
/*--------------------------------------------------------------------------
NAME
- H5S_select_iter_has_next_block
+ H5S__select_iter_has_next_block
PURPOSE
Check if there is another block available in the selection iterator
USAGE
- htri_t H5S_select_iter_has_next_block(sel_iter)
+ htri_t H5S__select_iter_has_next_block(sel_iter)
const H5S_sel_iter_t *sel_iter; IN: Selection iterator to query
RETURNS
Non-negative on success, negative on failure.
@@ -1293,11 +1296,11 @@ H5S_select_iter_nelmts(const H5S_sel_iter_t *sel_iter)
REVISION LOG
--------------------------------------------------------------------------*/
static htri_t
-H5S_select_iter_has_next_block(const H5S_sel_iter_t *iter)
+H5S__select_iter_has_next_block(const H5S_sel_iter_t *iter)
{
- herr_t ret_value; /* return value */
+ herr_t ret_value; /* return value */
- FUNC_ENTER_NOAPI_NOINIT_NOERR
+ FUNC_ENTER_PACKAGE_NOERR
/* Check args */
HDassert(iter);
@@ -1306,10 +1309,9 @@ H5S_select_iter_has_next_block(const H5S_sel_iter_t *iter)
ret_value = (*iter->type->iter_has_next_block)(iter);
FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5S_select_iter_has_next_block() */
+} /* end H5S__select_iter_has_next_block() */
#endif /* LATER */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_iter_next
@@ -1335,32 +1337,32 @@ H5S_select_iter_has_next_block(const H5S_sel_iter_t *iter)
herr_t
H5S_select_iter_next(H5S_sel_iter_t *iter, size_t nelem)
{
- herr_t ret_value = FAIL; /* Return value */
+ herr_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
/* Check args */
HDassert(iter);
- HDassert(nelem>0);
+ HDassert(nelem > 0);
/* Call iter_next routine for selection type */
ret_value = (*iter->type->iter_next)(iter, nelem);
/* Decrement the number of elements left in selection */
- iter->elmt_left-=nelem;
+ iter->elmt_left -= nelem;
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_iter_next() */
#ifdef LATER
-
+
/*--------------------------------------------------------------------------
NAME
- H5S_select_iter_next_block
+ H5S__select_iter_next_block
PURPOSE
Advance selection iterator to next block
USAGE
- herr_t H5S_select_iter_next_block(iter)
+ herr_t H5S__select_iter_next_block(iter)
H5S_sel_iter_t *iter; IN/OUT: Selection iterator to change
RETURNS
Non-negative on success, negative on failure.
@@ -1378,11 +1380,11 @@ H5S_select_iter_next(H5S_sel_iter_t *iter, size_t nelem)
REVISION LOG
--------------------------------------------------------------------------*/
static herr_t
-H5S_select_iter_next_block(H5S_sel_iter_t *iter)
+H5S__select_iter_next_block(H5S_sel_iter_t *iter)
{
- herr_t ret_value; /* return value */
+ herr_t ret_value; /* return value */
- FUNC_ENTER_NOAPI_NOINIT_NOERR
+ FUNC_ENTER_PACKAGE_NOERR
/* Check args */
HDassert(iter);
@@ -1391,10 +1393,9 @@ H5S_select_iter_next_block(H5S_sel_iter_t *iter)
ret_value = (*iter->type->iter_next_block)(iter);
FUNC_LEAVE_NOAPI(ret_value)
-} /* end H5S_select_iter_next_block() */
+} /* end H5S__select_iter_next_block() */
#endif /* LATER */
-
/*-------------------------------------------------------------------------
* Function: H5S_select_iter_get_seq_list
*
@@ -1413,10 +1414,10 @@ H5S_select_iter_next_block(H5S_sel_iter_t *iter)
*-------------------------------------------------------------------------
*/
herr_t
-H5S_select_iter_get_seq_list(H5S_sel_iter_t *iter, size_t maxseq, size_t maxelmts,
- size_t *nseq, size_t *nelmts, hsize_t *off, size_t *len)
+H5S_select_iter_get_seq_list(H5S_sel_iter_t *iter, size_t maxseq, size_t maxelmts, size_t *nseq,
+ size_t *nelmts, hsize_t *off, size_t *len)
{
- herr_t ret_value = FAIL; /* Return value */
+ herr_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT
@@ -1424,14 +1425,13 @@ H5S_select_iter_get_seq_list(H5S_sel_iter_t *iter, size_t maxseq, size_t maxelmt
HDassert(iter);
/* Call the selection type's get_seq_list function */
- if((ret_value = (*iter->type->iter_get_seq_list)(iter, maxseq, maxelmts, nseq, nelmts, off, len)) < 0)
+ if ((ret_value = (*iter->type->iter_get_seq_list)(iter, maxseq, maxelmts, nseq, nelmts, off, len)) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get selection sequence list")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_iter_get_seq_list() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_iter_release
@@ -1455,7 +1455,7 @@ done:
herr_t
H5S_select_iter_release(H5S_sel_iter_t *sel_iter)
{
- herr_t ret_value = FAIL; /* Return value */
+ herr_t ret_value = FAIL; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -1468,7 +1468,6 @@ H5S_select_iter_release(H5S_sel_iter_t *sel_iter)
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_iter_release() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_iterate
@@ -1498,20 +1497,19 @@ H5S_select_iter_release(H5S_sel_iter_t *sel_iter)
the selection is not modified.
--------------------------------------------------------------------------*/
herr_t
-H5S_select_iterate(void *buf, const H5T_t *type, const H5S_t *space,
- const H5S_sel_iter_op_t *op, void *op_data)
+H5S_select_iterate(void *buf, const H5T_t *type, H5S_t *space, const H5S_sel_iter_op_t *op, void *op_data)
{
- H5S_sel_iter_t *iter = NULL; /* Selection iteration info */
- hbool_t iter_init = FALSE; /* Selection iteration info has been initialized */
- hsize_t *off = NULL; /* Array to store sequence offsets */
- size_t *len = NULL; /* Array to store sequence lengths */
- hssize_t nelmts; /* Number of elements in selection */
- hsize_t space_size[H5S_MAX_RANK]; /* Dataspace size */
- size_t max_elem; /* Maximum number of elements allowed in sequences */
- size_t elmt_size; /* Datatype size */
- unsigned ndims; /* Number of dimensions in dataspace */
- herr_t user_ret = 0; /* User's return value */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5S_sel_iter_t *iter = NULL; /* Selection iteration info */
+ hbool_t iter_init = FALSE; /* Selection iteration info has been initialized */
+ hsize_t * off = NULL; /* Array to store sequence offsets */
+ size_t * len = NULL; /* Array to store sequence lengths */
+ hssize_t nelmts; /* Number of elements in selection */
+ hsize_t space_size[H5S_MAX_RANK]; /* Dataspace size */
+ size_t max_elem; /* Maximum number of elements allowed in sequences */
+ size_t elmt_size; /* Datatype size */
+ unsigned ndims; /* Number of dimensions in dataspace */
+ herr_t user_ret = 0; /* User's return value */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
@@ -1522,29 +1520,29 @@ H5S_select_iterate(void *buf, const H5T_t *type, const H5S_t *space,
HDassert(op);
/* Get the datatype size */
- if(0 == (elmt_size = H5T_get_size(type)))
+ if (0 == (elmt_size = H5T_get_size(type)))
HGOTO_ERROR(H5E_DATATYPE, H5E_BADSIZE, FAIL, "datatype size invalid")
/* Allocate the selection iterator */
- if(NULL == (iter = H5FL_MALLOC(H5S_sel_iter_t)))
+ if (NULL == (iter = H5FL_MALLOC(H5S_sel_iter_t)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate selection iterator")
/* Initialize iterator */
- if(H5S_select_iter_init(iter, space, elmt_size, 0) < 0)
+ if (H5S_select_iter_init(iter, space, elmt_size, 0) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
- iter_init = TRUE; /* Selection iteration info has been initialized */
+ iter_init = TRUE; /* Selection iteration info has been initialized */
/* Get the number of elements in selection */
- if((nelmts = (hssize_t)H5S_GET_SELECT_NPOINTS(space)) < 0)
+ if ((nelmts = (hssize_t)H5S_GET_SELECT_NPOINTS(space)) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOUNT, FAIL, "can't get number of elements selected")
/* Get the rank of the dataspace */
ndims = space->extent.rank;
- if(ndims > 0) {
- /* Copy the size of the space */
- HDassert(space->extent.size);
- H5MM_memcpy(space_size, space->extent.size, ndims * sizeof(hsize_t));
+ if (ndims > 0) {
+ /* Copy the size of the space */
+ HDassert(space->extent.size);
+ H5MM_memcpy(space_size, space->extent.size, ndims * sizeof(hsize_t));
} /* end if */
space_size[ndims] = elmt_size;
@@ -1552,25 +1550,26 @@ H5S_select_iterate(void *buf, const H5T_t *type, const H5S_t *space,
H5_CHECKED_ASSIGN(max_elem, size_t, nelmts, hssize_t);
/* Allocate the offset & length arrays */
- if(NULL == (len = H5FL_SEQ_MALLOC(size_t, H5D_IO_VECTOR_SIZE)))
+ if (NULL == (len = H5FL_SEQ_MALLOC(size_t, H5D_IO_VECTOR_SIZE)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate length vector array")
- if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, H5D_IO_VECTOR_SIZE)))
+ if (NULL == (off = H5FL_SEQ_MALLOC(hsize_t, H5D_IO_VECTOR_SIZE)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate offset vector array")
/* Loop, while elements left in selection */
- while(max_elem > 0 && user_ret == 0) {
- size_t nelem; /* Number of elements used in sequences */
- size_t nseq; /* Number of sequences generated */
- size_t curr_seq; /* Current sequence being worked on */
+ while (max_elem > 0 && user_ret == 0) {
+ size_t nelem; /* Number of elements used in sequences */
+ size_t nseq; /* Number of sequences generated */
+ size_t curr_seq; /* Current sequence being worked on */
/* Get the sequences of bytes */
- if(H5S_SELECT_ITER_GET_SEQ_LIST(iter, (size_t)H5D_IO_VECTOR_SIZE, max_elem, &nseq, &nelem, off, len) < 0)
+ if (H5S_SELECT_ITER_GET_SEQ_LIST(iter, (size_t)H5D_IO_VECTOR_SIZE, max_elem, &nseq, &nelem, off,
+ len) < 0)
HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
/* Loop, while sequences left to process */
- for(curr_seq = 0; curr_seq < nseq && user_ret == 0; curr_seq++) {
- hsize_t curr_off; /* Current offset within sequence */
- size_t curr_len; /* Length of bytes left to process in sequence */
+ for (curr_seq = 0; curr_seq < nseq && user_ret == 0; curr_seq++) {
+ hsize_t curr_off; /* Current offset within sequence */
+ size_t curr_len; /* Length of bytes left to process in sequence */
/* Get the current offset */
curr_off = off[curr_seq];
@@ -1579,14 +1578,14 @@ H5S_select_iterate(void *buf, const H5T_t *type, const H5S_t *space,
curr_len = len[curr_seq];
/* Loop, while bytes left in sequence */
- while(curr_len > 0 && user_ret == 0) {
- hsize_t coords[H5S_MAX_RANK]; /* Coordinates of element in dataspace */
- hsize_t tmp_off; /* Temporary offset within sequence */
- uint8_t *loc; /* Current element location in buffer */
- int i; /* Local Index variable */
+ while (curr_len > 0 && user_ret == 0) {
+ hsize_t coords[H5S_MAX_RANK]; /* Coordinates of element in dataspace */
+ hsize_t tmp_off; /* Temporary offset within sequence */
+ uint8_t *loc; /* Current element location in buffer */
+ int i; /* Local Index variable */
/* Compute the coordinate from the offset */
- for(i = (int)ndims, tmp_off = curr_off; i >= 0; i--) {
+ for (i = (int)ndims, tmp_off = curr_off; i >= 0; i--) {
coords[i] = tmp_off % space_size[i];
tmp_off /= space_size[i];
} /* end for */
@@ -1595,23 +1594,23 @@ H5S_select_iterate(void *buf, const H5T_t *type, const H5S_t *space,
loc = (unsigned char *)buf + curr_off;
/* Check which type of callback to make */
- switch(op->op_type) {
+ switch (op->op_type) {
case H5S_SEL_ITER_OP_APP:
/* Make the application callback */
user_ret = (op->u.app_op.op)(loc, op->u.app_op.type_id, ndims, coords, op_data);
- break;
+ break;
case H5S_SEL_ITER_OP_LIB:
/* Call the library's callback */
user_ret = (op->u.lib_op)(loc, type, ndims, coords, op_data);
- break;
+ break;
default:
HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "unsupported op type")
} /* end switch */
/* Check for error return from iterator */
- if(user_ret < 0)
+ if (user_ret < 0)
HERROR(H5E_DATASPACE, H5E_CANTNEXT, "iteration operator failed");
/* Increment offset in dataspace */
@@ -1620,7 +1619,7 @@ H5S_select_iterate(void *buf, const H5T_t *type, const H5S_t *space,
/* Decrement number of bytes left in sequence */
curr_len -= elmt_size;
} /* end while */
- } /* end for */
+ } /* end for */
/* Decrement number of elements left to process */
max_elem -= nelem;
@@ -1631,21 +1630,20 @@ H5S_select_iterate(void *buf, const H5T_t *type, const H5S_t *space,
done:
/* Release resources, if allocated */
- if(len)
+ if (len)
len = H5FL_SEQ_FREE(size_t, len);
- if(off)
+ if (off)
off = H5FL_SEQ_FREE(hsize_t, off);
/* Release selection iterator */
- if(iter_init && H5S_SELECT_ITER_RELEASE(iter) < 0)
+ if (iter_init && H5S_SELECT_ITER_RELEASE(iter) < 0)
HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
- if(iter)
+ if (iter)
iter = H5FL_FREE(H5S_sel_iter_t, iter);
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_iterate() */
-
/*--------------------------------------------------------------------------
NAME
H5Sget_select_type
@@ -1658,21 +1656,21 @@ done:
Non-negative on success/Negative on failure. Return value is from the
set of values in the H5S_sel_type enumerated type.
DESCRIPTION
- This function retrieves the type of selection currently defined for
+ This function retrieves the type of selection currently defined for
a dataspace.
--------------------------------------------------------------------------*/
H5S_sel_type
H5Sget_select_type(hid_t space_id)
{
- H5S_t *space; /* dataspace to modify */
- H5S_sel_type ret_value; /* Return value */
+ H5S_t * space; /* dataspace to modify */
+ H5S_sel_type ret_value; /* Return value */
FUNC_ENTER_API(H5S_SEL_ERROR)
H5TRACE1("St", "i", space_id);
/* Check args */
- if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
- HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, H5S_SEL_ERROR, "not a dataspace")
+ if (NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+ HGOTO_ERROR(H5E_ID, H5E_BADID, H5S_SEL_ERROR, "not a dataspace")
/* Set return value */
ret_value = H5S_GET_SELECT_TYPE(space);
@@ -1681,7 +1679,6 @@ done:
FUNC_LEAVE_API(ret_value)
} /* end H5Sget_select_type() */
-
/*--------------------------------------------------------------------------
NAME
H5S_get_select_type
@@ -1694,7 +1691,7 @@ done:
Non-negative on success/Negative on failure. Return value is from the
set of values in the H5S_sel_type enumerated type.
DESCRIPTION
- This function retrieves the type of selection currently defined for
+ This function retrieves the type of selection currently defined for
a dataspace.
COMMENTS
This routine participates in the "Inlining C function pointers"
@@ -1704,7 +1701,7 @@ done:
H5_ATTR_PURE H5S_sel_type
H5S_get_select_type(const H5S_t *space)
{
- H5S_sel_type ret_value = H5S_SEL_ERROR; /* Return value */
+ H5S_sel_type ret_value = H5S_SEL_ERROR; /* Return value */
FUNC_ENTER_NOAPI_NOINIT_NOERR
@@ -1717,7 +1714,6 @@ H5S_get_select_type(const H5S_t *space)
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_get_select_type() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_shape_same
@@ -1742,13 +1738,13 @@ H5S_get_select_type(const H5S_t *space)
REVISION LOG
--------------------------------------------------------------------------*/
htri_t
-H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
+H5S_select_shape_same(H5S_t *space1, H5S_t *space2)
{
- H5S_sel_iter_t *iter_a = NULL; /* Selection a iteration info */
- H5S_sel_iter_t *iter_b = NULL; /* Selection b iteration info */
- hbool_t iter_a_init = FALSE; /* Selection a iteration info has been initialized */
- hbool_t iter_b_init = FALSE; /* Selection b iteration info has been initialized */
- htri_t ret_value = TRUE; /* Return value */
+ H5S_sel_iter_t *iter_a = NULL; /* Selection a iteration info */
+ H5S_sel_iter_t *iter_b = NULL; /* Selection b iteration info */
+ hbool_t iter_a_init = FALSE; /* Selection a iteration info has been initialized */
+ hbool_t iter_b_init = FALSE; /* Selection b iteration info has been initialized */
+ htri_t ret_value = TRUE; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
@@ -1757,20 +1753,20 @@ H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
HDassert(space2);
/* Check for different number of elements selected */
- if(H5S_GET_SELECT_NPOINTS(space1) != H5S_GET_SELECT_NPOINTS(space2))
+ if (H5S_GET_SELECT_NPOINTS(space1) != H5S_GET_SELECT_NPOINTS(space2))
HGOTO_DONE(FALSE)
/* Check special cases if both dataspaces aren't scalar */
/* (If only one is, the number of selected points check is sufficient) */
- if(space1->extent.rank > 0 && space2->extent.rank > 0) {
- const H5S_t *space_a; /* Dataspace with larger rank */
- const H5S_t *space_b; /* Dataspace with smaller rank */
- unsigned space_a_rank; /* Number of dimensions of dataspace A */
- unsigned space_b_rank; /* Number of dimensions of dataspace B */
- int space_a_dim; /* Current dimension in dataspace A */
- int space_b_dim; /* Current dimension in dataspace B */
- H5S_sel_type sel_a_type; /* Selection type for dataspace A */
- H5S_sel_type sel_b_type; /* Selection type for dataspace B */
+ if (space1->extent.rank > 0 && space2->extent.rank > 0) {
+ H5S_t * space_a; /* Dataspace with larger rank */
+ H5S_t * space_b; /* Dataspace with smaller rank */
+ unsigned space_a_rank; /* Number of dimensions of dataspace A */
+ unsigned space_b_rank; /* Number of dimensions of dataspace B */
+ int space_a_dim; /* Current dimension in dataspace A */
+ int space_b_dim; /* Current dimension in dataspace B */
+ H5S_sel_type sel_a_type; /* Selection type for dataspace A */
+ H5S_sel_type sel_b_type; /* Selection type for dataspace B */
/* Need to be able to handle spaces of different rank:
*
@@ -1786,7 +1782,7 @@ H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
*
* Set all this up here.
*/
- if(space1->extent.rank >= space2->extent.rank) {
+ if (space1->extent.rank >= space2->extent.rank) {
space_a = space1;
space_b = space2;
} /* end if */
@@ -1804,29 +1800,30 @@ H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
sel_b_type = H5S_GET_SELECT_TYPE(space_b);
/* If selections aren't "none", compare their bounds */
- if(sel_a_type != H5S_SEL_NONE && sel_b_type != H5S_SEL_NONE) {
- hsize_t low_a[H5S_MAX_RANK]; /* Low bound of selection in dataspace a */
- hsize_t low_b[H5S_MAX_RANK]; /* Low bound of selection in dataspace b */
- hsize_t high_a[H5S_MAX_RANK]; /* High bound of selection in dataspace a */
- hsize_t high_b[H5S_MAX_RANK]; /* High bound of selection in dataspace b */
+ if (sel_a_type != H5S_SEL_NONE && sel_b_type != H5S_SEL_NONE) {
+ hsize_t low_a[H5S_MAX_RANK]; /* Low bound of selection in dataspace a */
+ hsize_t low_b[H5S_MAX_RANK]; /* Low bound of selection in dataspace b */
+ hsize_t high_a[H5S_MAX_RANK]; /* High bound of selection in dataspace a */
+ hsize_t high_b[H5S_MAX_RANK]; /* High bound of selection in dataspace b */
/* Get low & high bounds for both dataspaces */
- if(H5S_SELECT_BOUNDS(space_a, low_a, high_a) < 0)
- HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get selection bounds for first dataspace")
- if(H5S_SELECT_BOUNDS(space_b, low_b, high_b) < 0)
- HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get selection bounds for second dataspace")
+ if (H5S_SELECT_BOUNDS(space_a, low_a, high_a) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL,
+ "can't get selection bounds for first dataspace")
+ if (H5S_SELECT_BOUNDS(space_b, low_b, high_b) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL,
+ "can't get selection bounds for second dataspace")
/* Check that the range between the low & high bounds are the same */
space_a_dim = (int)space_a_rank - 1;
space_b_dim = (int)space_b_rank - 1;
- while(space_b_dim >= 0) {
+ while (space_b_dim >= 0) {
/* Sanity check */
HDassert(low_a[space_a_dim] <= high_a[space_a_dim]);
HDassert(low_a[space_b_dim] <= high_a[space_b_dim]);
/* Verify that the ranges are the same */
- if((high_a[space_a_dim] - low_a[space_a_dim])
- != (high_b[space_b_dim] - low_b[space_b_dim]))
+ if ((high_a[space_a_dim] - low_a[space_a_dim]) != (high_b[space_b_dim] - low_b[space_b_dim]))
HGOTO_DONE(FALSE)
/* Go to next dimension */
@@ -1835,36 +1832,45 @@ H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
} /* end while */
/* Check that the rest of the ranges in space a are "flat" */
- while(space_a_dim >= 0) {
+ while (space_a_dim >= 0) {
/* Sanity check */
HDassert(low_a[space_a_dim] <= high_a[space_a_dim]);
/* This range should be flat to be the same in a lower dimension */
- if(low_a[space_a_dim] != high_a[space_a_dim])
+ if (low_a[space_a_dim] != high_a[space_a_dim])
HGOTO_DONE(FALSE)
space_a_dim--;
} /* end while */
- } /* end if */
+
+ /* Check for a single block in each selection */
+ if (H5S_SELECT_IS_SINGLE(space_a) && H5S_SELECT_IS_SINGLE(space_b)) {
+ /* If both selections are a single block and their bounds are
+ * the same, then the selections are the same, even if the
+ * selection types are different.
+ */
+ HGOTO_DONE(TRUE)
+ } /* end if */
+ } /* end if */
/* If the dataspaces have the same selection type, use the selection's
* shape_same operator.
*/
- if(sel_a_type == sel_b_type)
+ if (sel_a_type == sel_b_type)
ret_value = (*space_a->select.type->shape_same)(space_a, space_b);
/* Otherwise, iterate through all the blocks in the selection */
else {
- hsize_t start_a[H5S_MAX_RANK]; /* Start point of selection block in dataspace a */
- hsize_t start_b[H5S_MAX_RANK]; /* Start point of selection block in dataspace b */
- hsize_t end_a[H5S_MAX_RANK]; /* End point of selection block in dataspace a */
- hsize_t end_b[H5S_MAX_RANK]; /* End point of selection block in dataspace b */
- hssize_t offset[H5S_MAX_RANK]; /* Offset of selection b blocks relative to selection a blocks */
- hbool_t first_block = TRUE; /* Flag to indicate the first block */
+ hsize_t start_a[H5S_MAX_RANK]; /* Start point of selection block in dataspace a */
+ hsize_t start_b[H5S_MAX_RANK]; /* Start point of selection block in dataspace b */
+ hsize_t end_a[H5S_MAX_RANK]; /* End point of selection block in dataspace a */
+ hsize_t end_b[H5S_MAX_RANK]; /* End point of selection block in dataspace b */
+ hssize_t offset[H5S_MAX_RANK]; /* Offset of selection b blocks relative to selection a blocks */
+ hbool_t first_block = TRUE; /* Flag to indicate the first block */
/* Allocate the selection iterators */
- if(NULL == (iter_a = H5FL_MALLOC(H5S_sel_iter_t)))
+ if (NULL == (iter_a = H5FL_MALLOC(H5S_sel_iter_t)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate selection iterator")
- if(NULL == (iter_b = H5FL_MALLOC(H5S_sel_iter_t)))
+ if (NULL == (iter_b = H5FL_MALLOC(H5S_sel_iter_t)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate selection iterator")
/* Initialize iterator for each dataspace selection
@@ -1872,21 +1878,21 @@ H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
* that the selection iterator shouldn't be "flattened", since we
* aren't actually going to be doing I/O with the iterators.
*/
- if(H5S_select_iter_init(iter_a, space_a, (size_t)0, 0) < 0)
+ if (H5S_select_iter_init(iter_a, space_a, (size_t)0, 0) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator a")
iter_a_init = TRUE;
- if(H5S_select_iter_init(iter_b, space_b, (size_t)0, 0) < 0)
+ if (H5S_select_iter_init(iter_b, space_b, (size_t)0, 0) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator b")
iter_b_init = TRUE;
/* Iterate over all the blocks in each selection */
- while(1) {
- htri_t status_a, status_b; /* Status from next block checks */
+ while (1) {
+ htri_t status_a, status_b; /* Status from next block checks */
/* Get the current block for each selection iterator */
- if(H5S_SELECT_ITER_BLOCK(iter_a, start_a, end_a) < 0)
+ if (H5S_SELECT_ITER_BLOCK(iter_a, start_a, end_a) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get iterator block a")
- if(H5S_SELECT_ITER_BLOCK(iter_b, start_b, end_b) < 0)
+ if (H5S_SELECT_ITER_BLOCK(iter_b, start_b, end_b) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get iterator block b")
space_a_dim = (int)space_a_rank - 1;
@@ -1895,13 +1901,13 @@ H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
/* The first block only compares the sizes and sets the
* relative offsets for later blocks
*/
- if(first_block) {
+ if (first_block) {
/* If the block sizes in the common dimensions from
* each selection don't match, get out
*/
- while(space_b_dim >= 0) {
- if((end_a[space_a_dim] - start_a[space_a_dim]) !=
- (end_b[space_b_dim] - start_b[space_b_dim]))
+ while (space_b_dim >= 0) {
+ if ((end_a[space_a_dim] - start_a[space_a_dim]) !=
+ (end_b[space_b_dim] - start_b[space_b_dim]))
HGOTO_DONE(FALSE)
/* Set the relative locations of the selections */
@@ -1914,8 +1920,8 @@ H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
/* Similarly, if the block size in any dimension that appears only
* in space_a is not equal to 1, get out.
*/
- while(space_a_dim >= 0) {
- if(start_a[space_a_dim] != end_a[space_a_dim])
+ while (space_a_dim >= 0) {
+ if (start_a[space_a_dim] != end_a[space_a_dim])
HGOTO_DONE(FALSE)
space_a_dim--;
@@ -1927,14 +1933,15 @@ H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
/* Check over the blocks for each selection */
else {
/* For dimensions that space_a and space_b have in common: */
- while(space_b_dim >= 0) {
+ while (space_b_dim >= 0) {
/* Check if the blocks are in the same relative location */
- if((hsize_t)((hssize_t)start_a[space_a_dim] + offset[space_a_dim]) != start_b[space_b_dim])
+ if ((hsize_t)((hssize_t)start_a[space_a_dim] + offset[space_a_dim]) !=
+ start_b[space_b_dim])
HGOTO_DONE(FALSE)
/* If the block sizes from each selection doesn't match, get out */
- if((end_a[space_a_dim] - start_a[space_a_dim]) !=
- (end_b[space_b_dim] - start_b[space_b_dim]))
+ if ((end_a[space_a_dim] - start_a[space_a_dim]) !=
+ (end_b[space_b_dim] - start_b[space_b_dim]))
HGOTO_DONE(FALSE)
space_a_dim--;
@@ -1942,53 +1949,54 @@ H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2)
} /* end while */
/* For dimensions that appear only in space_a: */
- while(space_a_dim >= 0) {
+ while (space_a_dim >= 0) {
/* If the block size isn't 1, get out */
- if(start_a[space_a_dim] != end_a[space_a_dim])
+ if (start_a[space_a_dim] != end_a[space_a_dim])
HGOTO_DONE(FALSE)
space_a_dim--;
} /* end while */
- } /* end else */
+ } /* end else */
/* Check if we are able to advance to the next selection block */
- if((status_a = H5S_SELECT_ITER_HAS_NEXT_BLOCK(iter_a)) < 0)
+ if ((status_a = H5S_SELECT_ITER_HAS_NEXT_BLOCK(iter_a)) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL, "unable to check iterator block a")
- if((status_b = H5S_SELECT_ITER_HAS_NEXT_BLOCK(iter_b)) < 0)
+ if ((status_b = H5S_SELECT_ITER_HAS_NEXT_BLOCK(iter_b)) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL, "unable to check iterator block b")
/* Did we run out of blocks at the same time? */
- if((status_a == FALSE) && (status_b == FALSE))
+ if ((status_a == FALSE) && (status_b == FALSE))
break;
- else if(status_a != status_b)
+ else if (status_a != status_b)
HGOTO_DONE(FALSE)
else {
/* Advance to next block in selection iterators */
- if(H5S_SELECT_ITER_NEXT_BLOCK(iter_a) < 0)
- HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL, "unable to advance to next iterator block a")
+ if (H5S_SELECT_ITER_NEXT_BLOCK(iter_a) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL,
+ "unable to advance to next iterator block a")
- if(H5S_SELECT_ITER_NEXT_BLOCK(iter_b) < 0)
- HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL, "unable to advance to next iterator block b")
+ if (H5S_SELECT_ITER_NEXT_BLOCK(iter_b) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL,
+ "unable to advance to next iterator block b")
} /* end else */
- } /* end while */
- } /* end else */
- } /* end if */
+ } /* end while */
+ } /* end else */
+ } /* end if */
done:
- if(iter_a_init && H5S_SELECT_ITER_RELEASE(iter_a) < 0)
+ if (iter_a_init && H5S_SELECT_ITER_RELEASE(iter_a) < 0)
HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator a")
- if(iter_a)
+ if (iter_a)
iter_a = H5FL_FREE(H5S_sel_iter_t, iter_a);
- if(iter_b_init && H5S_SELECT_ITER_RELEASE(iter_b) < 0)
+ if (iter_b_init && H5S_SELECT_ITER_RELEASE(iter_b) < 0)
HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator b")
- if(iter_b)
+ if (iter_b)
iter_b = H5FL_FREE(H5S_sel_iter_t, iter_b);
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_shape_same() */
-
/*--------------------------------------------------------------------------
NAME
H5Sselect_shape_same
@@ -2012,25 +2020,24 @@ done:
htri_t
H5Sselect_shape_same(hid_t space1_id, hid_t space2_id)
{
- H5S_t *space1, *space2; /* Dataspaces to compare */
- htri_t ret_value; /* Return value */
+ H5S_t *space1, *space2; /* Dataspaces to compare */
+ htri_t ret_value; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE2("t", "ii", space1_id, space2_id);
- if(NULL == (space1 = (H5S_t *)H5I_object_verify(space1_id, H5I_DATASPACE)))
+ if (NULL == (space1 = (H5S_t *)H5I_object_verify(space1_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace")
- if(NULL == (space2 = (H5S_t *)H5I_object_verify(space2_id, H5I_DATASPACE)))
+ if (NULL == (space2 = (H5S_t *)H5I_object_verify(space2_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace")
- if((ret_value = H5S_select_shape_same(space1, space2)) < 0)
+ if ((ret_value = H5S_select_shape_same(space1, space2)) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOMPARE, FAIL, "can't compare selections")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Sselect_shape_same() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_intersect_block
@@ -2055,10 +2062,9 @@ done:
don't call it directly, use the appropriate macro defined in H5Sprivate.h.
--------------------------------------------------------------------------*/
htri_t
-H5S_select_intersect_block(const H5S_t *space, const hsize_t *start,
- const hsize_t *end)
+H5S_select_intersect_block(H5S_t *space, const hsize_t *start, const hsize_t *end)
{
- htri_t ret_value = TRUE; /* Return value */
+ htri_t ret_value = TRUE; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
@@ -2068,31 +2074,30 @@ H5S_select_intersect_block(const H5S_t *space, const hsize_t *start,
HDassert(end);
/* If selections aren't "none", compare their bounds */
- if(H5S_SEL_NONE != H5S_GET_SELECT_TYPE(space)) {
- hsize_t low[H5S_MAX_RANK]; /* Low bound of selection in dataspace */
- hsize_t high[H5S_MAX_RANK]; /* High bound of selection in dataspace */
- unsigned u; /* Local index variable */
+ if (H5S_SEL_NONE != H5S_GET_SELECT_TYPE(space)) {
+ hsize_t low[H5S_MAX_RANK]; /* Low bound of selection in dataspace */
+ hsize_t high[H5S_MAX_RANK]; /* High bound of selection in dataspace */
+ unsigned u; /* Local index variable */
/* Get low & high bounds for dataspace selection */
- if(H5S_SELECT_BOUNDS(space, low, high) < 0)
+ if (H5S_SELECT_BOUNDS(space, low, high) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get selection bounds for dataspace")
/* Loop over selection bounds and block, checking for overlap */
- for(u = 0; u < space->extent.rank; u++)
+ for (u = 0; u < space->extent.rank; u++)
/* If selection bounds & block don't overlap, can leave now */
- if(!H5S_RANGE_OVERLAP(low[u], high[u], start[u], end[u]))
+ if (!H5S_RANGE_OVERLAP(low[u], high[u], start[u], end[u]))
HGOTO_DONE(FALSE)
} /* end if */
/* Call selection type's intersect routine */
- if((ret_value = (*space->select.type->intersect_block)(space, start, end)) < 0)
+ if ((ret_value = (*space->select.type->intersect_block)(space, start, end)) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOMPARE, FAIL, "can't intersect block with selection")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_intersect_block() */
-
/*--------------------------------------------------------------------------
NAME
H5Sselect_intersect_block
@@ -2118,35 +2123,35 @@ done:
htri_t
H5Sselect_intersect_block(hid_t space_id, const hsize_t *start, const hsize_t *end)
{
- H5S_t *space; /* Dataspace to query */
- unsigned u; /* Local index value */
- htri_t ret_value = FAIL; /* Return value */
+ H5S_t * space; /* Dataspace to query */
+ unsigned u; /* Local index value */
+ htri_t ret_value = FAIL; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE3("t", "i*h*h", space_id, start, end);
/* Check arguments */
- if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+ if (NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace")
- if(NULL == start)
+ if (NULL == start)
HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "block start array pointer is NULL")
- if(NULL == end)
+ if (NULL == end)
HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "block end array pointer is NULL")
/* Range check start & end values */
- for(u = 0; u < space->extent.rank; u++)
- if(start[u] > end[u])
- HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "block start[%u] (%llu) > end[%u] (%llu)", u, (unsigned long long)start[u], u, (unsigned long long)end[u])
+ for (u = 0; u < space->extent.rank; u++)
+ if (start[u] > end[u])
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADRANGE, FAIL, "block start[%u] (%llu) > end[%u] (%llu)", u,
+ (unsigned long long)start[u], u, (unsigned long long)end[u])
/* Call internal routine to do comparison */
- if((ret_value = H5S_select_intersect_block(space, start, end)) < 0)
+ if ((ret_value = H5S_select_intersect_block(space, start, end)) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOMPARE, FAIL, "can't compare selection and block")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Sselect_intersect_block() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_construct_projection
@@ -2177,15 +2182,15 @@ done:
adj_buf_ptr)
const H5S_t *base_space; IN: Ptr to Dataspace to project
H5S_t ** new_space_ptr; OUT: Ptr to location in which to return
- the address of the projected space
+ the address of the projected space
int new_space_rank; IN: Rank of the projected space.
const void * buf; IN: Base address of the buffer
- associated with the base space.
- May be NULL.
+ associated with the base space.
+ May be NULL.
void ** adj_buf_ptr; OUT: If buf != NULL, store the base
- address of the section of buf
- that is described by *new_space_ptr
- in *adj_buf_ptr.
+ address of the section of buf
+ that is described by *new_space_ptr
+ in *adj_buf_ptr.
RETURNS
Non-negative on success/Negative on failure.
@@ -2208,45 +2213,46 @@ done:
REVISION LOG
--------------------------------------------------------------------------*/
herr_t
-H5S_select_construct_projection(const H5S_t *base_space, H5S_t **new_space_ptr,
- unsigned new_space_rank, const void *buf, void const **adj_buf_ptr, hsize_t element_size)
+H5S_select_construct_projection(H5S_t *base_space, H5S_t **new_space_ptr, unsigned new_space_rank,
+ const void *buf, void const **adj_buf_ptr, hsize_t element_size)
{
- H5S_t * new_space = NULL; /* New dataspace constructed */
- hsize_t base_space_dims[H5S_MAX_RANK]; /* Current dimensions of base dataspace */
- hsize_t base_space_maxdims[H5S_MAX_RANK]; /* Maximum dimensions of base dataspace */
- int sbase_space_rank; /* Signed # of dimensions of base dataspace */
- unsigned base_space_rank; /* # of dimensions of base dataspace */
- hsize_t projected_space_element_offset = 0; /* Offset of selected element in projected buffer */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5S_t * new_space = NULL; /* New dataspace constructed */
+ hsize_t base_space_dims[H5S_MAX_RANK]; /* Current dimensions of base dataspace */
+ hsize_t base_space_maxdims[H5S_MAX_RANK]; /* Maximum dimensions of base dataspace */
+ int sbase_space_rank; /* Signed # of dimensions of base dataspace */
+ unsigned base_space_rank; /* # of dimensions of base dataspace */
+ hsize_t projected_space_element_offset = 0; /* Offset of selected element in projected buffer */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
/* Sanity checks */
HDassert(base_space != NULL);
- HDassert((H5S_GET_EXTENT_TYPE(base_space) == H5S_SCALAR) || (H5S_GET_EXTENT_TYPE(base_space) == H5S_SIMPLE));
+ HDassert((H5S_GET_EXTENT_TYPE(base_space) == H5S_SCALAR) ||
+ (H5S_GET_EXTENT_TYPE(base_space) == H5S_SIMPLE));
HDassert(new_space_ptr != NULL);
HDassert((new_space_rank != 0) || (H5S_GET_SELECT_NPOINTS(base_space) <= 1));
HDassert(new_space_rank <= H5S_MAX_RANK);
HDassert((buf == NULL) || (adj_buf_ptr != NULL));
- HDassert(element_size > 0 );
+ HDassert(element_size > 0);
/* Get the extent info for the base dataspace */
- if((sbase_space_rank = H5S_get_simple_extent_dims(base_space, base_space_dims, base_space_maxdims)) < 0)
+ if ((sbase_space_rank = H5S_get_simple_extent_dims(base_space, base_space_dims, base_space_maxdims)) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get dimensionality of base space")
base_space_rank = (unsigned)sbase_space_rank;
HDassert(base_space_rank != new_space_rank);
/* Check if projected space is scalar */
- if(new_space_rank == 0) {
- hssize_t npoints; /* Number of points selected */
+ if (new_space_rank == 0) {
+ hssize_t npoints; /* Number of points selected */
- /* Retreve the number of elements selected */
- if((npoints = (hssize_t)H5S_GET_SELECT_NPOINTS(base_space)) < 0)
+ /* Retrieve the number of elements selected */
+ if ((npoints = (hssize_t)H5S_GET_SELECT_NPOINTS(base_space)) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "unable to get number of points selected")
HDassert(npoints <= 1);
/* Create new scalar dataspace */
- if(NULL == (new_space = H5S_create(H5S_SCALAR)))
+ if (NULL == (new_space = H5S_create(H5S_SCALAR)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "unable to create scalar dataspace")
/* No need to register the dataspace(i.e. get an ID) as
@@ -2262,7 +2268,7 @@ H5S_select_construct_projection(const H5S_t *base_space, H5S_t **new_space_ptr,
* same shape as the file dataspace, and that data
* space is scalar.
*/
- if(1 == npoints) {
+ if (1 == npoints) {
/* Assuming that the selection in the base dataspace is not
* empty, we must compute the offset of the selected item in
* the buffer associated with the base dataspace.
@@ -2273,20 +2279,20 @@ H5S_select_construct_projection(const H5S_t *base_space, H5S_t **new_space_ptr,
* selection, may be either point, hyperspace, or all.
*
*/
- if(H5S_SELECT_PROJECT_SCALAR(base_space, &projected_space_element_offset) < 0)
+ if (H5S_SELECT_PROJECT_SCALAR(base_space, &projected_space_element_offset) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, FAIL, "unable to project scalar selection")
} /* end if */
else {
HDassert(0 == npoints);
- if(H5S_select_none(new_space) < 0)
- HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't delete default selection")
- } /* end else */
- } /* end if */
- else { /* projected space must be simple */
- hsize_t new_space_dims[H5S_MAX_RANK]; /* Current dimensions for new dataspace */
- hsize_t new_space_maxdims[H5S_MAX_RANK];/* Maximum dimensions for new dataspace */
- unsigned rank_diff; /* Difference in ranks */
+ if (H5S_select_none(new_space) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't delete default selection")
+ } /* end else */
+ } /* end if */
+ else { /* projected space must be simple */
+ hsize_t new_space_dims[H5S_MAX_RANK]; /* Current dimensions for new dataspace */
+ hsize_t new_space_maxdims[H5S_MAX_RANK]; /* Maximum dimensions for new dataspace */
+ unsigned rank_diff; /* Difference in ranks */
/* Set up the dimensions of the new, projected dataspace.
*
@@ -2309,15 +2315,15 @@ H5S_select_construct_projection(const H5S_t *base_space, H5S_t **new_space_ptr,
* true on selections of different rank iff:
*
* 1) the selection in the lower rank dataspace matches that
- * in the dimensions with the fastest changing indicies in
+ * in the dimensions with the fastest changing indices in
* the larger rank dataspace, and
*
* 2) the selection has thickness 1 in all ranks that appear
* only in the higher rank dataspace (i.e. those with
- * more slowly changing indicies).
+ * more slowly changing indices).
*/
- if(new_space_rank > base_space_rank) {
- hsize_t tmp_dim_size = 1; /* Temporary dimension value, for filling arrays */
+ if (new_space_rank > base_space_rank) {
+ hsize_t tmp_dim_size = 1; /* Temporary dimension value, for filling arrays */
/* we must copy the dimensions of the base space into
* the fastest changing dimensions of the new space,
@@ -2326,22 +2332,26 @@ H5S_select_construct_projection(const H5S_t *base_space, H5S_t **new_space_ptr,
rank_diff = new_space_rank - base_space_rank;
H5VM_array_fill(new_space_dims, &tmp_dim_size, sizeof(tmp_dim_size), rank_diff);
H5VM_array_fill(new_space_maxdims, &tmp_dim_size, sizeof(tmp_dim_size), rank_diff);
- H5MM_memcpy(&new_space_dims[rank_diff], base_space_dims, sizeof(new_space_dims[0]) * base_space_rank);
- H5MM_memcpy(&new_space_maxdims[rank_diff], base_space_maxdims, sizeof(new_space_maxdims[0]) * base_space_rank);
- } /* end if */
+ H5MM_memcpy(&new_space_dims[rank_diff], base_space_dims,
+ sizeof(new_space_dims[0]) * base_space_rank);
+ H5MM_memcpy(&new_space_maxdims[rank_diff], base_space_maxdims,
+ sizeof(new_space_maxdims[0]) * base_space_rank);
+ } /* end if */
else { /* new_space_rank < base_space_rank */
/* we must copy the fastest changing dimension of the
* base space into the dimensions of the new space.
*/
rank_diff = base_space_rank - new_space_rank;
- H5MM_memcpy(new_space_dims, &base_space_dims[rank_diff], sizeof(new_space_dims[0]) * new_space_rank);
- H5MM_memcpy(new_space_maxdims, &base_space_maxdims[rank_diff], sizeof(new_space_maxdims[0]) * new_space_rank);
+ H5MM_memcpy(new_space_dims, &base_space_dims[rank_diff],
+ sizeof(new_space_dims[0]) * new_space_rank);
+ H5MM_memcpy(new_space_maxdims, &base_space_maxdims[rank_diff],
+ sizeof(new_space_maxdims[0]) * new_space_rank);
} /* end else */
/* now have the new space rank and dimensions set up --
* so we can create the new simple dataspace.
*/
- if(NULL == (new_space = H5S_create_simple(new_space_rank, new_space_dims, new_space_maxdims)))
+ if (NULL == (new_space = H5S_create_simple(new_space_rank, new_space_dims, new_space_maxdims)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "can't create simple dataspace")
/* No need to register the dataspace(i.e. get an ID) as
@@ -2352,7 +2362,7 @@ H5S_select_construct_projection(const H5S_t *base_space, H5S_t **new_space_ptr,
* dataspace. We must now project the selection in the base
* dataspace into the projected dataspace.
*/
- if(H5S_SELECT_PROJECT_SIMPLE(base_space, new_space, &projected_space_element_offset) < 0)
+ if (H5S_SELECT_PROJECT_SIMPLE(base_space, new_space, &projected_space_element_offset) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, FAIL, "unable to project simple selection")
/* If we get this far, we have created the new dataspace, and projected
@@ -2363,18 +2373,20 @@ H5S_select_construct_projection(const H5S_t *base_space, H5S_t **new_space_ptr,
* project the offset into the new dataspace and set the
* offset_changed flag.
*/
- if(H5S_GET_EXTENT_TYPE(base_space) == H5S_SIMPLE && base_space->select.offset_changed) {
- if(new_space_rank > base_space_rank) {
+ if (H5S_GET_EXTENT_TYPE(base_space) == H5S_SIMPLE && base_space->select.offset_changed) {
+ if (new_space_rank > base_space_rank) {
HDmemset(new_space->select.offset, 0, sizeof(new_space->select.offset[0]) * rank_diff);
- H5MM_memcpy(&new_space->select.offset[rank_diff], base_space->select.offset, sizeof(new_space->select.offset[0]) * base_space_rank);
+ H5MM_memcpy(&new_space->select.offset[rank_diff], base_space->select.offset,
+ sizeof(new_space->select.offset[0]) * base_space_rank);
} /* end if */
else
- H5MM_memcpy(new_space->select.offset, &base_space->select.offset[rank_diff], sizeof(new_space->select.offset[0]) * new_space_rank);
+ H5MM_memcpy(new_space->select.offset, &base_space->select.offset[rank_diff],
+ sizeof(new_space->select.offset[0]) * new_space_rank);
/* Propagate the offset changed flag into the new dataspace. */
new_space->select.offset_changed = TRUE;
} /* end if */
- } /* end else */
+ } /* end else */
/* If we have done the projection correctly, the following assertion
* should hold.
@@ -2385,8 +2397,8 @@ H5S_select_construct_projection(const H5S_t *base_space, H5S_t **new_space_ptr,
*new_space_ptr = new_space;
/* now adjust the buffer if required */
- if(buf != NULL) {
- if(new_space_rank < base_space_rank) {
+ if (buf != NULL) {
+ if (new_space_rank < base_space_rank) {
/* a bit of pointer magic here:
*
* Since we can't do pointer arithmetic on void pointers, we first
@@ -2398,7 +2410,7 @@ H5S_select_construct_projection(const H5S_t *base_space, H5S_t **new_space_ptr,
* to a pointer to void, and assign the result to *adj_buf_ptr.
*/
*adj_buf_ptr = (const void *)(((const uint8_t *)buf) +
- ((size_t)(projected_space_element_offset * element_size)));
+ ((size_t)(projected_space_element_offset * element_size)));
} /* end if */
else
/* No adjustment necessary */
@@ -2407,14 +2419,13 @@ H5S_select_construct_projection(const H5S_t *base_space, H5S_t **new_space_ptr,
done:
/* Cleanup on error */
- if(ret_value < 0)
- if(new_space && H5S_close(new_space) < 0)
+ if (ret_value < 0)
+ if (new_space && H5S_close(new_space) < 0)
HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release dataspace")
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_construct_projection() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_fill
@@ -2440,15 +2451,15 @@ done:
REVISION LOG
--------------------------------------------------------------------------*/
herr_t
-H5S_select_fill(const void *fill, size_t fill_size, const H5S_t *space, void *_buf)
+H5S_select_fill(const void *fill, size_t fill_size, H5S_t *space, void *_buf)
{
- H5S_sel_iter_t *iter = NULL; /* Selection iteration info */
- hbool_t iter_init = FALSE; /* Selection iteration info has been initialized */
- hsize_t *off = NULL; /* Array to store sequence offsets */
- size_t *len = NULL; /* Array to store sequence lengths */
- hssize_t nelmts; /* Number of elements in selection */
- size_t max_elem; /* Total number of elements in selection */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5S_sel_iter_t *iter = NULL; /* Selection iteration info */
+ hbool_t iter_init = FALSE; /* Selection iteration info has been initialized */
+ hsize_t * off = NULL; /* Array to store sequence offsets */
+ size_t * len = NULL; /* Array to store sequence lengths */
+ hssize_t nelmts; /* Number of elements in selection */
+ size_t max_elem; /* Total number of elements in selection */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
@@ -2459,40 +2470,41 @@ H5S_select_fill(const void *fill, size_t fill_size, const H5S_t *space, void *_b
HDassert(_buf);
/* Allocate the selection iterator */
- if(NULL == (iter = H5FL_MALLOC(H5S_sel_iter_t)))
+ if (NULL == (iter = H5FL_MALLOC(H5S_sel_iter_t)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate selection iterator")
/* Initialize iterator */
- if(H5S_select_iter_init(iter, space, fill_size, 0) < 0)
+ if (H5S_select_iter_init(iter, space, fill_size, 0) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize selection iterator")
- iter_init = TRUE; /* Selection iteration info has been initialized */
+ iter_init = TRUE; /* Selection iteration info has been initialized */
/* Get the number of elements in selection */
- if((nelmts = (hssize_t)H5S_GET_SELECT_NPOINTS(space)) < 0)
+ if ((nelmts = (hssize_t)H5S_GET_SELECT_NPOINTS(space)) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOUNT, FAIL, "can't get number of elements selected")
/* Compute the number of bytes to process */
H5_CHECKED_ASSIGN(max_elem, size_t, nelmts, hssize_t);
/* Allocate the offset & length arrays */
- if(NULL == (len = H5FL_SEQ_MALLOC(size_t, H5D_IO_VECTOR_SIZE)))
+ if (NULL == (len = H5FL_SEQ_MALLOC(size_t, H5D_IO_VECTOR_SIZE)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate length vector array")
- if(NULL == (off = H5FL_SEQ_MALLOC(hsize_t, H5D_IO_VECTOR_SIZE)))
+ if (NULL == (off = H5FL_SEQ_MALLOC(hsize_t, H5D_IO_VECTOR_SIZE)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate offset vector array")
/* Loop, while elements left in selection */
- while(max_elem > 0) {
- size_t nseq; /* Number of sequences generated */
- size_t curr_seq; /* Current sequnce being worked on */
- size_t nelem; /* Number of elements used in sequences */
+ while (max_elem > 0) {
+ size_t nseq; /* Number of sequences generated */
+ size_t curr_seq; /* Current sequnce being worked on */
+ size_t nelem; /* Number of elements used in sequences */
/* Get the sequences of bytes */
- if(H5S_SELECT_ITER_GET_SEQ_LIST(iter, (size_t)H5D_IO_VECTOR_SIZE, max_elem, &nseq, &nelem, off, len) < 0)
+ if (H5S_SELECT_ITER_GET_SEQ_LIST(iter, (size_t)H5D_IO_VECTOR_SIZE, max_elem, &nseq, &nelem, off,
+ len) < 0)
HGOTO_ERROR(H5E_INTERNAL, H5E_UNSUPPORTED, FAIL, "sequence length generation failed")
/* Loop over sequences */
- for(curr_seq = 0; curr_seq < nseq; curr_seq++) {
- uint8_t *buf; /* Current location in buffer */
+ for (curr_seq = 0; curr_seq < nseq; curr_seq++) {
+ uint8_t *buf; /* Current location in buffer */
/* Get offset in memory buffer */
buf = (uint8_t *)_buf + off[curr_seq];
@@ -2508,21 +2520,20 @@ H5S_select_fill(const void *fill, size_t fill_size, const H5S_t *space, void *_b
done:
/* Release resources, if allocated */
- if(len)
+ if (len)
len = H5FL_SEQ_FREE(size_t, len);
- if(off)
+ if (off)
off = H5FL_SEQ_FREE(hsize_t, off);
/* Release selection iterator */
- if(iter_init && H5S_SELECT_ITER_RELEASE(iter) < 0)
+ if (iter_init && H5S_SELECT_ITER_RELEASE(iter) < 0)
HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release selection iterator")
- if(iter)
+ if (iter)
iter = H5FL_FREE(H5S_sel_iter_t, iter);
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_fill() */
-
/*--------------------------------------------------------------------------
NAME
H5S_select_project_intersection
@@ -2533,11 +2544,13 @@ done:
within the selection of dst_space
USAGE
- herr_t H5S_select_project_intersection(src_space,dst_space,src_intersect_space,proj_space)
- H5S_t *src_space; IN: Selection that is mapped to dst_space, and intersected with src_intersect_space
- H5S_t *dst_space; IN: Selection that is mapped to src_space, and which contains the result
- H5S_t *src_intersect_space; IN: Selection whose intersection with src_space is projected to dst_space to obtain the result
- H5S_t **new_space_ptr; OUT: Will contain the result (intersection of src_intersect_space and src_space projected from src_space to dst_space) after the operation
+ herr_t H5S_select_project_intersection(src_space,dst_space,src_intersect_space,proj_space,share_selection)
+ H5S_t *src_space; IN: Selection that is mapped to dst_space, and intersected with
+src_intersect_space H5S_t *dst_space; IN: Selection that is mapped to src_space H5S_t
+*src_intersect_space; IN: Selection whose intersection with src_space is projected to dst_space to obtain the
+result H5S_t **new_space_ptr; OUT: Will contain the result (intersection of src_intersect_space and src_space
+projected from src_space to dst_space) after the operation hbool_t share_selection; IN: Whether we are allowed
+to share structures inside dst_space with proj_space
RETURNS
Non-negative on success/Negative on failure.
@@ -2554,11 +2567,16 @@ done:
REVISION LOG
--------------------------------------------------------------------------*/
herr_t
-H5S_select_project_intersection(const H5S_t *src_space, const H5S_t *dst_space,
- const H5S_t *src_intersect_space, H5S_t **new_space_ptr)
+H5S_select_project_intersection(H5S_t *src_space, H5S_t *dst_space, H5S_t *src_intersect_space,
+ H5S_t **new_space_ptr, hbool_t share_selection)
{
- H5S_t *new_space = NULL; /* New dataspace constructed */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5S_t * new_space = NULL; /* New dataspace constructed */
+ H5S_t * tmp_src_intersect_space = NULL; /* Temporary SIS converted from points->hyperslabs */
+ H5S_sel_iter_t *ss_iter = NULL; /* Selection iterator for src_space */
+ hbool_t ss_iter_init = FALSE; /* Whether ss_iter has been initialized */
+ H5S_sel_iter_t *ds_iter = NULL; /* Selection iterator for dst_space */
+ hbool_t ds_iter_init = FALSE; /* Whether ds_iter has been initialized */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
@@ -2567,58 +2585,282 @@ H5S_select_project_intersection(const H5S_t *src_space, const H5S_t *dst_space,
HDassert(dst_space);
HDassert(src_intersect_space);
HDassert(new_space_ptr);
+ HDassert(H5S_GET_SELECT_NPOINTS(src_space) == H5S_GET_SELECT_NPOINTS(dst_space));
+ HDassert(H5S_GET_EXTENT_NDIMS(src_space) == H5S_GET_EXTENT_NDIMS(src_intersect_space));
+
+ if (NULL == (ss_iter = H5FL_CALLOC(H5S_sel_iter_t)))
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate selection iterator")
+ if (NULL == (ds_iter = H5FL_CALLOC(H5S_sel_iter_t)))
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, FAIL, "can't allocate selection iterator")
/* Create new space, using dst extent. Start with "all" selection. */
- if(NULL == (new_space = H5S_create(H5S_SIMPLE)))
+ if (NULL == (new_space = H5S_create(H5S_SIMPLE)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "unable to create output dataspace")
- if(H5S__extent_copy_real(&new_space->extent, &dst_space->extent, TRUE) < 0)
+ if (H5S__extent_copy_real(&new_space->extent, &dst_space->extent, TRUE) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "unable to copy destination space extent")
/* If the intersecting space is "all", the intersection must be equal to the
* source space and the projection must be equal to the destination space */
- if(src_intersect_space->select.type->type == H5S_SEL_ALL) {
+ if (H5S_GET_SELECT_TYPE(src_intersect_space) == H5S_SEL_ALL) {
/* Copy the destination selection. */
- if(H5S_select_copy(new_space, dst_space, FALSE) < 0)
+ if (H5S_select_copy(new_space, dst_space, FALSE) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL, "can't copy destination space selection")
} /* end if */
/* If any of the selections contain no elements, the projection must be
* "none" */
- else if((H5S_GET_SELECT_NPOINTS(src_intersect_space) == 0)
- || (H5S_GET_SELECT_NPOINTS(src_space) == 0)
- || (H5S_GET_SELECT_NPOINTS(dst_space) == 0)) {
+ else if ((H5S_GET_SELECT_NPOINTS(src_intersect_space) == 0) || (H5S_GET_SELECT_NPOINTS(src_space) == 0) ||
+ (H5S_GET_SELECT_NPOINTS(dst_space) == 0)) {
/* Change to "none" selection */
- if(H5S_select_none(new_space) < 0)
+ if (H5S_select_none(new_space) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
} /* end if */
- /* If any of the spaces use point selection, fall back to general algorithm */
- else if((src_intersect_space->select.type->type == H5S_SEL_POINTS)
- || (src_space->select.type->type == H5S_SEL_POINTS)
- || (dst_space->select.type->type == H5S_SEL_POINTS))
- HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "point selections not currently supported")
else {
- HDassert(src_intersect_space->select.type->type == H5S_SEL_HYPERSLABS);
- HDassert(src_space->select.type->type != H5S_SEL_NONE);
- HDassert(dst_space->select.type->type != H5S_SEL_NONE);
-
- /* Intersecting space is hyperslab selection. Call the hyperslab
- * routine to project to another hyperslab selection. */
- if(H5S__hyper_project_intersection(src_space, dst_space, src_intersect_space, new_space) < 0)
- HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "can't project hyperslab ondot destination selection")
- } /* end else */
+ /* Handle scalar dataspaces. It should not be possible for the source
+ * intersect space or the source space to be scalar since scalar spaces
+ * only support all or none selections, and both of those cases are
+ * covered above, and the source intersect space must have the same
+ * rank, so it also cannot be scalar, as scalar dataspaces have a rank
+ * of 0. */
+ HDassert(H5S_GET_EXTENT_TYPE(src_space) != H5S_SCALAR);
+ HDassert(H5S_GET_EXTENT_TYPE(src_intersect_space) != H5S_SCALAR);
+
+ /* Check for scalar dst_space. In this case we simply check if the
+ * (single) point selected in src_space intersects src_intersect_space,
+ * if so select all in new_space, otherwise select none. */
+ if (H5S_GET_EXTENT_TYPE(dst_space) == H5S_SCALAR) {
+ hsize_t coords_start[H5S_MAX_RANK];
+ hsize_t coords_end[H5S_MAX_RANK];
+ htri_t intersect;
+
+ /* Get source space bounds. Should be a single point. */
+ if (H5S_SELECT_BOUNDS(src_space, coords_start, coords_end) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "can't get source space bounds")
+ HDassert(0 == HDmemcmp(coords_start, coords_end,
+ H5S_GET_EXTENT_NDIMS(src_space) * sizeof(coords_start[0])));
+
+ /* Check for intersection */
+ if ((intersect = H5S_SELECT_INTERSECT_BLOCK(src_intersect_space, coords_start, coords_end)) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOMPARE, FAIL, "can't check for intersection")
+
+ /* Select all or none as appropriate */
+ if (intersect) {
+ if (H5S_select_all(new_space, TRUE) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSET, FAIL, "can't select all")
+ } /* end if */
+ else if (H5S_select_none(new_space) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+ } /* end if */
+ else {
+ /* If the source intersect space is a point selection, convert it to a
+ * hyperslab (discarding ordering). We can get away with this because
+ * the order does not matter for the source intersect space */
+ /* Maybe we should just leave it as a point selection for the point by
+ * point algorithm? The search through the selection in
+ * H5S_SELECT_INTERSECT_BLOCK will likely be O(N) either way. -NAF */
+ if (H5S_GET_SELECT_TYPE(src_intersect_space) == H5S_SEL_POINTS) {
+ H5S_pnt_node_t *curr_pnt = src_intersect_space->select.sel_info.pnt_lst->head;
+
+ /* Create dataspace and copy extent */
+ if (NULL == (tmp_src_intersect_space = H5S_create(H5S_SIMPLE)))
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL,
+ "unable to create temporary source intersect dataspace")
+ if (H5S__extent_copy_real(&tmp_src_intersect_space->extent, &src_intersect_space->extent,
+ FALSE) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOPY, FAIL,
+ "unable to copy source intersect space extent")
+
+ /* Iterate over points */
+ for (curr_pnt = src_intersect_space->select.sel_info.pnt_lst->head; curr_pnt;
+ curr_pnt = curr_pnt->next)
+ /* Add point to hyperslab selection */
+ if (H5S_hyper_add_span_element(tmp_src_intersect_space, src_intersect_space->extent.rank,
+ curr_pnt->pnt) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL,
+ "can't add point to temporary dataspace selection")
+
+ /* Redirect local src_intersect_space pointer (will not affect
+ * calling function) */
+ src_intersect_space = tmp_src_intersect_space;
+ } /* end for */
+
+ /* By this point, src_intersect_space must be a hyperslab selection */
+ HDassert(H5S_GET_SELECT_TYPE(src_intersect_space) == H5S_SEL_HYPERSLABS);
+
+ /* If either the source space or the destination space is a point
+ * selection, iterate element by element */
+ if ((H5S_GET_SELECT_TYPE(src_space) == H5S_SEL_POINTS) ||
+ (H5S_GET_SELECT_TYPE(dst_space) == H5S_SEL_POINTS)) {
+ hsize_t coords[H5S_MAX_RANK];
+ htri_t intersect;
+
+ /* Start with "none" selection */
+ if (H5S_select_none(new_space) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
+
+ /* Initialize iterators */
+ if (H5S_select_iter_init(ss_iter, src_space, 1, H5S_SEL_ITER_SHARE_WITH_DATASPACE) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL,
+ "can't initialize source space selection iterator")
+ ss_iter_init = TRUE;
+ if (H5S_select_iter_init(ds_iter, dst_space, 1, H5S_SEL_ITER_SHARE_WITH_DATASPACE) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL,
+ "can't initialize destination space selection iterator")
+ ds_iter_init = TRUE;
+
+ /* Iterate over points */
+ do {
+ HDassert(ss_iter->elmt_left > 0);
+ HDassert(ss_iter->elmt_left > 0);
+
+ /* Get SS coords */
+ if (H5S_SELECT_ITER_COORDS(ss_iter, coords) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL,
+ "can't get source selection coordinates")
+
+ /* Check for intersection */
+ if ((intersect = H5S_SELECT_INTERSECT_BLOCK(src_intersect_space, coords, coords)) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCOMPARE, FAIL, "can't check for intersection")
+
+ /* Add point if it intersects */
+ if (intersect) {
+ /* Get DS coords */
+ if (H5S_SELECT_ITER_COORDS(ds_iter, coords) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL,
+ "can't get destination selection coordinates")
+
+ /* Add point to new_space */
+ if (H5S_select_elements(new_space, H5S_SELECT_APPEND, 1, coords) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL,
+ "can't add point to new selection")
+ } /* end if */
+
+ /* Advance iterators */
+ if (H5S_SELECT_ITER_NEXT(ss_iter, 1) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL,
+ "can't advacne source selection iterator")
+ ss_iter->elmt_left--;
+ if (H5S_SELECT_ITER_NEXT(ds_iter, 1) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTNEXT, FAIL,
+ "can't advacne destination selection iterator")
+ ds_iter->elmt_left--;
+ } while (ss_iter->elmt_left > 0);
+ HDassert(H5S_SELECT_ITER_NELMTS(ds_iter) == 0);
+ } /* end if */
+ else {
+ HDassert(H5S_GET_SELECT_TYPE(src_space) != H5S_SEL_NONE);
+ HDassert(H5S_GET_SELECT_TYPE(dst_space) != H5S_SEL_NONE);
+
+ /* Source and destination selections are all or hyperslab,
+ * intersecting selection is hyperslab. Call the hyperslab routine
+ * to project to another hyperslab selection. */
+ if (H5S__hyper_project_intersection(src_space, dst_space, src_intersect_space, new_space,
+ share_selection) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL,
+ "can't project hyperslab onto destination selection")
+ } /* end else */
+ } /* end else */
+ } /* end else */
/* load the address of the new space into *new_space_ptr */
*new_space_ptr = new_space;
done:
/* Cleanup on error */
- if(ret_value < 0)
- if(new_space && H5S_close(new_space) < 0)
+ if (ret_value < 0)
+ if (new_space && H5S_close(new_space) < 0)
HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release dataspace")
+ /* General cleanup */
+ if (tmp_src_intersect_space && H5S_close(tmp_src_intersect_space) < 0)
+ HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release temporary dataspace")
+ if (ss_iter_init && H5S_SELECT_ITER_RELEASE(ss_iter) < 0)
+ HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release source selection iterator")
+ if (ds_iter_init && H5S_SELECT_ITER_RELEASE(ds_iter) < 0)
+ HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release destination selection iterator")
+
+ ss_iter = H5FL_FREE(H5S_sel_iter_t, ss_iter);
+ ds_iter = H5FL_FREE(H5S_sel_iter_t, ds_iter);
+
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_project_intersection() */
-
+/*--------------------------------------------------------------------------
+ NAME
+ H5Sselect_project_intersection
+
+ PURPOSE
+ Projects the intersection of of the selections of src_space_id and
+ src_intersect_space_id within the selection of src_space_id as a
+ selection within the selection of dst_space_id.
+
+ USAGE
+ hid_t H5Sselect_project_intersection(src_space_id,dst_space_d,src_intersect_space_id)
+ hid_t src_space_id; IN: Selection that is mapped to dst_space_id, and intersected with
+src_intersect_space_id hid_t dst_space_id; IN: Selection that is mapped to src_space_id hid_t
+src_intersect_space_id; IN: Selection whose intersection with src_space_id is projected to dst_space_id to
+obtain the result
+
+ RETURNS
+ A dataspace with a selection equal to the intersection of
+ src_intersect_space_id and src_space_id projected from src_space to
+ dst_space on success, negative on failure.
+
+ DESCRIPTION
+ Projects the intersection of of the selections of src_space and
+ src_intersect_space within the selection of src_space as a selection
+ within the selection of dst_space. The result is placed in the
+ selection of new_space_ptr.
+
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+hid_t
+H5Sselect_project_intersection(hid_t src_space_id, hid_t dst_space_id, hid_t src_intersect_space_id)
+{
+ H5S_t *src_space, *dst_space, *src_intersect_space; /* Input dataspaces */
+ H5S_t *proj_space = NULL; /* Output dataspace */
+ hid_t ret_value; /* Return value */
+
+ FUNC_ENTER_API(FAIL)
+ H5TRACE3("i", "iii", src_space_id, dst_space_id, src_intersect_space_id);
+
+ /* Check args */
+ if (NULL == (src_space = (H5S_t *)H5I_object_verify(src_space_id, H5I_DATASPACE)))
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace")
+ if (NULL == (dst_space = (H5S_t *)H5I_object_verify(dst_space_id, H5I_DATASPACE)))
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace")
+ if (NULL == (src_intersect_space = (H5S_t *)H5I_object_verify(src_intersect_space_id, H5I_DATASPACE)))
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace")
+
+ /* Check numbers of points selected matches in source and destination */
+ if (H5S_GET_SELECT_NPOINTS(src_space) != H5S_GET_SELECT_NPOINTS(dst_space))
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL,
+ "number of points selected in source space does not match that in destination space")
+
+ /* Check numbers of dimensions matches in source and source intersect spaces
+ */
+ if (H5S_GET_EXTENT_NDIMS(src_space) != H5S_GET_EXTENT_NDIMS(src_intersect_space))
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL,
+ "rank of source space does not match rank of source intersect space")
+
+ /* Perform operation */
+ if (H5S_select_project_intersection(src_space, dst_space, src_intersect_space, &proj_space, FALSE) < 0)
+ HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "can't project dataspace intersection")
+
+ /* Register */
+ if ((ret_value = H5I_register(H5I_DATASPACE, proj_space, TRUE)) < 0)
+ HGOTO_ERROR(H5E_ID, H5E_CANTREGISTER, FAIL, "unable to register dataspace ID")
+
+done:
+ if (ret_value < 0)
+ if (proj_space && H5S_close(proj_space) < 0)
+ HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release dataspace")
+
+ FUNC_LEAVE_API(ret_value)
+} /* end H5Sselect_project_intersection() */
+
/*--------------------------------------------------------------------------
NAME
H5S_select_subtract
@@ -2647,7 +2889,7 @@ done:
herr_t
H5S_select_subtract(H5S_t *space, H5S_t *subtract_space)
{
- herr_t ret_value = SUCCEED; /* Return value */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
@@ -2657,40 +2899,40 @@ H5S_select_subtract(H5S_t *space, H5S_t *subtract_space)
/* If either space is using the none selection, then we do not need to do
* anything */
- if((space->select.type->type != H5S_SEL_NONE)
- && (subtract_space->select.type->type != H5S_SEL_NONE)) {
+ if ((space->select.type->type != H5S_SEL_NONE) && (subtract_space->select.type->type != H5S_SEL_NONE)) {
/* If subtract_space is using the all selection, set space to none */
- if(subtract_space->select.type->type == H5S_SEL_ALL) {
+ if (subtract_space->select.type->type == H5S_SEL_ALL) {
/* Change to "none" selection */
- if(H5S_select_none(space) < 0)
+ if (H5S_select_none(space) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDELETE, FAIL, "can't change selection")
} /* end if */
/* If either selection is a point selection, fail currently */
- else if((subtract_space->select.type->type == H5S_SEL_POINTS) ||
- (space->select.type->type == H5S_SEL_POINTS)) {
+ else if ((subtract_space->select.type->type == H5S_SEL_POINTS) ||
+ (space->select.type->type == H5S_SEL_POINTS)) {
HGOTO_ERROR(H5E_DATASPACE, H5E_UNSUPPORTED, FAIL, "point selections not currently supported")
} /* end if */
else {
/* Check for all selection in space, convert to hyperslab */
- if(space->select.type->type == H5S_SEL_ALL) {
+ if (space->select.type->type == H5S_SEL_ALL) {
/* Convert current "all" selection to "real" hyperslab selection */
/* Then allow operation to proceed */
- hsize_t tmp_start[H5S_MAX_RANK]; /* Temporary start information */
- hsize_t tmp_stride[H5S_MAX_RANK]; /* Temporary stride information */
- hsize_t tmp_count[H5S_MAX_RANK]; /* Temporary count information */
- hsize_t tmp_block[H5S_MAX_RANK]; /* Temporary block information */
- unsigned u; /* Local index variable */
+ hsize_t tmp_start[H5S_MAX_RANK]; /* Temporary start information */
+ hsize_t tmp_stride[H5S_MAX_RANK]; /* Temporary stride information */
+ hsize_t tmp_count[H5S_MAX_RANK]; /* Temporary count information */
+ hsize_t tmp_block[H5S_MAX_RANK]; /* Temporary block information */
+ unsigned u; /* Local index variable */
/* Fill in temporary information for the dimensions */
- for(u = 0; u < space->extent.rank; u++) {
- tmp_start[u] = 0;
+ for (u = 0; u < space->extent.rank; u++) {
+ tmp_start[u] = 0;
tmp_stride[u] = 1;
- tmp_count[u] = 1;
- tmp_block[u] = space->extent.size[u];
+ tmp_count[u] = 1;
+ tmp_block[u] = space->extent.size[u];
} /* end for */
/* Convert to hyperslab selection */
- if(H5S_select_hyperslab(space, H5S_SELECT_SET, tmp_start, tmp_stride, tmp_count, tmp_block) < 0)
+ if (H5S_select_hyperslab(space, H5S_SELECT_SET, tmp_start, tmp_stride, tmp_count, tmp_block) <
+ 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTSELECT, FAIL, "can't convert selection")
} /* end if */
@@ -2698,16 +2940,15 @@ H5S_select_subtract(H5S_t *space, H5S_t *subtract_space)
HDassert(subtract_space->select.type->type == H5S_SEL_HYPERSLABS);
/* Both spaces are now hyperslabs, perform the operation */
- if(H5S__modify_select(space, H5S_SELECT_NOTB, subtract_space) < 0)
+ if (H5S__modify_select(space, H5S_SELECT_NOTB, subtract_space) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCLIP, FAIL, "can't subtract hyperslab")
} /* end else */
- } /* end if */
+ } /* end if */
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_select_subtract() */
-
/*--------------------------------------------------------------------------
NAME
H5Ssel_iter_create
@@ -2731,41 +2972,41 @@ done:
hid_t
H5Ssel_iter_create(hid_t space_id, size_t elmt_size, unsigned flags)
{
- H5S_t *space; /* Dataspace with selection to iterate over */
- H5S_sel_iter_t *sel_iter; /* Selection iterator created */
- hid_t ret_value; /* Return value */
+ H5S_t * space; /* Dataspace with selection to iterate over */
+ H5S_sel_iter_t *sel_iter; /* Selection iterator created */
+ hid_t ret_value; /* Return value */
FUNC_ENTER_API(H5I_INVALID_HID)
H5TRACE3("i", "izIu", space_id, elmt_size, flags);
/* Check args */
- if(NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+ if (NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, H5I_INVALID_HID, "not a dataspace")
- if(elmt_size == 0)
+ if (elmt_size == 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, H5I_INVALID_HID, "element size must be greater than 0")
- if(flags != (flags & H5S_SEL_ITER_ALL_PUBLIC_FLAGS))
+ if (flags != (flags & H5S_SEL_ITER_ALL_PUBLIC_FLAGS))
HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, H5I_INVALID_HID, "invalid selection iterator flag")
/* Allocate the iterator */
- if(NULL == (sel_iter = H5FL_MALLOC(H5S_sel_iter_t)))
+ if (NULL == (sel_iter = H5FL_MALLOC(H5S_sel_iter_t)))
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTALLOC, H5I_INVALID_HID, "can't allocate selection iterator")
/* Add flag to indicate that this iterator is from an API call */
flags |= H5S_SEL_ITER_API_CALL;
/* Initialize the selection iterator */
- if(H5S_select_iter_init(sel_iter, space, elmt_size, flags) < 0)
+ if (H5S_select_iter_init(sel_iter, space, elmt_size, flags) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, H5I_INVALID_HID, "unable to initialize selection iterator")
- /* Atomize */
- if((ret_value = H5I_register(H5I_SPACE_SEL_ITER, sel_iter, TRUE)) < 0)
- HGOTO_ERROR(H5E_DATASPACE, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register dataspace selection iterator atom")
+ /* Register */
+ if ((ret_value = H5I_register(H5I_SPACE_SEL_ITER, sel_iter, TRUE)) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTREGISTER, H5I_INVALID_HID,
+ "unable to register dataspace selection iterator ID")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Ssel_iter_create() */
-
/*--------------------------------------------------------------------------
NAME
H5Ssel_iter_get_seq_list
@@ -2786,7 +3027,7 @@ done:
Retrieve a list of offset / length pairs (a list of "sequences") matching
the selected elements for an iterator, according to the iteration order for
the iterator. The lengths returned are in _bytes_, not elements.
-
+
Note that the iteration order for "all" and "hyperslab" selections is
row-major (i.e. "C-ordered"), but the iteration order for "point"
selections is "in order selected", unless the H5S_SEL_ITER_GET_SEQ_LIST_SORTED
@@ -2813,31 +3054,30 @@ done:
REVISION LOG
--------------------------------------------------------------------------*/
herr_t
-H5Ssel_iter_get_seq_list(hid_t sel_iter_id, size_t maxseq, size_t maxbytes,
- size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len)
+H5Ssel_iter_get_seq_list(hid_t sel_iter_id, size_t maxseq, size_t maxbytes, size_t *nseq /*out*/,
+ size_t *nbytes /*out*/, hsize_t *off /*out*/, size_t *len /*out*/)
{
- H5S_sel_iter_t *sel_iter; /* Dataspace selection iterator to operate on */
- herr_t ret_value = SUCCEED; /* Return value */
+ H5S_sel_iter_t *sel_iter; /* Dataspace selection iterator to operate on */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
- H5TRACE7("e", "izz*z*z*h*z", sel_iter_id, maxseq, maxbytes, nseq, nbytes, off,
- len);
+ H5TRACE7("e", "izzxxxx", sel_iter_id, maxseq, maxbytes, nseq, nbytes, off, len);
/* Check args */
- if(NULL == (sel_iter = (H5S_sel_iter_t *)H5I_object_verify(sel_iter_id, H5I_SPACE_SEL_ITER)))
+ if (NULL == (sel_iter = (H5S_sel_iter_t *)H5I_object_verify(sel_iter_id, H5I_SPACE_SEL_ITER)))
HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace selection iterator")
- if(NULL == nseq)
+ if (NULL == nseq)
HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "'nseq' pointer is NULL")
- if(NULL == nbytes)
+ if (NULL == nbytes)
HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "'nbytes' pointer is NULL")
- if(NULL == off)
+ if (NULL == off)
HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "offset array pointer is NULL")
- if(NULL == len)
+ if (NULL == len)
HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, "length array pointer is NULL")
/* Get the sequences of bytes */
- if(maxseq > 0 && maxbytes > 0) {
- if(H5S_SELECT_ITER_GET_SEQ_LIST(sel_iter, maxseq, maxbytes, nseq, nbytes, off, len) < 0)
+ if (maxseq > 0 && maxbytes > 0 && sel_iter->elmt_left > 0) {
+ if (H5S_SELECT_ITER_GET_SEQ_LIST(sel_iter, maxseq, maxbytes, nseq, nbytes, off, len) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTGET, FAIL, "sequence length generation failed")
} /* end if */
else
@@ -2847,7 +3087,87 @@ done:
FUNC_LEAVE_API(ret_value)
} /* end H5Ssel_iter_get_seq_list() */
-
+/*--------------------------------------------------------------------------
+ NAME
+ H5Ssel_iter_reset
+ PURPOSE
+ Resets a dataspace selection iterator back to an initial state.
+ USAGE
+ herr_t H5Ssel_iter_reset(sel_iter_id)
+ hid_t sel_iter_id; IN: ID of the dataspace selection iterator to
+ reset
+ hid_t space_id; IN: ID of the dataspace with selection to
+ iterate over
+ RETURNS
+ Non-negative on success / Negative on failure
+ DESCRIPTION
+ Resets a dataspace selection iterator back to an initial state so that
+ the iterator may be used for iteration once again.
+ GLOBAL VARIABLES
+ COMMENTS, BUGS, ASSUMPTIONS
+ EXAMPLES
+ REVISION LOG
+--------------------------------------------------------------------------*/
+herr_t
+H5Ssel_iter_reset(hid_t sel_iter_id, hid_t space_id)
+{
+ H5S_sel_iter_t *sel_iter;
+ H5S_t * space;
+ herr_t ret_value = SUCCEED;
+
+ FUNC_ENTER_API(FAIL)
+ H5TRACE2("e", "ii", sel_iter_id, space_id);
+
+ /* Check args */
+ if (NULL == (sel_iter = (H5S_sel_iter_t *)H5I_object_verify(sel_iter_id, H5I_SPACE_SEL_ITER)))
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace selection iterator")
+ if (NULL == (space = (H5S_t *)H5I_object_verify(space_id, H5I_DATASPACE)))
+ HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace")
+
+ /* Call selection type-specific release routine */
+ if (H5S_SELECT_ITER_RELEASE(sel_iter) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL,
+ "problem releasing a selection iterator's type-specific info")
+
+ /* Simply re-initialize iterator */
+ if (H5S_select_iter_init(sel_iter, space, sel_iter->elmt_size, sel_iter->flags) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to re-initialize selection iterator")
+
+done:
+ FUNC_LEAVE_API(ret_value)
+} /* end H5Ssel_iter_reset() */
+
+/*-------------------------------------------------------------------------
+ * Function: H5S__sel_iter_close_cb
+ *
+ * Purpose: Called when the ref count reaches zero on a selection iterator's ID
+ *
+ * Return: Non-negative on success / Negative on failure
+ *
+ * Programmer: Quincey Koziol
+ * Wednesday, April 8, 2020
+ *
+ *-------------------------------------------------------------------------
+ */
+herr_t
+H5S__sel_iter_close_cb(H5S_sel_iter_t *_sel_iter, void H5_ATTR_UNUSED **request)
+{
+ H5S_sel_iter_t *sel_iter = (H5S_sel_iter_t *)_sel_iter; /* The selection iterator to close */
+ herr_t ret_value = SUCCEED; /* Return value */
+
+ FUNC_ENTER_PACKAGE
+
+ /* Sanity check */
+ HDassert(sel_iter);
+
+ /* Close the selection iterator object */
+ if (H5S_sel_iter_close(sel_iter) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CLOSEERROR, FAIL, "unable to close selection iterator");
+
+done:
+ FUNC_LEAVE_NOAPI(ret_value)
+} /* end H5S__sel_iter_close_cb() */
+
/*-------------------------------------------------------------------------
* Function: H5S_sel_iter_close
*
@@ -2863,7 +3183,7 @@ done:
herr_t
H5S_sel_iter_close(H5S_sel_iter_t *sel_iter)
{
- herr_t ret_value = SUCCEED; /* Return value */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI(FAIL)
@@ -2871,8 +3191,9 @@ H5S_sel_iter_close(H5S_sel_iter_t *sel_iter)
HDassert(sel_iter);
/* Call selection type-specific release routine */
- if(H5S_SELECT_ITER_RELEASE(sel_iter) < 0)
- HGOTO_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "problem releasing a selection iterator's type-specific info")
+ if (H5S_SELECT_ITER_RELEASE(sel_iter) < 0)
+ HGOTO_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL,
+ "problem releasing a selection iterator's type-specific info")
/* Release the structure */
sel_iter = H5FL_FREE(H5S_sel_iter_t, sel_iter);
@@ -2881,7 +3202,6 @@ done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5S_sel_iter_close() */
-
/*--------------------------------------------------------------------------
NAME
H5Ssel_iter_close
@@ -2904,20 +3224,19 @@ done:
herr_t
H5Ssel_iter_close(hid_t sel_iter_id)
{
- herr_t ret_value = SUCCEED; /* Return value */
+ herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_API(FAIL)
H5TRACE1("e", "i", sel_iter_id);
/* Check args */
- if(NULL == H5I_object_verify(sel_iter_id, H5I_SPACE_SEL_ITER))
+ if (NULL == H5I_object_verify(sel_iter_id, H5I_SPACE_SEL_ITER))
HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace selection iterator")
/* When the reference count reaches zero the resources are freed */
- if(H5I_dec_app_ref(sel_iter_id) < 0)
+ if (H5I_dec_app_ref(sel_iter_id) < 0)
HGOTO_ERROR(H5E_DATASPACE, H5E_CANTDEC, FAIL, "problem freeing dataspace selection iterator ID")
done:
FUNC_LEAVE_API(ret_value)
} /* end H5Ssel_iter_close() */
-