60 ,
struct Xt_stripe *restrict result_stripes
64 size_t num_result_stripes = 0;
65 size_t stripes_src_ofs = 0, pos = 0;
69 const struct Xt_stripe *src_stripes = idxstripes_src->stripes;
70 for (
size_t i = 0; i < num_ext; ++i) {
71 size_t start_pos = (size_t)pos_exts[i].
start;
72 int size = pos_exts[i].size;
73 if (start_pos < pos) {
76 pos -= (size_t)src_stripes[stripes_src_ofs].
nstrides;
77 }
while (start_pos < pos);
79 while (start_pos >= pos + (
size_t)src_stripes[stripes_src_ofs].
nstrides) {
80 pos += (size_t)src_stripes[stripes_src_ofs].
nstrides;
84 assert(stripes_src_ofs < (
size_t)idxstripes_src->num_stripes);
88 struct Xt_stripe overlapping_stripe = src_stripes[stripes_src_ofs];
89 size_t remaining_nstrides
90 = pos + (size_t)overlapping_stripe.
nstrides - start_pos;
91 int intersection_size =
MIN((
int)remaining_nstrides, size);
93 intersection_stripe_start = (
Xt_int)(
94 overlapping_stripe.
start +
96 * intersection_stride);
97 if ((intersection_stride == result_stripe.
stride
98 || intersection_size == 1)
99 && intersection_stripe_start == result_stripe_next) {
100 result_stripe.
nstrides += intersection_size;
101 intersection_stride = result_stripe.
stride;
102 }
else if (result_stripe.
nstrides == 1
103 && result_stripe.
start
104 == intersection_stripe_start - intersection_stride)
106 result_stripe.
nstrides += intersection_size;
107 result_stripe.
stride = intersection_stride;
108 }
else if (result_stripe.
nstrides == 1
109 && intersection_size == 1) {
110 result_stripe.
nstrides += intersection_size;
112 = intersection_stride
113 = (
Xt_int)(intersection_stripe_start - result_stripe.
start);
115#ifndef XT_IDXSTRIPES_POS_EXT_MAP_COUNT
116 if (num_result_stripes)
117 result_stripes[num_result_stripes-1] = result_stripe;
119 ++num_result_stripes;
121 .
start = intersection_stripe_start,
122 .stride = intersection_stride,
123 .nstrides = intersection_size };
125 result_stripe_next = (
Xt_int)(intersection_stripe_start
126 + intersection_stride * intersection_size);
127 if (size -= intersection_size) {
128 start_pos += (size_t)intersection_size;
129 pos += (size_t)overlapping_stripe.
nstrides;
131 goto build_incr_overlap;
135 struct Xt_stripe overlapping_stripe = src_stripes[stripes_src_ofs];
136 size_t remaining_nstrides
138 int intersection_size =
MIN((
int)remaining_nstrides, abs(size));
140 intersection_stripe_start = (
Xt_int)(
141 overlapping_stripe.
start +
142 (
Xt_int)remaining_nstrides * (-intersection_stride));
143 if ((intersection_stride == result_stripe.
stride
144 || intersection_size == 1)
145 && intersection_stripe_start == result_stripe_next) {
146 result_stripe.
nstrides += intersection_size;
147 intersection_stride = result_stripe.
stride;
148 }
else if (result_stripe.
nstrides == 1
149 && result_stripe.
start
150 == intersection_stripe_start - intersection_stride)
152 result_stripe.
nstrides += intersection_size;
153 result_stripe.
stride = intersection_stride;
154 }
else if (result_stripe.
nstrides == 1
155 && intersection_size == 1) {
156 result_stripe.
nstrides += intersection_size;
158 = intersection_stride
159 = (
Xt_int)(intersection_stripe_start - result_stripe.
start);
161#ifndef XT_IDXSTRIPES_POS_EXT_MAP_COUNT
162 if (num_result_stripes)
163 result_stripes[num_result_stripes-1] = result_stripe;
165 ++num_result_stripes;
167 .
start = intersection_stripe_start,
168 .stride = intersection_stride,
169 .nstrides = intersection_size };
171 result_stripe_next = (
Xt_int)(intersection_stripe_start
172 + intersection_stride * intersection_size);
173 if (size += intersection_size) {
174 start_pos -= (size_t)intersection_size;
176 pos -= (size_t)src_stripes[stripes_src_ofs].nstrides;
177 goto build_decr_overlap;
181#ifdef XT_IDXSTRIPES_POS_EXT_MAP_COUNT
182 return num_result_stripes;
184 result_stripes[num_result_stripes-1] = result_stripe;