1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 2 * Copyright by The HDF Group. * 3 * Copyright by the Board of Trustees of the University of Illinois. * 4 * All rights reserved. * 5 * * 6 * This file is part of HDF5. The full HDF5 copyright notice, including * 7 * terms governing use, modification, and redistribution, is contained in * 8 * the COPYING file, which can be found at the root of the source code * 9 * distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. * 10 * If you do not have access to either file, you may request a copy from * 11 * help@hdfgroup.org. * 12 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 13 14 /* 15 * This file contains private information about the H5S module 16 */ 17 #ifndef _H5Sprivate_H 18 #define _H5Sprivate_H 19 20 /* Early typedefs to avoid circular dependencies */ 21 typedef struct H5S_t H5S_t; 22 23 /* Include package's public header */ 24 #include "H5Spublic.h" 25 26 /* Public headers needed by this file */ 27 #include "H5Dpublic.h" /* Datasets */ 28 29 /* Private headers needed by this file */ 30 #include "H5private.h" /* Generic Functions */ 31 #include "H5Fprivate.h" /* Files */ 32 #include "H5Gprivate.h" /* Groups */ 33 #include "H5Oprivate.h" /* Object headers */ 34 #include "H5Pprivate.h" /* Property lists */ 35 #include "H5Tprivate.h" /* Datatypes */ 36 37 /* Flags for H5S_find */ 38 #define H5S_CONV_PAR_IO_POSSIBLE 0x0001 39 /* The storage options are mutually exclusive */ 40 /* (2-bits reserved for storage type currently) */ 41 #define H5S_CONV_STORAGE_COMPACT 0x0000 /* i.e. '0' */ 42 #define H5S_CONV_STORAGE_CONTIGUOUS 0x0002 /* i.e. '1' */ 43 #define H5S_CONV_STORAGE_CHUNKED 0x0004 /* i.e. '2' */ 44 #define H5S_CONV_STORAGE_MASK 0x0006 45 46 /* Flags for "get_seq_list" methods */ 47 #define H5S_GET_SEQ_LIST_SORTED 0x0001 48 49 /* Forward references of package typedefs */ 50 typedef struct H5S_extent_t H5S_extent_t; 51 typedef struct H5S_pnt_node_t H5S_pnt_node_t; 52 typedef struct H5S_hyper_span_t H5S_hyper_span_t; 53 typedef struct H5S_hyper_span_info_t H5S_hyper_span_info_t; 54 55 /* Information about one dimension in a hyperslab selection */ 56 typedef struct H5S_hyper_dim_t { 57 hsize_t start; 58 hsize_t stride; 59 hsize_t count; 60 hsize_t block; 61 } H5S_hyper_dim_t; 62 63 /* Point selection iteration container */ 64 typedef struct { 65 H5S_pnt_node_t *curr; /* Pointer to next node to output */ 66 } H5S_point_iter_t; 67 68 /* Hyperslab selection iteration container */ 69 typedef struct { 70 /* Common fields for all hyperslab selections */ 71 hsize_t off[H5S_MAX_RANK]; /* Offset in span node (used as position for regular hyperslabs) */ 72 unsigned iter_rank; /* Rank of iterator information */ 73 /* (This should always be the same as the dataspace 74 * rank, except for regular hyperslab selections in 75 * which there are contiguous regions in the lower 76 * dimensions which have been "flattened" out 77 */ 78 hbool_t diminfo_valid; /* Whether the dimension information is valid */ 79 80 /* "Flattened" regular hyperslab selection fields */ 81 H5S_hyper_dim_t diminfo[H5S_MAX_RANK]; /* "Flattened" regular selection information */ 82 hsize_t size[H5S_MAX_RANK]; /* "Flattened" dataspace extent information */ 83 hssize_t sel_off[H5S_MAX_RANK]; /* "Flattened" selection offset information */ 84 hbool_t flattened[H5S_MAX_RANK]; /* Whether this dimension has been flattened */ 85 86 /* Irregular hyperslab selection fields */ 87 H5S_hyper_span_info_t *spans; /* Pointer to copy of the span tree */ 88 H5S_hyper_span_t *span[H5S_MAX_RANK];/* Array of pointers to span nodes */ 89 } H5S_hyper_iter_t; 90 91 /* "All" selection iteration container */ 92 typedef struct { 93 hsize_t elmt_offset; /* Next element to output */ 94 hsize_t byte_offset; /* Next byte to output */ 95 } H5S_all_iter_t; 96 97 /* Forward declaration of selection iteration class */ 98 struct H5S_sel_iter_class_t; 99 100 /* Selection iteration container */ 101 typedef struct H5S_sel_iter_t { 102 /* Selection class */ 103 const struct H5S_sel_iter_class_t *type; /* Selection iteration class info */ 104 105 /* Information common to all iterators */ 106 unsigned rank; /* Rank of dataspace the selection iterator is operating on */ 107 hsize_t *dims; /* Dimensions of dataspace the selection is operating on */ 108 hsize_t elmt_left; /* Number of elements left to iterate over */ 109 size_t elmt_size; /* Size of elements to iterate over */ 110 111 /* Information specific to each type of iterator */ 112 union { 113 H5S_point_iter_t pnt; /* Point selection iteration information */ 114 H5S_hyper_iter_t hyp; /* New Hyperslab selection iteration information */ 115 H5S_all_iter_t all; /* "All" selection iteration information */ 116 } u; 117 } H5S_sel_iter_t; 118 119 /* Selection iteration operator for internal library callbacks */ 120 typedef herr_t (*H5S_sel_iter_lib_op_t)(void *elem, const H5T_t *type, 121 unsigned ndim, const hsize_t *point, void *op_data); 122 123 /* Describe kind of callback to make */ 124 typedef enum H5S_sel_iter_op_type_t { 125 H5S_SEL_ITER_OP_APP, /* Application callback */ 126 H5S_SEL_ITER_OP_LIB /* Library internal callback */ 127 } H5S_sel_iter_op_type_t; 128 129 typedef struct H5S_sel_iter_app_op_t { 130 H5D_operator_t op; /* Callback */ 131 hid_t type_id; /* Type ID to be passed to callback */ 132 } H5S_sel_iter_app_op_t; 133 134 typedef struct H5S_sel_iter_op_t { 135 H5S_sel_iter_op_type_t op_type; 136 union { 137 H5S_sel_iter_app_op_t app_op; /* Application callback */ 138 H5S_sel_iter_lib_op_t lib_op; /* Library internal callback */ 139 } u; 140 } H5S_sel_iter_op_t; 141 142 /* If the module using this macro is allowed access to the private variables, access them directly */ 143 #ifdef H5S_MODULE 144 #define H5S_GET_EXTENT_TYPE(S) ((S)->extent.type) 145 #define H5S_GET_EXTENT_NDIMS(S) ((S)->extent.rank) 146 #define H5S_GET_EXTENT_NPOINTS(S) ((S)->extent.nelem) 147 #define H5S_GET_SELECT_NPOINTS(S) ((S)->select.num_elem) 148 #define H5S_GET_SELECT_TYPE(S) ((S)->select.type->type) 149 #define H5S_SELECT_GET_SEQ_LIST(S,FLAGS,ITER,MAXSEQ,MAXBYTES,NSEQ,NBYTES,OFF,LEN) ((*(S)->select.type->get_seq_list)(S,FLAGS,ITER,MAXSEQ,MAXBYTES,NSEQ,NBYTES,OFF,LEN)) 150 #define H5S_SELECT_VALID(S) ((*(S)->select.type->is_valid)(S)) 151 #define H5S_SELECT_RELEASE(S) ((*(S)->select.type->release)(S)) 152 #define H5S_SELECT_SERIAL_SIZE(S,F) ((*(S)->select.type->serial_size)(S,F)) 153 #define H5S_SELECT_SERIALIZE(S,BUF,F) ((*(S)->select.type->serialize)(S,BUF,F)) 154 #define H5S_SELECT_BOUNDS(S,START,END) ((*(S)->select.type->bounds)(S,START,END)) 155 #define H5S_SELECT_OFFSET(S, OFFSET) ((*(S)->select.type->offset)(S, OFFSET)) 156 #define H5S_SELECT_IS_CONTIGUOUS(S) ((*(S)->select.type->is_contiguous)(S)) 157 #define H5S_SELECT_IS_SINGLE(S) ((*(S)->select.type->is_single)(S)) 158 #define H5S_SELECT_IS_REGULAR(S) ((*(S)->select.type->is_regular)(S)) 159 #define H5S_SELECT_ADJUST_U(S,O) ((*(S)->select.type->adjust_u)(S, O)) 160 #define H5S_SELECT_PROJECT_SCALAR(S,O) ((*(S)->select.type->project_scalar)(S, O)) 161 #define H5S_SELECT_PROJECT_SIMPLE(S,NS, O) ((*(S)->select.type->project_simple)(S, NS, O)) 162 #define H5S_SELECT_ITER_COORDS(ITER,COORDS) ((*(ITER)->type->iter_coords)(ITER,COORDS)) 163 #define H5S_SELECT_ITER_BLOCK(ITER,START,END) ((*(ITER)->type->iter_block)(ITER,START,END)) 164 #define H5S_SELECT_ITER_NELMTS(ITER) ((*(ITER)->type->iter_nelmts)(ITER)) 165 #define H5S_SELECT_ITER_HAS_NEXT_BLOCK(ITER) ((*(ITER)->type->iter_has_next_block)(ITER)) 166 #define H5S_SELECT_ITER_NEXT(ITER,NELEM)((*(ITER)->type->iter_next)(ITER,NELEM)) 167 #define H5S_SELECT_ITER_NEXT_BLOCK(ITER) ((*(ITER)->type->iter_next_block)(ITER)) 168 #define H5S_SELECT_ITER_RELEASE(ITER) ((*(ITER)->type->iter_release)(ITER)) 169 #else /* H5S_MODULE */ 170 #define H5S_GET_EXTENT_TYPE(S) (H5S_get_simple_extent_type(S)) 171 #define H5S_GET_EXTENT_NDIMS(S) (H5S_get_simple_extent_ndims(S)) 172 #define H5S_GET_EXTENT_NPOINTS(S) (H5S_get_simple_extent_npoints(S)) 173 #define H5S_GET_SELECT_NPOINTS(S) (H5S_get_select_npoints(S)) 174 #define H5S_GET_SELECT_TYPE(S) (H5S_get_select_type(S)) 175 #define H5S_SELECT_GET_SEQ_LIST(S,FLAGS,ITER,MAXSEQ,MAXBYTES,NSEQ,NBYTES,OFF,LEN) (H5S_select_get_seq_list(S,FLAGS,ITER,MAXSEQ,MAXBYTES,NSEQ,NBYTES,OFF,LEN)) 176 #define H5S_SELECT_VALID(S) (H5S_select_valid(S)) 177 #define H5S_SELECT_RELEASE(S) (H5S_select_release(S)) 178 #define H5S_SELECT_SERIAL_SIZE(S,F) (H5S_select_serial_size(S,F)) 179 #define H5S_SELECT_SERIALIZE(S,BUF,F) (H5S_select_serialize(S,BUF,F)) 180 #define H5S_SELECT_BOUNDS(S,START,END) (H5S_get_select_bounds(S,START,END)) 181 #define H5S_SELECT_OFFSET(S, OFFSET) (H5S_get_select_offset(S, OFFSET)) 182 #define H5S_SELECT_IS_CONTIGUOUS(S) (H5S_select_is_contiguous(S)) 183 #define H5S_SELECT_IS_SINGLE(S) (H5S_select_is_single(S)) 184 #define H5S_SELECT_IS_REGULAR(S) (H5S_select_is_regular(S)) 185 #define H5S_SELECT_ADJUST_U(S,O) (H5S_select_adjust_u(S, O)) 186 #define H5S_SELECT_PROJECT_SCALAR(S,O) (H5S_select_project_scalar(S, O)) 187 #define H5S_SELECT_PROJECT_SIMPLE(S,NS,O) (H5S_select_project_simple(S, NS, O)) 188 #define H5S_SELECT_ITER_COORDS(ITER,COORDS) (H5S_select_iter_coords(ITER,COORDS)) 189 #define H5S_SELECT_ITER_BLOCK(ITER,START,END) (H5S_select_iter_block(ITER,START,END)) 190 #define H5S_SELECT_ITER_NELMTS(ITER) (H5S_select_iter_nelmts(ITER)) 191 #define H5S_SELECT_ITER_HAS_NEXT_BLOCK(ITER) (H5S_select_iter_has_next_block(ITER)) 192 #define H5S_SELECT_ITER_NEXT(ITER,NELEM)(H5S_select_iter_next(ITER,NELEM)) 193 #define H5S_SELECT_ITER_NEXT_BLOCK(ITER) (H5S_select_iter_next_block(ITER)) 194 #define H5S_SELECT_ITER_RELEASE(ITER) (H5S_select_iter_release(ITER)) 195 #endif /* H5S_MODULE */ 196 /* Handle these callbacks in a special way, since they have prologs that need to be executed */ 197 #define H5S_SELECT_COPY(DST,SRC,SHARE) (H5S_select_copy(DST,SRC,SHARE)) 198 #define H5S_SELECT_DESERIALIZE(S,BUF) (H5S_select_deserialize(S,BUF)) 199 200 201 /* Operations on dataspaces */ 202 H5_DLL H5S_t *H5S_copy(const H5S_t *src, hbool_t share_selection, hbool_t copy_max); 203 H5_DLL herr_t H5S_close(H5S_t *ds); 204 H5_DLL H5S_class_t H5S_get_simple_extent_type(const H5S_t *ds); 205 H5_DLL hssize_t H5S_get_simple_extent_npoints(const H5S_t *ds); 206 H5_DLL hsize_t H5S_get_npoints_max(const H5S_t *ds); 207 H5_DLL hbool_t H5S_has_extent(const H5S_t *ds); 208 H5_DLL int H5S_get_simple_extent_ndims(const H5S_t *ds); 209 H5_DLL int H5S_get_simple_extent_dims(const H5S_t *ds, hsize_t dims[]/*out*/, 210 hsize_t max_dims[]/*out*/); 211 H5_DLL herr_t H5S_write(H5F_t *f, H5O_t *oh, unsigned update_flags, H5S_t *ds); 212 H5_DLL herr_t H5S_append(H5F_t *f, struct H5O_t *oh, H5S_t *ds); 213 H5_DLL H5S_t *H5S_read(const struct H5O_loc_t *loc); 214 H5_DLL htri_t H5S_set_extent(H5S_t *space, const hsize_t *size); 215 H5_DLL herr_t H5S_set_extent_real(H5S_t *space, const hsize_t *size); 216 H5_DLL herr_t H5S_set_extent_simple(H5S_t *space, unsigned rank, 217 const hsize_t *dims, const hsize_t *max); 218 H5_DLL H5S_t *H5S_create(H5S_class_t type); 219 H5_DLL herr_t H5S_get_validated_dataspace(hid_t space_id, const H5S_t **space/*out*/); 220 H5_DLL H5S_t *H5S_create_simple(unsigned rank, const hsize_t dims[/*rank*/], 221 const hsize_t maxdims[/*rank*/]); 222 H5_DLL herr_t H5S_set_version(H5F_t *f, H5S_t *ds); 223 H5_DLL herr_t H5S_encode(H5S_t *obj, unsigned char **p, size_t *nalloc, hid_t fapl_id); 224 H5_DLL H5S_t *H5S_decode(const unsigned char **p); 225 H5_DLL herr_t H5S_debug(H5F_t *f, const void *_mesg, FILE *stream, int indent, 226 int fwidth); 227 228 /* Operations on dataspace extents */ 229 H5_DLL hsize_t H5S_extent_nelem(const H5S_extent_t *ext); 230 H5_DLL int H5S_extent_get_dims(const H5S_extent_t *ext, hsize_t dims[], hsize_t max_dims[]); 231 H5_DLL htri_t H5S_extent_equal(const H5S_t *ds1, const H5S_t *ds2); 232 H5_DLL herr_t H5S_extent_copy(H5S_t *dst, const H5S_t *src); 233 234 /* Operations on selections */ 235 H5_DLL herr_t H5S_select_deserialize(H5S_t **space, const uint8_t **p); 236 H5_DLL H5S_sel_type H5S_get_select_type(const H5S_t *space); 237 H5_DLL herr_t H5S_select_iterate(void *buf, const H5T_t *type, const H5S_t *space, 238 const H5S_sel_iter_op_t *op, void *op_data); 239 H5_DLL herr_t H5S_select_fill(const void *fill, size_t fill_size, 240 const H5S_t *space, void *buf); 241 H5_DLL htri_t H5S_select_valid(const H5S_t *space); 242 H5_DLL hssize_t H5S_get_select_npoints(const H5S_t *space); 243 H5_DLL herr_t H5S_get_select_bounds(const H5S_t *space, hsize_t *start, hsize_t *end); 244 H5_DLL herr_t H5S_get_select_offset(const H5S_t *space, hsize_t *offset); 245 H5_DLL int H5S_get_select_unlim_dim(const H5S_t *space); 246 H5_DLL herr_t H5S_get_select_num_elem_non_unlim(const H5S_t *space, 247 hsize_t *num_elem_non_unlim); 248 H5_DLL herr_t H5S_select_offset(H5S_t *space, const hssize_t *offset); 249 H5_DLL herr_t H5S_select_copy(H5S_t *dst, const H5S_t *src, hbool_t share_selection); 250 H5_DLL htri_t H5S_select_shape_same(const H5S_t *space1, const H5S_t *space2); 251 H5_DLL herr_t H5S_select_construct_projection(const H5S_t *base_space, 252 H5S_t **new_space_ptr, unsigned new_space_rank, const void *buf, 253 void const **adj_buf_ptr, hsize_t element_size); 254 H5_DLL herr_t H5S_select_release(H5S_t *ds); 255 H5_DLL herr_t H5S_select_get_seq_list(const H5S_t *space, unsigned flags, 256 H5S_sel_iter_t *iter, size_t maxseq, size_t maxbytes, 257 size_t *nseq, size_t *nbytes, hsize_t *off, size_t *len); 258 H5_DLL hssize_t H5S_select_serial_size(const H5S_t *space, H5F_t *f); 259 H5_DLL herr_t H5S_select_serialize(const H5S_t *space, uint8_t **p, H5F_t *f); 260 H5_DLL htri_t H5S_select_is_contiguous(const H5S_t *space); 261 H5_DLL htri_t H5S_select_is_single(const H5S_t *space); 262 H5_DLL htri_t H5S_select_is_regular(const H5S_t *space); 263 H5_DLL void H5S_select_adjust_u(H5S_t *space, const hsize_t *offset); 264 H5_DLL herr_t H5S_select_project_scalar(const H5S_t *space, hsize_t *offset); 265 H5_DLL herr_t H5S_select_project_simple(const H5S_t *space, H5S_t *new_space, hsize_t *offset); 266 H5_DLL herr_t H5S_select_project_intersection(const H5S_t *src_space, 267 const H5S_t *dst_space, const H5S_t *src_intersect_space, 268 H5S_t **new_space_ptr); 269 H5_DLL herr_t H5S_select_subtract(H5S_t *space, H5S_t *subtract_space); 270 271 /* Operations on all selections */ 272 H5_DLL herr_t H5S_select_all(H5S_t *space, hbool_t rel_prev); 273 274 /* Operations on none selections */ 275 H5_DLL herr_t H5S_select_none(H5S_t *space); 276 277 /* Operations on point selections */ 278 H5_DLL herr_t H5S_select_elements(H5S_t *space, H5S_seloper_t op, 279 hsize_t num_elem, const hsize_t *coord); 280 281 /* Operations on hyperslab selections */ 282 H5_DLL herr_t H5S_select_hyperslab(H5S_t *space, H5S_seloper_t op, const hsize_t start[], 283 const hsize_t *stride, const hsize_t count[], const hsize_t *block); 284 H5_DLL herr_t H5S_hyper_add_span_element(H5S_t *space, unsigned rank, 285 const hsize_t *coords); 286 H5_DLL herr_t H5S_hyper_reset_scratch(H5S_t *space); 287 H5_DLL herr_t H5S_hyper_convert(H5S_t *space); 288 #ifdef LATER 289 H5_DLL htri_t H5S_hyper_intersect (H5S_t *space1, H5S_t *space2); 290 #endif /* LATER */ 291 H5_DLL htri_t H5S_hyper_intersect_block(H5S_t *space, const hsize_t *start, const hsize_t *end); 292 H5_DLL herr_t H5S_hyper_adjust_s(H5S_t *space, const hssize_t *offset); 293 H5_DLL htri_t H5S_hyper_normalize_offset(H5S_t *space, hssize_t *old_offset); 294 H5_DLL herr_t H5S_hyper_denormalize_offset(H5S_t *space, const hssize_t *old_offset); 295 H5_DLL herr_t H5S_hyper_clip_unlim(H5S_t *space, hsize_t clip_size); 296 H5_DLL hsize_t H5S_hyper_get_clip_extent(const H5S_t *clip_space, 297 const H5S_t *match_space, hbool_t incl_trail); 298 H5_DLL hsize_t H5S_hyper_get_clip_extent_match(const H5S_t *clip_space, 299 const H5S_t *match_space, hsize_t match_clip_size, hbool_t incl_trail); 300 H5_DLL H5S_t *H5S_hyper_get_unlim_block(const H5S_t *space, 301 hsize_t block_index); 302 H5_DLL hsize_t H5S_hyper_get_first_inc_block(const H5S_t *space, 303 hsize_t clip_size, hbool_t *partial); 304 305 /* Operations on selection iterators */ 306 H5_DLL herr_t H5S_select_iter_init(H5S_sel_iter_t *iter, const H5S_t *space, size_t elmt_size); 307 H5_DLL herr_t H5S_select_iter_coords(const H5S_sel_iter_t *sel_iter, hsize_t *coords); 308 H5_DLL hsize_t H5S_select_iter_nelmts(const H5S_sel_iter_t *sel_iter); 309 H5_DLL herr_t H5S_select_iter_next(H5S_sel_iter_t *sel_iter, hsize_t nelem); 310 H5_DLL herr_t H5S_select_iter_release(H5S_sel_iter_t *sel_iter); 311 312 #ifdef H5_HAVE_PARALLEL 313 H5_DLL hsize_t H5S_mpio_set_bigio_count(hsize_t new_count); 314 H5_DLL herr_t H5S_mpio_space_type(const H5S_t *space, size_t elmt_size, 315 /* out: */ MPI_Datatype *new_type, 316 int *count, 317 hbool_t *is_derived_type, 318 hbool_t do_permute, 319 hsize_t **permute_map, 320 hbool_t * is_permuted); 321 #endif /* H5_HAVE_PARALLEL */ 322 323 #endif /* _H5Sprivate_H */ 324 325