16 #ifndef STXXL_PQ_MERGERS_HEADER
17 #define STXXL_PQ_MERGERS_HEADER
19 __STXXL_BEGIN_NAMESPACE
27 namespace priority_queue_local
38 template <
class InputIterator,
class OutputIterator,
class Cmp_>
40 InputIterator & source0,
41 InputIterator & source1,
42 OutputIterator target,
46 OutputIterator done = target + length;
48 while (target != done)
50 if (cmp(*source0, *source1))
70 template <
class InputIterator,
class OutputIterator,
class Cmp_>
72 InputIterator & source0,
73 InputIterator & source1,
74 InputIterator & source2,
75 OutputIterator target,
79 OutputIterator done = target + length;
81 if (cmp(*source1, *source0)) {
82 if (cmp(*source2, *source1)) {
86 if (cmp(*source0, *source2)) {
94 if (cmp(*source2, *source1)) {
95 if (cmp(*source2, *source0)) {
106 #define Merge3Case(a, b, c) \
108 if (target == done) \
110 *target = *source ## a; \
113 if (cmp(*source ## b, *source ## a)) \
114 goto s ## a ## b ## c; \
115 if (cmp(*source ## c, *source ## a)) \
116 goto s ## b ## a ## c; \
117 goto s ## b ## c ## a;
138 template <
class InputIterator,
class OutputIterator,
class Cmp_>
139 void merge4_iterator(
140 InputIterator & source0,
141 InputIterator & source1,
142 InputIterator & source2,
143 InputIterator & source3,
144 OutputIterator target, unsigned_type length, Cmp_ cmp)
146 OutputIterator done = target + length;
148 #define StartMerge4(a, b, c, d) \
149 if ((!cmp(*source ## a, *source ## b)) && (!cmp(*source ## b, *source ## c)) && (!cmp(*source ## c, *source ## d))) \
150 goto s ## a ## b ## c ## d;
157 StartMerge4(0, 1, 2, 3);
158 StartMerge4(1, 2, 3, 0);
159 StartMerge4(2, 3, 0, 1);
160 StartMerge4(3, 0, 1, 2);
162 StartMerge4(0, 3, 1, 2);
163 StartMerge4(3, 1, 2, 0);
164 StartMerge4(1, 2, 0, 3);
165 StartMerge4(2, 0, 3, 1);
167 StartMerge4(0, 2, 3, 1);
168 StartMerge4(2, 3, 1, 0);
169 StartMerge4(3, 1, 0, 2);
170 StartMerge4(1, 0, 2, 3);
172 StartMerge4(2, 0, 1, 3);
173 StartMerge4(0, 1, 3, 2);
174 StartMerge4(1, 3, 2, 0);
175 StartMerge4(3, 2, 0, 1);
177 StartMerge4(3, 0, 2, 1);
178 StartMerge4(0, 2, 1, 3);
179 StartMerge4(2, 1, 3, 0);
180 StartMerge4(1, 3, 0, 2);
182 StartMerge4(1, 0, 3, 2);
183 StartMerge4(0, 3, 2, 1);
184 StartMerge4(3, 2, 1, 0);
185 StartMerge4(2, 1, 0, 3);
187 #define Merge4Case(a, b, c, d) \
188 s ## a ## b ## c ## d : \
189 if (target == done) \
191 *target = *source ## a; \
194 if (cmp(*source ## c, *source ## a)) \
196 if (cmp(*source ## b, *source ## a)) \
197 goto s ## a ## b ## c ## d; \
199 goto s ## b ## a ## c ## d; \
203 if (cmp(*source ## d, *source ## a)) \
204 goto s ## b ## c ## a ## d; \
206 goto s ## b ## c ## d ## a; \
209 Merge4Case(0, 1, 2, 3);
210 Merge4Case(1, 2, 3, 0);
211 Merge4Case(2, 3, 0, 1);
212 Merge4Case(3, 0, 1, 2);
214 Merge4Case(0, 3, 1, 2);
215 Merge4Case(3, 1, 2, 0);
216 Merge4Case(1, 2, 0, 3);
217 Merge4Case(2, 0, 3, 1);
219 Merge4Case(0, 2, 3, 1);
220 Merge4Case(2, 3, 1, 0);
221 Merge4Case(3, 1, 0, 2);
222 Merge4Case(1, 0, 2, 3);
224 Merge4Case(2, 0, 1, 3);
225 Merge4Case(0, 1, 3, 2);
226 Merge4Case(1, 3, 2, 0);
227 Merge4Case(3, 2, 0, 1);
229 Merge4Case(3, 0, 2, 1);
230 Merge4Case(0, 2, 1, 3);
231 Merge4Case(2, 1, 3, 0);
232 Merge4Case(1, 3, 0, 2);
234 Merge4Case(1, 0, 3, 2);
235 Merge4Case(0, 3, 2, 1);
236 Merge4Case(3, 2, 1, 0);
237 Merge4Case(2, 1, 0, 3);
246 __STXXL_END_NAMESPACE
248 #endif // !STXXL_PQ_MERGERS_HEADER