struct maple_node *dst, *src;
unsigned char s, d;
unsigned char dst_offset;
- unsigned char data, data_offset;
+ unsigned char data_offset;
unsigned char src_end, s_offset;
- unsigned char split, next_node, size;
+ unsigned char split;
unsigned long s_max, d_max;
+ unsigned char dst_size;
enum maple_type s_mt, d_mt;
+ data_offset = 0;
s = d = 0;
/* Readability help */
src = cp->src[s].node;
s_max = cp->src[s].max;
s_mt = cp->src[s].mt;
d_mt = cp->dst[d].mt;
- data = cp->data;
-
- dst_offset = 0;
- data_offset = 0;
- next_node = split;
- /*
- * size (and split, and next_node will be 1 indexed while
- * src start/end dst start/end are 0 indexed
- */
+ dst_size = split + 1;
do {
- do {
- size = next_node - data_offset + 1;
- /* Fill the destination */
- if (src_end - s_offset + 1 < size)
- size = src_end - s_offset + 1;
+ dst_offset = 0;
+ d_max = 0;
+ dst = cp->dst[d].node;
+ d_mt = cp->dst[d].mt;
+ dst_size = split;
+
+ while (dst_size) {
+ unsigned char size;
- if (split - dst_offset + 1 < size)
- size = split - dst_offset + 1;
+ if (src_end - s_offset + 1 < dst_size)
+ size = src_end - s_offset + 1;
+ else
+ size = dst_size;
d_max = node_copy(mas, src, s_offset, size, s_max, s_mt,
dst, dst_offset, d_mt);
- data_offset += size;
+
dst_offset += size;
s_offset += size;
-
if (s_offset > src_end) {
/* This source is exhausted */
s++;
node_finalise(dst, d_mt, dst_offset);
return;
}
- d_max = s_max;
/* Reset local src */
src = cp->src[s].node;
s_offset = cp->src[s].start;
s_max = cp->src[s].max;
s_mt = cp->src[s].mt;
}
- } while (data_offset <= next_node);
- next_node *= 2;
- if (next_node > data + 1)
- next_node = data + 1;
+ dst_size -= size;
+ data_offset += size;
+ }
split = cp->split;
cp->dst[d].max = d_max;
s_offset--;
}
/* Set dst max and clear pivot */
- next_node++;
split++;
data_offset--;
dst_offset--;
cp->dst[d].max = ma_pivots(dst, d_mt)[dst_offset - 1];
}
+
node_finalise(dst, d_mt, dst_offset);
if (d >= cp->d_count) {
- WARN_ON(data_offset < data);
+ WARN_ON(data_offset < cp->data);
return;
}
- /* Reset local dst */
+
+ /* Next dst */
++d;
- dst = cp->dst[d].node;
- d_mt = cp->dst[d].mt;
- dst_offset = 0;
- } while (data_offset <= data);
+ } while (data_offset <= cp->data);
}