104 int * position,
int offset);
121 .get_indices_at_positions = NULL,
123 .get_positions_of_indices = NULL,
125 .get_positions_of_indices_off = NULL,
128 .get_bounding_box = NULL,
150 if (num_idxlists > 1)
153 =
xmalloc(
sizeof (*collectionlist)
154 + (
size_t)num_idxlists *
sizeof (collectionlist->
idxlists[0]));
160 for (
int i = 0; i < num_idxlists; ++i)
172 else if (num_idxlists == 1)
185 for (
int i = 0; i < num_lists; ++i)
189 free(collectionlist);
197 int size_header, num_lists = collectionlist->
num_idxlists;
198 size_t size_idxlists = 0;
200 xt_mpi_call(MPI_Pack_size(2, MPI_INT, comm, &size_header), comm);
202 for (
int i = 0; i < num_lists; ++i)
206 return (
size_t)size_header + size_idxlists;
218 buffer_size, position, comm), comm);
220 for (
int i = 0; i < num_lists; ++i)
230 xt_mpi_call(MPI_Unpack(buffer, buffer_size, position,
231 &num_lists, 1, MPI_INT, comm), comm);
234 =
xmalloc(
sizeof (*collectionlist)
235 + (
size_t)num_lists *
sizeof (collectionlist->
idxlists[0]));
241 for (
int i = 0; i < num_lists; ++i) {
274 int offlist = 0, num_lists = collectionlist->
num_idxlists;
276 for (
int i = 0; i < num_lists; ++i) {
311 size_t temp_stripes_array_size = 0;
312 int num_temp_stripes = 0;
316 temp_stripes_array_size = (size_t)num_temp_stripes;
319 int curr_num_stripes = 0, num_lists = collectionlist->
num_idxlists;
320 for (
int i = 1; i < num_lists; ++i) {
328 num_temp_stripes + curr_num_stripes);
332 temp_stripes + num_temp_stripes,
334 num_temp_stripes > 0);
336 num_temp_stripes += curr_num_stripes;
342 (
size_t)num_temp_stripes *
sizeof(*temp_stripes));
343 *num_stripes = num_temp_stripes;
353 for (
int i = 0; i < num_lists; ++i) {
368 int * position,
int offset) {
372 int curr_num_indices = 0;
374 int idxlist_offsets = 0;
381 idxlist_offsets += curr_num_indices;
383 }
while (idxlist_offsets + curr_num_indices <= offset && ++i < num_lists);
385 offset -= idxlist_offsets;
387 for (;i < num_lists; ++i)
389 index, position, offset)) {
390 *position += idxlist_offsets;
415 assert(num_lists > 0);
419 for (
int i = 1; i < num_lists; ++i)
432 assert(num_lists > 0);
436 for (
int i = 1; i < num_lists; ++i)
#define ENSURE_ARRAY_SIZE(arrayp, curr_array_size, req_size)
add versions of standard API functions not returning on error
#define xrealloc(ptr, size)
Xt_int * index_array_cache
struct Xt_idxlist_ parent
void(* delete)(Xt_idxlist)
base definitions header file
struct Xt_idxlist_ * Xt_idxlist
Xt_idxlist xt_idxempty_new(void)
void xt_idxlist_get_index_stripes_keep_buf(Xt_idxlist idxlist, struct Xt_stripe **stripes, int *num_stripes)
int xt_idxlist_get_num_indices(Xt_idxlist idxlist)
Xt_idxlist xt_idxlist_unpack(void *buffer, int buffer_size, int *position, MPI_Comm comm)
Xt_int xt_idxlist_get_min_index(Xt_idxlist idxlist)
int xt_idxlist_get_index_at_position(Xt_idxlist idxlist, int position, Xt_int *index)
Xt_int xt_idxlist_get_max_index(Xt_idxlist idxlist)
void xt_idxlist_get_indices(Xt_idxlist idxlist, Xt_int *indices)
int xt_idxlist_get_position_of_index_off(Xt_idxlist idxlist, Xt_int index, int *position, int offset)
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)
void xt_idxlist_get_index_stripes(Xt_idxlist idxlist, struct Xt_stripe **stripes, int *num_stripes)
Xt_idxlist xt_idxlist_copy(Xt_idxlist idxlist)
void xt_idxlist_delete(Xt_idxlist idxlist)
Xt_idxlist xt_idxlist_collection_unpack(void *buffer, int buffer_size, int *position, MPI_Comm comm)
static void idxlist_collection_get_indices(Xt_idxlist idxlist, Xt_int *indices)
Xt_idxlist xt_idxlist_collection_get_intersection(Xt_idxlist XT_UNUSED(idxlist_src), Xt_idxlist XT_UNUSED(idxlist_dst))
static int idxlist_collection_get_position_of_index_off(Xt_idxlist idxlist, Xt_int index, int *position, int offset)
static int idxlist_collection_get_position_of_index(Xt_idxlist idxlist, Xt_int index, int *position)
static void idxlist_collection_delete(Xt_idxlist data)
struct Xt_idxlist_collection_ * Xt_idxlist_collection
static Xt_idxlist idxlist_collection_copy(Xt_idxlist idxlist)
static Xt_int idxlist_collection_get_max_index(Xt_idxlist idxlist)
static size_t idxlist_collection_get_pack_size(Xt_idxlist data, MPI_Comm comm)
static Xt_int idxlist_collection_get_min_index(Xt_idxlist idxlist)
static const struct xt_idxlist_vtable idxlist_collection_vtable
static int idxlist_collection_get_index_at_position(Xt_idxlist idxlist, int position, Xt_int *index)
static void idxlist_collection_get_index_stripes(Xt_idxlist idxlist, struct Xt_stripe **stripes, int *num_stripes)
static void idxlist_collection_pack(Xt_idxlist data, void *buffer, int buffer_size, int *position, MPI_Comm comm)
static const Xt_int * idxlist_collection_get_indices_const(Xt_idxlist idxlist)
Xt_idxlist xt_idxlist_collection_new(Xt_idxlist *idxlists, int num_idxlists)
Provide non-public declarations common to all index lists.
static void Xt_idxlist_init(Xt_idxlist idxlist, const struct xt_idxlist_vtable *vtable, int num_indices)
#define xt_mpi_call(call, comm)
size_t xt_stripes_merge_copy(size_t num_stripes, struct Xt_stripe *stripes_dst, const struct Xt_stripe *stripes_src, bool lookback)