122 void real_merge (_RandomAccessIter in, _RandomAccessIter out,
123 _Distance *disps,
int nproc, _Compare comp) {
126 copy (in, in + disps[nproc], out);
130 _RandomAccessIter bufs[2] = { in, out };
131 _Distance *locs =
new _Distance[nproc];
132 for (
int i = 0; i < nproc; ++i) {
138 _Distance stride = next * 2;
142 for (_Distance i = 0; i + next < nproc; i += stride) {
143 _Distance end_ind = min (i + stride, (_Distance) nproc);
145 std::merge (bufs[locs[i]] + disps[i],
146 bufs[locs[i]] + disps[i + next],
147 bufs[locs[i + next]] + disps[i + next],
148 bufs[locs[i + next]] + disps[end_ind],
149 bufs[1 - locs[i]] + disps[i],
151 locs[i] = 1 - locs[i];
160 std::merge (in, in + disps[next],
161 bufs[locs[next]] + disps[next],
162 bufs[locs[next]] + disps[nproc],
164 }
else if (locs[next] == 0) {
166 std::merge (std::reverse_iterator<_RandomAccessIter> (in + disps[nproc]),
167 std::reverse_iterator<_RandomAccessIter> (in + disps[next]),
168 std::reverse_iterator<_RandomAccessIter> (out + disps[next]),
169 std::reverse_iterator<_RandomAccessIter> (out),
170 std::reverse_iterator<_RandomAccessIter> (out + disps[nproc]),
174 std::inplace_merge (out, out + disps[next], out + disps[nproc], comp);