48#define XT_TOKEN_PASTE2_(a,b) a##b
50# ifdef XT_IDXSECTION_STRIPES_ISECT_SINGLE_MATCH_ONLY
51# define xt_idxsection_get_idxstripes_intersection__(ndims) \
52 XT_TOKEN_PASTE2_(xt_idxsection_get_idxstripes_intersection_sm_, ndims)
54# define xt_idxsection_get_idxstripes_intersection__(ndims) \
55 XT_TOKEN_PASTE2_(xt_idxsection_get_idxstripes_intersection_, ndims)
57# define NUM_DIMENSIONS_ NUM_DIMENSIONS
59# ifdef XT_IDXSECTION_STRIPES_ISECT_SINGLE_MATCH_ONLY
60# define xt_idxsection_get_idxstripes_intersection__(ndims) \
61 xt_idxsection_get_idxstripes_intersection_sm_
63# define xt_idxsection_get_idxstripes_intersection__(ndims) \
64 xt_idxsection_get_idxstripes_intersection_
66# define NUM_DIMENSIONS_ num_dimensions
79#define Xt_idxsection__(ndims) XT_TOKEN_PASTE2_(Xt_idxsection_,ndims)
80 struct Xt_idxsection__(NUM_DIMENSIONS) {
94 struct Xt_idxsection__(NUM_DIMENSIONS) h;
96 struct dim_desc *restrict dims = h.dims;
98 size_t num_dimensions = (size_t)idxsection->ndim;
100 =
xmalloc(
sizeof (
struct Xt_idxsection_)
101 +
sizeof (
struct dim_desc) * num_dimensions);
103 struct dim_desc *dims = sssp->
dims;
106 size_t_bits =
sizeof (size_t) * CHAR_BIT,
108#ifndef XT_IDXSECTION_STRIPES_ISECT_SINGLE_MATCH_ONLY
109size_t *restrict isect_stripes_bm
110 =
xcalloc((num_stripes+size_t_bits-1)/size_t_bits,
sizeof (
size_t));
112size_t num_indices_in_section
114 section_bm_size = (num_indices_in_section+size_t_bits-1)/size_t_bits,
115 *restrict pos_used_bm =
xcalloc(section_bm_size
116 + (num_stripes+size_t_bits-1)/size_t_bits,
118 *restrict isect_stripes_bm = pos_used_bm + section_bm_size;
120size_t num_result_stripes_total = 0;
122#define XT_IDXSECTION_STRIPES_ISECT_CREATE_STRIPE_MASK
125 int buf_nstrides = 0;
128 size_t isect_mask = 0;
130 if (num_stripes % size_t_bits)
131 isect_stripes_bm[num_stripes/size_t_bits] = isect_mask;
132#undef XT_IDXSECTION_STRIPES_ISECT_CREATE_STRIPE_MASK
135if (num_result_stripes_total) {
136#ifdef XT_IDXSECTION_STRIPES_ISECT_SINGLE_MATCH_ONLY
137 memset(pos_used_bm, 0, (num_indices_in_section+size_t_bits-1)/size_t_bits *
140 struct Xt_stripes_alloc result_alloc
142 struct Xt_stripe *restrict result_stripes = result_alloc.
stripes;
143 size_t num_result_stripes = (size_t)-1;
145 int buf_nstrides = 0;
148 result_stripes[num_result_stripes].stride = buf_stride;
149 result_stripes[num_result_stripes].nstrides = buf_nstrides;
150 assert(num_result_stripes_total == num_result_stripes+1);
154 result = initial_result;
161#undef NUM_DIMENSIONS_
162#ifndef NUM_DIMENSIONS
165#ifdef XT_IDXSECTION_STRIPES_ISECT_SINGLE_MATCH_ONLY
168free(isect_stripes_bm);
172#undef xt_idxsection_get_idxstripes_intersection__
174#undef Xt_idxsection__
176#undef XT_TOKEN_PASTE2_
#define xcalloc(nmemb, size)
struct Xt_stripe * stripes
struct Xt_config_ * Xt_config
#define XT_CONFIG_GET_FORCE_NOSORT(config)
struct Xt_idxlist_ * Xt_idxlist
static size_t parent(size_t i)
Xt_idxlist xt_idxempty_new(void)
Xt_idxlist xt_idxlist_sorted_copy(Xt_idxlist idxlist)
int xt_idxlist_get_sorting(Xt_idxlist idxlist)
void xt_idxlist_delete(Xt_idxlist idxlist)
#define xt_idxlist_get_num_indices(idxlist)
static void idxsection_init_sorted_copy(Xt_idxsection orig, Xt_idxsection copy)
struct Xt_idxsection_ * Xt_idxsection
#define xt_idxsection_get_idxstripes_intersection__(ndims)
Loop over stripes to compute intersection. This source is meant to be included for multiple dimension...
const struct Xt_stripe * xt_idxstripes_get_index_stripes_const(Xt_idxlist idxlist)
struct Xt_stripes_alloc xt_idxstripes_alloc(size_t num_stripes)
Xt_idxlist xt_idxstripes_congeal(struct Xt_stripes_alloc stripes_alloc)
size_t xt_idxstripes_get_num_index_stripes(Xt_idxlist idxlist)