73 stripes, num_stripes);
78 const Xt_int indices[num_indices])
80 size_t num_temp_stripes = 0;
81 if (num_indices > 0) {
84 while(i < (
size_t)num_indices) {
88 Xt_int stride = 1, stripe_base_index = indices[i];
89 if (i + j < (
size_t)num_indices) {
90 stride = (
Xt_int)(indices[i + 1] - stripe_base_index);
93 }
while ((i + j) < (
size_t)num_indices
94 && stripe_base_index + (
Xt_int)j * stride == indices[i + j]);
96 j-= ((i + j + 1 < (size_t)num_indices)
97 && ((indices[i + j - 1] == indices[i + j] - 1)
98 & (indices[i + j] == indices[i + j + 1] - 1)));
102 return num_temp_stripes;
111 INSTR_DEF(instr,
"xt_idxstripes_convert_to_stripes")
114 size_t num_indices_ = (size_t)(num_indices > 0 ? num_indices : 0);
117 = *stripes =
xrealloc(*stripes, num_stripes_alloc *
sizeof(**stripes));
120 num_stripes_alloc, temp_stripes);
121 *num_stripes = (int)num_stripes_;
127 const Xt_int *restrict indices,
128 size_t num_stripes_alloc,
131 (void)num_stripes_alloc;
132 size_t num_stripes = 0;
133 if (num_indices > 0) {
136 while(i < num_indices) {
140 if (i + j < num_indices) {
144 }
while ((i + j) < num_indices
147 j-= ((i + j + 1 < num_indices)
148 && ((indices[i + j - 1] == indices[i + j] - 1)
149 & (indices[i + j] == indices[i + j + 1] - 1)));
151 stripes[num_stripes++]
153 .nstrides = (int)j };
158 assert(num_stripes <= num_stripes_alloc);
172 prev_stride = stripes_dst[-1].
stride,
173 start = stripes_src[0].
start,
174 prev_start = stripes_dst[-1].
start;
175 if (stride == prev_stride
176 && start == prev_start + stride * (
Xt_int)stripes_dst[-1].nstrides) {
183 stripes_dst[0] = stripes_src[0];
186 for (
size_t i = 1; i < num_stripes; ++i) {
188 prev_stride = stripes_dst[i-skip].
stride,
189 start = stripes_src[i].
start,
190 prev_start = stripes_dst[i-skip].
start;
191 if (stride == prev_stride
192 && start == prev_start + stride * (
Xt_int)stripes_dst[i-skip].nstrides) {
197 stripes_dst[i-skip+1] = stripes_src[i];
200 return num_stripes - (skip - 1);
206 int ntrans_up=0, ntrans_dn=0;
208 if (num_stripes > 0) {
211 int nstrides = stripes[0].nstrides;
212 Xt_int stride = stripes[0].stride;
213 prev_end = (
Xt_int)(stripes[0].start
214 + stride * (nstrides-1));
215 ntrans_up += ((nstrides - 1) & ~((stride > 0)-1));
216 ntrans_dn += ((nstrides - 1) & ~((stride < 0)-1));
219 for (
size_t i = 1; i < num_stripes; ++i) {
220 int nstrides = stripes[i].nstrides;
221 Xt_int start = stripes[i].start, stride = stripes[i].stride;
223 ntrans_up += (start > prev_end) + ((nstrides - 1) & ~((stride > 0)-1));
224 ntrans_dn += (start < prev_end) + ((nstrides - 1) & ~((stride < 0)-1));
225 prev_end = (
Xt_int)(start + stride * (nstrides-1));
228 return (
struct Xt_stripe_summary){
234#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
238 const struct Xt_stripe stripes[num_stripes],
241 bool contains_duplicate =
false;
246 size_t_bits =
sizeof (size_t) * CHAR_BIT,
248 size_t bm_size = ((size_t)
MIN(block_max, index_range.
max - ofs + 1)
249 + size_t_bits - 1 ) / size_t_bits;
250 size_t *occupancy_bm =
xcalloc(bm_size,
sizeof (
size_t));
256 ofs, (
Xt_int)(ofs + current_range_size - 1)
258 for (
size_t i = 0; i < num_stripes; ++i) {
260 if (stripe_i.
stride < 0) {
264 }
else if (stripe_i.
stride == 0) {
275 if (stripe_range.
max >= blk_range.
min
276 && stripe_range.
min <= blk_range.
max)
283 index <= blk_range.
max && fstep < stripe_i.
nstrides;
286 size_t mask = (size_t)1 << ((
size_t)(index - ofs)%size_t_bits),
287 mask_ofs = (size_t)(index - ofs)/size_t_bits;
288 dup |= mask & occupancy_bm[mask_ofs];
289 occupancy_bm[mask_ofs] |= mask;
294 if (dup || remaining >= (
Xt_uint)block_max)
296 ofs = (
Xt_int)(ofs + block_max);
297 memset(occupancy_bm, 0, bm_size *
sizeof (
size_t));
300 contains_duplicate = dup;
302 return contains_duplicate;
add versions of standard API functions not returning on error
#define xrealloc(ptr, size)
#define xcalloc(nmemb, size)
static Xt_int Xt_doz(Xt_int a, Xt_int b)
base definitions header file
size_t xt_indices_count_stripes(size_t num_indices, const Xt_int indices[num_indices])
struct Xt_stripe_summary xt_summarize_stripes(size_t num_stripes, const struct Xt_stripe stripes[num_stripes])
size_t xt_stripes_merge_copy(size_t num_stripes, struct Xt_stripe *stripes_dst, const struct Xt_stripe *stripes_src, bool lookback)
bool xt_stripes_detect_duplicate(size_t num_stripes, const struct Xt_stripe stripes[num_stripes], struct Xt_minmax index_range)
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)
void xt_convert_indices_to_stripes(const Xt_int *restrict indices, int num_indices, struct Xt_stripe **stripes, int *num_stripes)
void xt_convert_indices_to_stripes_keep_buf(const Xt_int *restrict indices, int num_indices, struct Xt_stripe **stripes, int *num_stripes)
#define XT_SORT_FLAGS(ntrans_up, ntrans_dn)