87 int buffer_size,
int *position,
90 idxlist->
vtable->
pack(idxlist, buffer, buffer_size,
110 return idxlist->num_indices;
123 die(
"xt_idxlist_get_indices_const: fatal error: "
124 "get_indices_const not implemented");
141 struct Xt_stripe *stripes_ = *stripes = num_stripes_
142 ?
xmalloc(num_stripes_ *
sizeof (stripes_[0])) : NULL;
149 size_t num_stripes_alloc)
151 INSTR_DEF(instr_fallback,
"xt_idxlist_get_index_stripes.fallback")
162 Xt_int *indices =
xmalloc(num_indices *
sizeof (indices[0]));
166 num_stripes_alloc, stripes);
184 int num_pos,
Xt_int *indices,
187 INSTR_DEF(instr_fallback,
"xt_idxlist_get_intersection.fallback")
201 for (
int ip=0; ip<num_pos; ip++) {
203 &indices[ip]) != 0) {
204 indices[ip] = undef_idx;
222 int num_indices,
int * positions,
223 int single_match_only) {
225 INSTR_DEF(instr_fallback,
"xt_idxlist_get_positions_of_indices.fallback")
227 size_t num_failed_lookups;
228 if (num_indices > 0) {
241 =
xmalloc((
size_t)num_tmp_indices *
sizeof (tmp_indices[0]));
256 num_failed_lookups = 0;
257 assert(num_failed_lookups <= INT_MAX);
258 return (
int)num_failed_lookups;
264 const struct Xt_stripe stripes[num_stripes],
267 int single_match_only)
270 idxlist, num_stripes, stripes, num_ext, pos_ext, single_match_only,
278 const struct Xt_stripe stripes[num_stripes],
281 int single_match_only,
287 num_stripes, stripes, num_ext, pos_ext, single_match_only, config);
294 idxlist, stripes_alloc.
stripes, (
size_t)num_tmp_stripes);
300 num_stripes,
stripes, num_ext, pos_ext, single_match_only, config);
307 int * position,
int offset) {
316 int num_indices,
int * positions,
319 INSTR_DEF(instr_fallback,
"xt_idxlist_get_intersection.fallback")
328 for (
int i = 0; i < num_indices; ++i) {
330 int temp_position, offset;
339 &temp_position, offset);
342 positions[i] = temp_position;
366 Xt_int global_stride[ndim],
369 idx = (
Xt_int)(idx - global_start_index);
371 for (
size_t i = 0; i < ndim - 1; ++i) {
372 position[i] = (
Xt_int)(idx / global_stride[i]);
373 idx = (
Xt_int)(idx % global_stride[i]);
376 position[ndim - 1] = idx;
380 const Xt_int global_size[ndim],
381 Xt_int global_start_index,
384 INSTR_DEF(instr_fallback,
"xt_idxlist_get_bounding_box.fallback")
388 if (num_indices == 0) {
390 for (
size_t i = 0; i < ndim; ++i) {
400 global_start_index, bounds);
406 Xt_int global_stride[ndim];
408 global_stride[ndim - 1] = 1;
410 for (
size_t i = ndim - 2; i < ndim; --i)
411 global_stride[i] = (
Xt_int)(global_stride[i+1] * global_size[i+1]);
414 Xt_int curr_position[ndim];
418 global_start_index, curr_position);
420 for (
size_t i = 0; i < ndim; ++i) {
421 bounds[i].start = curr_position[i];
425 for (
int j = 1; j < num_indices; ++j) {
429 global_start_index, curr_position);
431 for (
size_t i = 0; i < ndim; ++i) {
433 if (curr_position[i] < bounds[i].start) {
435 bounds[i].size = (
Xt_int)(bounds[i].size + curr_position[i] - bounds[i].start);
436 bounds[i].start = curr_position[i];
438 }
else if (curr_position[i] >= bounds[i].start + bounds[i].size) {
440 bounds[i].size = (
Xt_int)(curr_position[i] - bounds[i].start + 1);
450static pthread_mutex_t nextIdMutex = PTHREAD_MUTEX_INITIALIZER;
458 if (pthread_mutex_lock(&nextIdMutex))
459 die(
"unexpected pthread locking error");
463 die(
"unique ID counter overflow");
465 if (pthread_mutex_unlock(&nextIdMutex))
466 die(
"unexpected pthread locking error");
474 assert(idxlist->
uid);
482 bool do_convert =
false;
488 && ((size_t)num_indices *
sizeof (
Xt_int)
489 > (size_t)num_stripes *
sizeof (
struct Xt_stripe));
add versions of standard API functions not returning on error
const struct xt_idxlist_vtable * vtable
struct Xt_stripe * stripes
size_t(* get_pack_size)(Xt_idxlist, MPI_Comm)
Xt_int(* get_max_index)(Xt_idxlist)
int(* get_position_of_index_off)(Xt_idxlist, Xt_int, int *, int)
int(* get_index_at_position)(Xt_idxlist, int, Xt_int *)
Xt_idxlist(* sorted_copy)(Xt_idxlist, Xt_config)
int(* get_indices_at_positions)(Xt_idxlist idxlist, const int *positions, int num, Xt_int *index, Xt_int undef_idx)
void(* get_index_stripes)(Xt_idxlist, struct Xt_stripe *restrict, size_t)
int(* get_pos_exts_of_index_stripes)(Xt_idxlist, int, const struct Xt_stripe *, int *, struct Xt_pos_ext **, int, Xt_config)
void(* delete)(Xt_idxlist)
void(* pack)(Xt_idxlist, void *, int, int *, MPI_Comm)
Xt_idxlist(* copy)(Xt_idxlist)
int(* get_position_of_index)(Xt_idxlist, Xt_int, int *)
int(* get_num_index_stripes)(Xt_idxlist)
int(* get_sorting)(Xt_idxlist)
void(* get_bounding_box)(Xt_idxlist idxlist, unsigned ndim, const Xt_int global_size[ndim], Xt_int global_start_index, struct Xt_bounds bounds[ndim])
void(* get_indices)(Xt_idxlist, Xt_int *indices)
size_t(* get_positions_of_indices)(Xt_idxlist, Xt_int const *, size_t, int *, int)
Xt_int(* get_min_index)(Xt_idxlist)
Xt_int const *(* get_indices_const)(Xt_idxlist idxlist)
int(* get_positions_of_indices_off)(Xt_idxlist, Xt_int const *, int, int *, int *)
struct Xt_config_ xt_default_config
struct Xt_config_ * Xt_config
implementation of configuration object
base definitions header file
struct Xt_idxlist_ * Xt_idxlist
Xt_idxlist xt_idxlist_sorted_copy(Xt_idxlist idxlist)
int xt_idxlist_get_positions_of_indices(Xt_idxlist idxlist, Xt_int const *indices, int num_indices, int *positions, int single_match_only)
Xt_int xt_idxlist_get_min_index(Xt_idxlist idxlist)
void xt_idxlist_get_index_stripes_keep_buf(Xt_idxlist idxlist, struct Xt_stripe *stripes, size_t num_stripes_alloc)
int xt_idxlist_is_stripe_conversion_profitable(Xt_idxlist idxlist, Xt_config config)
const Xt_int * xt_idxlist_get_indices_const(Xt_idxlist idxlist)
Xt_int xt_idxlist_get_max_index(Xt_idxlist idxlist)
int xt_idxlist_get_position_of_index(Xt_idxlist idxlist, Xt_int idx, int *position)
void xt_idxlist_get_indices(Xt_idxlist idxlist, Xt_int *indices)
bool xt_idxlist_is_stripe_conversion_profitable_(Xt_idxlist idxlist, Xt_config config)
int xt_idxlist_get_positions_of_indices_off(Xt_idxlist idxlist, const Xt_int *indices, int num_indices, int *positions, int *offsets)
int xt_idxlist_get_num_index_stripes(Xt_idxlist idxlist)
Xt_uid xt_idxlist_new_uid(void)
int xt_idxlist_get_index_at_position(Xt_idxlist idxlist, int position, Xt_int *idx)
int xt_idxlist_get_position_of_index_off(Xt_idxlist idxlist, Xt_int idx, int *position, int offset)
int xt_idxlist_get_pos_exts_of_index_stripes_custom(Xt_idxlist idxlist, int num_stripes, const struct Xt_stripe stripes[num_stripes], int *num_ext, struct Xt_pos_ext **pos_ext, int single_match_only, Xt_config config)
Xt_uid xt_idxlist_get_uid(Xt_idxlist idxlist)
Xt_idxlist xt_idxlist_sorted_copy_custom(Xt_idxlist idxlist, Xt_config config)
void xt_idxlist_pack(Xt_idxlist idxlist, void *buffer, int buffer_size, int *position, MPI_Comm comm)
size_t xt_idxlist_get_pack_size(Xt_idxlist idxlist, MPI_Comm comm)
int xt_idxlist_get_indices_at_positions(Xt_idxlist idxlist, const int *positions, int num_pos, Xt_int *indices, Xt_int undef_idx)
void xt_idxlist_get_index_stripes(Xt_idxlist idxlist, struct Xt_stripe **stripes, int *num_stripes)
void xt_idxlist_get_bounding_box(Xt_idxlist idxlist, unsigned ndim, const Xt_int global_size[ndim], Xt_int global_start_index, struct Xt_bounds bounds[ndim])
int xt_idxlist_get_pos_exts_of_index_stripes(Xt_idxlist idxlist, int num_stripes, const struct Xt_stripe stripes[num_stripes], int *num_ext, struct Xt_pos_ext **pos_ext, int single_match_only)
Xt_idxlist xt_idxlist_copy(Xt_idxlist idxlist)
int xt_idxlist_get_sorting(Xt_idxlist idxlist)
static void get_position_in_ndim_space(Xt_int idx, unsigned ndim, Xt_int global_stride[ndim], Xt_int global_start_index, Xt_int position[ndim])
void xt_idxlist_delete(Xt_idxlist idxlist)
Provide non-public declarations common to all index lists.
#define xt_idxlist_get_num_indices(idxlist)
struct Xt_stripes_alloc xt_idxstripes_alloc(size_t num_stripes)
Xt_idxlist xt_idxstripes_congeal(struct Xt_stripes_alloc stripes_alloc)
Xt_idxlist xt_idxvec_prealloc_new(const Xt_int *idxvec, int num_indices)
size_t xt_convert_indices_to_stripes_buf(size_t num_indices, const Xt_int *restrict indices, size_t num_stripes_alloc, struct Xt_stripe *stripes)