Chris@16
|
1 // Copyright 2005 Daniel Wallin.
|
Chris@16
|
2 // Copyright 2005 Joel de Guzman.
|
Chris@16
|
3 // Copyright 2005 Dan Marsden.
|
Chris@16
|
4 //
|
Chris@16
|
5 // Use, modification and distribution is subject to the Boost Software
|
Chris@16
|
6 // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
7 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
8 //
|
Chris@16
|
9 // Modeled after range_ex, Copyright 2004 Eric Niebler
|
Chris@16
|
10
|
Chris@16
|
11 #ifndef BOOST_PHOENIX_ALGORITHM_TRANSFORMATION_HPP
|
Chris@16
|
12 #define BOOST_PHOENIX_ALGORITHM_TRANSFORMATION_HPP
|
Chris@16
|
13
|
Chris@16
|
14 #include <algorithm>
|
Chris@16
|
15 #include <numeric>
|
Chris@16
|
16
|
Chris@16
|
17 #include <boost/phoenix/core/limits.hpp>
|
Chris@16
|
18 #include <boost/phoenix/stl/algorithm/detail/has_sort.hpp>
|
Chris@16
|
19 #include <boost/phoenix/stl/algorithm/detail/has_remove.hpp>
|
Chris@16
|
20 #include <boost/phoenix/stl/algorithm/detail/has_remove_if.hpp>
|
Chris@16
|
21 #include <boost/phoenix/stl/algorithm/detail/has_unique.hpp>
|
Chris@16
|
22 #include <boost/phoenix/stl/algorithm/detail/has_reverse.hpp>
|
Chris@16
|
23 #include <boost/phoenix/stl/algorithm/detail/has_sort.hpp>
|
Chris@16
|
24
|
Chris@16
|
25 #include <boost/phoenix/stl/algorithm/detail/begin.hpp>
|
Chris@16
|
26 #include <boost/phoenix/stl/algorithm/detail/end.hpp>
|
Chris@16
|
27 #include <boost/phoenix/stl/algorithm/detail/decay_array.hpp>
|
Chris@16
|
28
|
Chris@16
|
29 #include <boost/phoenix/function/adapt_callable.hpp>
|
Chris@16
|
30
|
Chris@16
|
31 #include <boost/range/result_iterator.hpp>
|
Chris@16
|
32 #include <boost/range/difference_type.hpp>
|
Chris@16
|
33
|
Chris@16
|
34 #include <boost/mpl/if.hpp>
|
Chris@16
|
35
|
Chris@16
|
36 #include <boost/type_traits/is_void.hpp>
|
Chris@16
|
37
|
Chris@16
|
38 namespace boost { namespace phoenix { namespace impl
|
Chris@16
|
39 {
|
Chris@16
|
40 struct swap
|
Chris@16
|
41 {
|
Chris@16
|
42 typedef void result_type;
|
Chris@16
|
43
|
Chris@16
|
44 template <class A, class B>
|
Chris@16
|
45 void operator()(A& a, B& b) const
|
Chris@16
|
46 {
|
Chris@16
|
47 using std::swap;
|
Chris@16
|
48 swap(a, b);
|
Chris@16
|
49 }
|
Chris@16
|
50 };
|
Chris@16
|
51
|
Chris@16
|
52 struct copy
|
Chris@16
|
53 {
|
Chris@16
|
54 template <typename Sig>
|
Chris@16
|
55 struct result;
|
Chris@16
|
56
|
Chris@16
|
57 template<typename This, class R, class I>
|
Chris@16
|
58 struct result<This(R&, I)>
|
Chris@16
|
59 : detail::decay_array<I>
|
Chris@16
|
60 {};
|
Chris@16
|
61
|
Chris@16
|
62 template<class R, class I>
|
Chris@16
|
63 typename detail::decay_array<I>::type
|
Chris@16
|
64 operator()(R& r, I i) const
|
Chris@16
|
65 {
|
Chris@16
|
66 return std::copy(detail::begin_(r), detail::end_(r), i);
|
Chris@16
|
67 }
|
Chris@16
|
68 };
|
Chris@16
|
69
|
Chris@16
|
70 struct copy_backward
|
Chris@16
|
71 {
|
Chris@16
|
72 template <typename Sig>
|
Chris@16
|
73 struct result;
|
Chris@16
|
74
|
Chris@16
|
75 template<typename This, class R, class I>
|
Chris@16
|
76 struct result<This(R&, I)>
|
Chris@16
|
77 : result<This(R&, I const &)>
|
Chris@16
|
78 {};
|
Chris@16
|
79
|
Chris@16
|
80 template<typename This, class R, class I>
|
Chris@16
|
81 struct result<This(R&, I &)>
|
Chris@16
|
82 {
|
Chris@16
|
83 typedef I type;
|
Chris@16
|
84 };
|
Chris@16
|
85
|
Chris@16
|
86 template<class R, class I>
|
Chris@16
|
87 I operator()(R& r, I & i) const
|
Chris@16
|
88 {
|
Chris@16
|
89 return std::copy_backward(detail::begin_(r), detail::end_(r), i);
|
Chris@16
|
90 }
|
Chris@16
|
91
|
Chris@16
|
92 template<class R, class I>
|
Chris@16
|
93 I const operator()(R& r, I const & i) const
|
Chris@16
|
94 {
|
Chris@16
|
95 return std::copy_backward(detail::begin_(r), detail::end_(r), i);
|
Chris@16
|
96 }
|
Chris@16
|
97 };
|
Chris@16
|
98
|
Chris@16
|
99 struct transform
|
Chris@16
|
100 {
|
Chris@16
|
101 template <typename Sig>
|
Chris@16
|
102 struct result;
|
Chris@16
|
103
|
Chris@16
|
104 template<typename This, class R, class OutorI1, class ForOut>
|
Chris@16
|
105 struct result<This(R&, OutorI1, ForOut)>
|
Chris@16
|
106 : detail::decay_array<OutorI1>
|
Chris@16
|
107 {
|
Chris@16
|
108 };
|
Chris@16
|
109
|
Chris@16
|
110 template<typename This, class R, class OutorI1, class ForOut, class BinF>
|
Chris@16
|
111 struct result<This(R&, OutorI1, ForOut, BinF)>
|
Chris@16
|
112 : detail::decay_array<ForOut>
|
Chris@16
|
113 {
|
Chris@16
|
114 };
|
Chris@16
|
115
|
Chris@16
|
116 template<class R, class O, class F>
|
Chris@16
|
117 typename result<transform(R&,O,F)>::type
|
Chris@16
|
118 operator()(R& r, O o, F f) const
|
Chris@16
|
119 {
|
Chris@16
|
120 return std::transform(detail::begin_(r), detail::end_(r), o, f);
|
Chris@16
|
121 }
|
Chris@16
|
122
|
Chris@16
|
123 template<class R, class I, class O, class F>
|
Chris@16
|
124 typename result<transform(R&,I,O,F)>::type
|
Chris@16
|
125 operator()(R& r, I i, O o, F f) const
|
Chris@16
|
126 {
|
Chris@16
|
127 return std::transform(detail::begin_(r), detail::end_(r), i, o, f);
|
Chris@16
|
128 }
|
Chris@16
|
129 };
|
Chris@16
|
130
|
Chris@16
|
131 struct replace
|
Chris@16
|
132 {
|
Chris@16
|
133 typedef void result_type;
|
Chris@16
|
134
|
Chris@16
|
135 template<class R, class T>
|
Chris@16
|
136 void operator()(R& r, T const& what, T const& with) const
|
Chris@16
|
137 {
|
Chris@16
|
138 std::replace(detail::begin_(r), detail::end_(r), what, with);
|
Chris@16
|
139 }
|
Chris@16
|
140 };
|
Chris@16
|
141
|
Chris@16
|
142 struct replace_if
|
Chris@16
|
143 {
|
Chris@16
|
144 typedef void result_type;
|
Chris@16
|
145
|
Chris@16
|
146 template<class R, class P, class T>
|
Chris@16
|
147 void operator()(R& r, P p, T const& with) const
|
Chris@16
|
148 {
|
Chris@16
|
149 std::replace_if(detail::begin_(r), detail::end_(r), p, with);
|
Chris@16
|
150 }
|
Chris@16
|
151 };
|
Chris@16
|
152
|
Chris@16
|
153 struct replace_copy
|
Chris@16
|
154 {
|
Chris@16
|
155 template <typename Sig>
|
Chris@16
|
156 struct result;
|
Chris@16
|
157
|
Chris@16
|
158 template<typename This, class R, class O, class T, class T2>
|
Chris@16
|
159 struct result<This(R&, O, T const&, T2 const&)>
|
Chris@16
|
160 : detail::decay_array<O>
|
Chris@16
|
161 {};
|
Chris@16
|
162
|
Chris@16
|
163 template<class R, class O, class T>
|
Chris@16
|
164 typename detail::decay_array<O>::type
|
Chris@16
|
165 operator()(R& r, O o, T const& what, T const& with) const
|
Chris@16
|
166 {
|
Chris@16
|
167 return std::replace_copy(detail::begin_(r), detail::end_(r), o, what, with);
|
Chris@16
|
168 }
|
Chris@16
|
169 };
|
Chris@16
|
170
|
Chris@16
|
171 struct replace_copy_if
|
Chris@16
|
172 {
|
Chris@16
|
173 template <typename Sig>
|
Chris@16
|
174 struct result;
|
Chris@16
|
175
|
Chris@16
|
176 template<typename This, class R, class O, class P, class T>
|
Chris@16
|
177 struct result<This(R&, O, P, T const&)>
|
Chris@16
|
178 : detail::decay_array<O>
|
Chris@16
|
179 {};
|
Chris@16
|
180
|
Chris@16
|
181 template<class R, class O, class P, class T>
|
Chris@16
|
182 typename detail::decay_array<O>::type
|
Chris@16
|
183 operator()(R& r, O o, P p, T const& with) const
|
Chris@16
|
184 {
|
Chris@16
|
185 return std::replace_copy_if(detail::begin_(r), detail::end_(r), o, p, with);
|
Chris@16
|
186 }
|
Chris@16
|
187 };
|
Chris@16
|
188
|
Chris@16
|
189 struct fill
|
Chris@16
|
190 {
|
Chris@16
|
191 typedef void result_type;
|
Chris@16
|
192
|
Chris@16
|
193 template<class R, class T>
|
Chris@16
|
194 void operator()(R& r, T const& x) const
|
Chris@16
|
195 {
|
Chris@16
|
196 std::fill(detail::begin_(r), detail::end_(r), x);
|
Chris@16
|
197 }
|
Chris@16
|
198 };
|
Chris@16
|
199
|
Chris@16
|
200 struct fill_n
|
Chris@16
|
201 {
|
Chris@16
|
202 typedef void result_type;
|
Chris@16
|
203
|
Chris@16
|
204 template<class R, class N, class T>
|
Chris@16
|
205 void operator()(R& r, N n, T const& x) const
|
Chris@16
|
206 {
|
Chris@16
|
207 std::fill_n(detail::begin_(r), n, x);
|
Chris@16
|
208 }
|
Chris@16
|
209 };
|
Chris@16
|
210
|
Chris@16
|
211 struct generate
|
Chris@16
|
212 {
|
Chris@16
|
213 typedef void result_type;
|
Chris@16
|
214
|
Chris@16
|
215 template<class R, class G>
|
Chris@16
|
216 void operator()(R& r, G const & g) const
|
Chris@16
|
217 {
|
Chris@16
|
218 std::generate(detail::begin_(r), detail::end_(r), g);
|
Chris@16
|
219 }
|
Chris@16
|
220 };
|
Chris@16
|
221
|
Chris@16
|
222 struct generate_n
|
Chris@16
|
223 {
|
Chris@16
|
224 typedef void result_type;
|
Chris@16
|
225
|
Chris@16
|
226 template<class R, class N, class G>
|
Chris@16
|
227 void operator()(R& r, N n, G g) const
|
Chris@16
|
228 {
|
Chris@16
|
229 std::generate_n(detail::begin_(r), n, g);
|
Chris@16
|
230 }
|
Chris@16
|
231 };
|
Chris@16
|
232
|
Chris@16
|
233 struct remove
|
Chris@16
|
234 {
|
Chris@16
|
235 template <typename Sig>
|
Chris@16
|
236 struct result;
|
Chris@16
|
237
|
Chris@16
|
238 template<typename This, class R, class T>
|
Chris@16
|
239 struct result<This(R&, T const&)>
|
Chris@16
|
240 : range_result_iterator<R>
|
Chris@16
|
241 {
|
Chris@16
|
242 };
|
Chris@16
|
243
|
Chris@16
|
244 template<class R, class T>
|
Chris@16
|
245 typename range_result_iterator<R>::type
|
Chris@16
|
246 execute(R& r, T const& x, mpl::true_) const
|
Chris@16
|
247 {
|
Chris@16
|
248 r.remove(x);
|
Chris@16
|
249 return detail::end_(r);
|
Chris@16
|
250 }
|
Chris@16
|
251
|
Chris@16
|
252 template<class R, class T>
|
Chris@16
|
253 typename range_result_iterator<R>::type
|
Chris@16
|
254 execute(R& r, T const& x, mpl::false_) const
|
Chris@16
|
255 {
|
Chris@16
|
256 return std::remove(detail::begin_(r), detail::end_(r), x);
|
Chris@16
|
257 }
|
Chris@16
|
258
|
Chris@16
|
259 template<class R, class T>
|
Chris@16
|
260 typename range_result_iterator<R>::type
|
Chris@16
|
261 operator()(R& r, T const& x) const
|
Chris@16
|
262 {
|
Chris@16
|
263 return execute(r, x, has_remove<R>());
|
Chris@16
|
264 }
|
Chris@16
|
265 };
|
Chris@16
|
266
|
Chris@16
|
267 struct remove_if
|
Chris@16
|
268 {
|
Chris@16
|
269 template <typename Sig>
|
Chris@16
|
270 struct result;
|
Chris@16
|
271
|
Chris@16
|
272 template <typename This, class R, class P>
|
Chris@16
|
273 struct result<This(R&,P)>
|
Chris@16
|
274 : range_result_iterator<R>
|
Chris@16
|
275 {
|
Chris@16
|
276 };
|
Chris@16
|
277
|
Chris@16
|
278 template<class R, class P>
|
Chris@16
|
279 typename range_result_iterator<R>::type
|
Chris@16
|
280 execute(R& r, P p, mpl::true_) const
|
Chris@16
|
281 {
|
Chris@16
|
282 r.remove_if(p);
|
Chris@16
|
283 return detail::end_(r);
|
Chris@16
|
284 }
|
Chris@16
|
285
|
Chris@16
|
286 template<class R, class P>
|
Chris@16
|
287 typename range_result_iterator<R>::type
|
Chris@16
|
288 execute(R& r, P p, mpl::false_) const
|
Chris@16
|
289 {
|
Chris@16
|
290 return std::remove_if(detail::begin_(r), detail::end_(r), p);
|
Chris@16
|
291 }
|
Chris@16
|
292
|
Chris@16
|
293 template<class R, class P>
|
Chris@16
|
294 typename range_result_iterator<R>::type
|
Chris@16
|
295 operator()(R& r, P p) const
|
Chris@16
|
296 {
|
Chris@16
|
297 return execute(r, p, has_remove_if<R>());
|
Chris@16
|
298 }
|
Chris@16
|
299 };
|
Chris@16
|
300
|
Chris@16
|
301 struct remove_copy
|
Chris@16
|
302 {
|
Chris@16
|
303 template <typename Sig>
|
Chris@16
|
304 struct result;
|
Chris@16
|
305
|
Chris@16
|
306 template<typename This, class R, class O, class T>
|
Chris@16
|
307 struct result<This(R&, O, T)>
|
Chris@16
|
308 : detail::decay_array<O>
|
Chris@16
|
309 {};
|
Chris@16
|
310
|
Chris@16
|
311 template<class R, class O, class T>
|
Chris@16
|
312 typename detail::decay_array<O>::type
|
Chris@16
|
313 operator()(R& r, O o, T const& x) const
|
Chris@16
|
314 {
|
Chris@16
|
315 return std::remove_copy(detail::begin_(r), detail::end_(r), o, x);
|
Chris@16
|
316 }
|
Chris@16
|
317 };
|
Chris@16
|
318
|
Chris@16
|
319 struct remove_copy_if
|
Chris@16
|
320 {
|
Chris@16
|
321 template <typename Sig>
|
Chris@16
|
322 struct result;
|
Chris@16
|
323
|
Chris@16
|
324 template<typename This, class R, class O, class P>
|
Chris@16
|
325 struct result<This(R&, O, P)>
|
Chris@16
|
326 : detail::decay_array<O>
|
Chris@16
|
327 {};
|
Chris@16
|
328
|
Chris@16
|
329 template<class R, class O, class P>
|
Chris@16
|
330 typename detail::decay_array<O>::type
|
Chris@16
|
331 operator()(R& r, O o, P p) const
|
Chris@16
|
332 {
|
Chris@16
|
333 return std::remove_copy_if(detail::begin_(r), detail::end_(r), o, p);
|
Chris@16
|
334 }
|
Chris@16
|
335 };
|
Chris@16
|
336
|
Chris@16
|
337 struct unique
|
Chris@16
|
338 {
|
Chris@16
|
339 template <typename Sig>
|
Chris@16
|
340 struct result;
|
Chris@16
|
341
|
Chris@16
|
342 template<typename This, class R>
|
Chris@16
|
343 struct result<This(R&)>
|
Chris@16
|
344 : range_result_iterator<R>
|
Chris@16
|
345 {};
|
Chris@16
|
346
|
Chris@16
|
347 template<typename This, class R, class P>
|
Chris@16
|
348 struct result<This(R&, P)>
|
Chris@16
|
349 : range_result_iterator<R>
|
Chris@16
|
350 {};
|
Chris@16
|
351
|
Chris@16
|
352 template<class R>
|
Chris@16
|
353 typename range_result_iterator<R>::type
|
Chris@16
|
354 execute(R& r, mpl::true_) const
|
Chris@16
|
355 {
|
Chris@16
|
356 r.unique();
|
Chris@16
|
357 return detail::end_(r);
|
Chris@16
|
358 }
|
Chris@16
|
359
|
Chris@16
|
360 template<class R>
|
Chris@16
|
361 typename range_result_iterator<R>::type
|
Chris@16
|
362 execute(R& r, mpl::false_) const
|
Chris@16
|
363 {
|
Chris@16
|
364 return std::unique(detail::begin_(r), detail::end_(r));
|
Chris@16
|
365 }
|
Chris@16
|
366
|
Chris@16
|
367 template<class R>
|
Chris@16
|
368 typename range_result_iterator<R>::type
|
Chris@16
|
369 operator()(R& r) const
|
Chris@16
|
370 {
|
Chris@16
|
371 return execute(r, has_unique<R>());
|
Chris@16
|
372 }
|
Chris@16
|
373
|
Chris@16
|
374
|
Chris@16
|
375 template<class R, class P>
|
Chris@16
|
376 typename range_result_iterator<R>::type
|
Chris@16
|
377 execute(R& r, P p, mpl::true_) const
|
Chris@16
|
378 {
|
Chris@16
|
379 r.unique(p);
|
Chris@16
|
380 return detail::end_(r);
|
Chris@16
|
381 }
|
Chris@16
|
382
|
Chris@16
|
383 template<class R, class P>
|
Chris@16
|
384 typename range_result_iterator<R>::type
|
Chris@16
|
385 execute(R& r, P p, mpl::false_) const
|
Chris@16
|
386 {
|
Chris@16
|
387 return std::unique(detail::begin_(r), detail::end_(r), p);
|
Chris@16
|
388 }
|
Chris@16
|
389
|
Chris@16
|
390 template<class R, class P>
|
Chris@16
|
391 typename range_result_iterator<R>::type
|
Chris@16
|
392 operator()(R& r, P p) const
|
Chris@16
|
393 {
|
Chris@16
|
394 return execute(r, p, has_unique<R>());
|
Chris@16
|
395 }
|
Chris@16
|
396 };
|
Chris@16
|
397
|
Chris@16
|
398 struct unique_copy
|
Chris@16
|
399 {
|
Chris@16
|
400 template <typename Sig>
|
Chris@16
|
401 struct result;
|
Chris@16
|
402
|
Chris@16
|
403 template<typename This, class R, class O>
|
Chris@16
|
404 struct result<This(R&, O)>
|
Chris@16
|
405 : detail::decay_array<O>
|
Chris@16
|
406 {};
|
Chris@16
|
407
|
Chris@16
|
408 template<typename This, class R, class O, class P>
|
Chris@16
|
409 struct result<This(R&, O, P)>
|
Chris@16
|
410 : detail::decay_array<O>
|
Chris@16
|
411 {};
|
Chris@16
|
412
|
Chris@16
|
413 template<class R, class O>
|
Chris@16
|
414 typename detail::decay_array<O>::type operator()(R& r, O o) const
|
Chris@16
|
415 {
|
Chris@16
|
416 return std::unique_copy(
|
Chris@16
|
417 detail::begin_(r)
|
Chris@16
|
418 , detail::end_(r)
|
Chris@16
|
419 , o
|
Chris@16
|
420 );
|
Chris@16
|
421 }
|
Chris@16
|
422
|
Chris@16
|
423 template<class R, class O, class P>
|
Chris@16
|
424 typename detail::decay_array<O>::type operator()(R& r, O o, P p) const
|
Chris@16
|
425 {
|
Chris@16
|
426 return std::unique_copy(
|
Chris@16
|
427 detail::begin_(r)
|
Chris@16
|
428 , detail::end_(r)
|
Chris@16
|
429 , o
|
Chris@16
|
430 , p
|
Chris@16
|
431 );
|
Chris@16
|
432 }
|
Chris@16
|
433 };
|
Chris@16
|
434
|
Chris@16
|
435 struct reverse
|
Chris@16
|
436 {
|
Chris@16
|
437 typedef void result_type;
|
Chris@16
|
438
|
Chris@16
|
439 template<class R>
|
Chris@16
|
440 void execute(R& r, mpl::true_) const
|
Chris@16
|
441 {
|
Chris@16
|
442 r.reverse();
|
Chris@16
|
443 }
|
Chris@16
|
444
|
Chris@16
|
445 template<class R>
|
Chris@16
|
446 void execute(R& r, mpl::false_) const
|
Chris@16
|
447 {
|
Chris@16
|
448 std::reverse(detail::begin_(r), detail::end_(r));
|
Chris@16
|
449 }
|
Chris@16
|
450
|
Chris@16
|
451 template<class R>
|
Chris@16
|
452 void operator()(R& r) const
|
Chris@16
|
453 {
|
Chris@16
|
454 execute(r, has_reverse<R>());
|
Chris@16
|
455 }
|
Chris@16
|
456 };
|
Chris@16
|
457
|
Chris@16
|
458 struct reverse_copy
|
Chris@16
|
459 {
|
Chris@16
|
460 template <typename Sig>
|
Chris@16
|
461 struct result;
|
Chris@16
|
462
|
Chris@16
|
463 template<typename This, class R, class O>
|
Chris@16
|
464 struct result<This(R&, O)>
|
Chris@16
|
465 : detail::decay_array<O>
|
Chris@16
|
466 {};
|
Chris@16
|
467
|
Chris@16
|
468 template<class R, class O>
|
Chris@16
|
469 typename detail::decay_array<O>::type operator()(R& r, O o) const
|
Chris@16
|
470 {
|
Chris@16
|
471 return std::reverse_copy(
|
Chris@16
|
472 detail::begin_(r)
|
Chris@16
|
473 , detail::end_(r)
|
Chris@16
|
474 , o
|
Chris@16
|
475 );
|
Chris@16
|
476 }
|
Chris@16
|
477 };
|
Chris@16
|
478
|
Chris@16
|
479 struct rotate
|
Chris@16
|
480 {
|
Chris@16
|
481 typedef void result_type;
|
Chris@16
|
482
|
Chris@16
|
483 template<class R, class M>
|
Chris@16
|
484 void operator()(R& r, M m) const
|
Chris@16
|
485 {
|
Chris@16
|
486 std::rotate(
|
Chris@16
|
487 detail::begin_(r)
|
Chris@16
|
488 , m
|
Chris@16
|
489 , detail::end_(r)
|
Chris@16
|
490 );
|
Chris@16
|
491 }
|
Chris@16
|
492 };
|
Chris@16
|
493
|
Chris@16
|
494 struct rotate_copy
|
Chris@16
|
495 {
|
Chris@16
|
496 template <typename Sig>
|
Chris@16
|
497 struct result;
|
Chris@16
|
498
|
Chris@16
|
499 template<typename This, class R, class M, class O>
|
Chris@16
|
500 struct result<This(R&, M, O)>
|
Chris@16
|
501 : detail::decay_array<O>
|
Chris@16
|
502 {};
|
Chris@16
|
503
|
Chris@16
|
504 template<class R, class M, class O>
|
Chris@16
|
505 typename detail::decay_array<O>::type operator()(R& r, M m, O o) const
|
Chris@16
|
506 {
|
Chris@16
|
507 return std::rotate_copy(
|
Chris@16
|
508 detail::begin_(r)
|
Chris@16
|
509 , m
|
Chris@16
|
510 , detail::end_(r)
|
Chris@16
|
511 , o
|
Chris@16
|
512 );
|
Chris@16
|
513 }
|
Chris@16
|
514 };
|
Chris@16
|
515
|
Chris@16
|
516 struct random_shuffle
|
Chris@16
|
517 {
|
Chris@16
|
518 typedef void result_type;
|
Chris@16
|
519
|
Chris@16
|
520 template<class R>
|
Chris@16
|
521 void operator()(R& r) const
|
Chris@16
|
522 {
|
Chris@16
|
523 return std::random_shuffle(detail::begin_(r), detail::end_(r));
|
Chris@16
|
524 }
|
Chris@16
|
525
|
Chris@16
|
526 template<class R, class G>
|
Chris@16
|
527 void operator()(R& r, G g) const
|
Chris@16
|
528 {
|
Chris@16
|
529 return std::random_shuffle(detail::begin_(r), detail::end_(r), g);
|
Chris@16
|
530 }
|
Chris@16
|
531 };
|
Chris@16
|
532
|
Chris@16
|
533 struct partition
|
Chris@16
|
534 {
|
Chris@16
|
535 template <typename Sig>
|
Chris@16
|
536 struct result;
|
Chris@16
|
537
|
Chris@16
|
538 template <typename This, class R, class P>
|
Chris@16
|
539 struct result<This(R&, P)>
|
Chris@16
|
540 : range_result_iterator<R>
|
Chris@16
|
541 {};
|
Chris@16
|
542
|
Chris@16
|
543 template<class R, class P>
|
Chris@16
|
544 typename range_result_iterator<R>::type
|
Chris@16
|
545 operator()(R& r, P p) const
|
Chris@16
|
546 {
|
Chris@16
|
547 return std::partition(detail::begin_(r), detail::end_(r), p);
|
Chris@16
|
548 }
|
Chris@16
|
549 };
|
Chris@16
|
550
|
Chris@16
|
551 struct stable_partition
|
Chris@16
|
552 {
|
Chris@16
|
553 template <typename Sig>
|
Chris@16
|
554 struct result;
|
Chris@16
|
555
|
Chris@16
|
556 template <typename This, class R, class P>
|
Chris@16
|
557 struct result<This(R&, P)>
|
Chris@16
|
558 : range_result_iterator<R>
|
Chris@16
|
559 {};
|
Chris@16
|
560
|
Chris@16
|
561 template<class R, class P>
|
Chris@16
|
562 typename range_result_iterator<R>::type
|
Chris@16
|
563 operator()(R& r, P p) const
|
Chris@16
|
564 {
|
Chris@16
|
565 return std::stable_partition(detail::begin_(r), detail::end_(r), p);
|
Chris@16
|
566 }
|
Chris@16
|
567 };
|
Chris@16
|
568
|
Chris@16
|
569 struct sort
|
Chris@16
|
570 {
|
Chris@16
|
571 typedef void result_type;
|
Chris@16
|
572
|
Chris@16
|
573 template<class R>
|
Chris@16
|
574 void execute(R& r, mpl::true_) const
|
Chris@16
|
575 {
|
Chris@16
|
576 r.sort();
|
Chris@16
|
577 }
|
Chris@16
|
578
|
Chris@16
|
579 template<class R>
|
Chris@16
|
580 void execute(R& r, mpl::false_) const
|
Chris@16
|
581 {
|
Chris@16
|
582 std::sort(detail::begin_(r), detail::end_(r));
|
Chris@16
|
583 }
|
Chris@16
|
584
|
Chris@16
|
585 template<class R>
|
Chris@16
|
586 void operator()(R& r) const
|
Chris@16
|
587 {
|
Chris@16
|
588 execute(r, has_sort<R>());
|
Chris@16
|
589 }
|
Chris@16
|
590
|
Chris@16
|
591 template<class R, class C>
|
Chris@16
|
592 void execute(R& r, C c, mpl::true_) const
|
Chris@16
|
593 {
|
Chris@16
|
594 r.sort(c);
|
Chris@16
|
595 }
|
Chris@16
|
596
|
Chris@16
|
597 template<class R, class C>
|
Chris@16
|
598 void execute(R& r, C c, mpl::false_) const
|
Chris@16
|
599 {
|
Chris@16
|
600 std::sort(detail::begin_(r), detail::end_(r), c);
|
Chris@16
|
601 }
|
Chris@16
|
602
|
Chris@16
|
603 template<class R, class C>
|
Chris@16
|
604 void operator()(R& r, C c) const
|
Chris@16
|
605 {
|
Chris@16
|
606 execute(r, c, has_sort<R>());
|
Chris@16
|
607 }
|
Chris@16
|
608 };
|
Chris@16
|
609
|
Chris@16
|
610 struct stable_sort
|
Chris@16
|
611 {
|
Chris@16
|
612 typedef void result_type;
|
Chris@16
|
613
|
Chris@16
|
614 template<class R>
|
Chris@16
|
615 void operator()(R& r) const
|
Chris@16
|
616 {
|
Chris@16
|
617 std::stable_sort(detail::begin_(r), detail::end_(r));
|
Chris@16
|
618 }
|
Chris@16
|
619
|
Chris@16
|
620 template<class R, class C>
|
Chris@16
|
621 void operator()(R& r, C c) const
|
Chris@16
|
622 {
|
Chris@16
|
623 std::stable_sort(detail::begin_(r), detail::end_(r), c);
|
Chris@16
|
624 }
|
Chris@16
|
625 };
|
Chris@16
|
626
|
Chris@16
|
627 struct partial_sort
|
Chris@16
|
628 {
|
Chris@16
|
629 typedef void result_type;
|
Chris@16
|
630
|
Chris@16
|
631 template<class R, class M>
|
Chris@16
|
632 void operator()(R& r, M m) const
|
Chris@16
|
633 {
|
Chris@16
|
634 std::partial_sort(detail::begin_(r), m, detail::end_(r));
|
Chris@16
|
635 }
|
Chris@16
|
636
|
Chris@16
|
637 template<class R, class M, class C>
|
Chris@16
|
638 void operator()(R& r, M m, C c) const
|
Chris@16
|
639 {
|
Chris@16
|
640 std::partial_sort(detail::begin_(r), m, detail::end_(r), c);
|
Chris@16
|
641 }
|
Chris@16
|
642 };
|
Chris@16
|
643
|
Chris@16
|
644 struct partial_sort_copy
|
Chris@16
|
645 {
|
Chris@16
|
646 template <typename Sig>
|
Chris@16
|
647 struct result;
|
Chris@16
|
648
|
Chris@16
|
649 template <typename This, class R1, class R2>
|
Chris@16
|
650 struct result<This(R1&, R2&)>
|
Chris@16
|
651 : range_result_iterator<R2>
|
Chris@16
|
652 {};
|
Chris@16
|
653
|
Chris@16
|
654 template <typename This, class R1, class R2, class C>
|
Chris@16
|
655 struct result<This(R1&, R2&, C)>
|
Chris@16
|
656 : range_result_iterator<R2>
|
Chris@16
|
657 {};
|
Chris@16
|
658
|
Chris@16
|
659 template <class R1, class R2>
|
Chris@16
|
660 typename range_result_iterator<R2>::type
|
Chris@16
|
661 operator()(R1& r1, R2& r2) const
|
Chris@16
|
662 {
|
Chris@16
|
663 return std::partial_sort_copy(
|
Chris@16
|
664 detail::begin_(r1), detail::end_(r1)
|
Chris@16
|
665 , detail::begin_(r2), detail::end_(r2)
|
Chris@16
|
666 );
|
Chris@16
|
667 }
|
Chris@16
|
668
|
Chris@16
|
669 template <class R1, class R2, class C>
|
Chris@16
|
670 typename range_result_iterator<R2>::type
|
Chris@16
|
671 operator()(R1& r1, R2& r2, C c) const
|
Chris@16
|
672 {
|
Chris@16
|
673 return std::partial_sort_copy(
|
Chris@16
|
674 detail::begin_(r1), detail::end_(r1)
|
Chris@16
|
675 , detail::begin_(r2), detail::end_(r2)
|
Chris@16
|
676 , c
|
Chris@16
|
677 );
|
Chris@16
|
678 }
|
Chris@16
|
679 };
|
Chris@16
|
680
|
Chris@16
|
681 struct nth_element
|
Chris@16
|
682 {
|
Chris@16
|
683 typedef void result_type;
|
Chris@16
|
684
|
Chris@16
|
685 template<class R, class N>
|
Chris@16
|
686 void operator()(R& r, N n) const
|
Chris@16
|
687 {
|
Chris@16
|
688 return std::nth_element(detail::begin_(r), n, detail::end_(r));
|
Chris@16
|
689 }
|
Chris@16
|
690
|
Chris@16
|
691 template<class R, class N, class C>
|
Chris@16
|
692 void operator()(R& r, N n, C c) const
|
Chris@16
|
693 {
|
Chris@16
|
694 return std::nth_element(detail::begin_(r), n, detail::end_(r), c);
|
Chris@16
|
695 }
|
Chris@16
|
696 };
|
Chris@16
|
697
|
Chris@16
|
698 struct merge
|
Chris@16
|
699 {
|
Chris@16
|
700 template <typename Sig>
|
Chris@16
|
701 struct result;
|
Chris@16
|
702
|
Chris@16
|
703 template<typename This, class R1, class R2, class O>
|
Chris@16
|
704 struct result<This(R1&, R2&, O)>
|
Chris@16
|
705 : detail::decay_array<O>
|
Chris@16
|
706 {};
|
Chris@16
|
707
|
Chris@16
|
708 template<typename This, class R1, class R2, class O, class C>
|
Chris@16
|
709 struct result<This(R1&, R2&, O, C)>
|
Chris@16
|
710 : detail::decay_array<O>
|
Chris@16
|
711 {};
|
Chris@16
|
712
|
Chris@16
|
713 template<class R1, class R2, class O>
|
Chris@16
|
714 typename detail::decay_array<O>::type operator()(R1& r1, R2& r2, O o) const
|
Chris@16
|
715 {
|
Chris@16
|
716 return std::merge(
|
Chris@16
|
717 detail::begin_(r1), detail::end_(r1)
|
Chris@16
|
718 , detail::begin_(r2), detail::end_(r2)
|
Chris@16
|
719 , o
|
Chris@16
|
720 );
|
Chris@16
|
721 }
|
Chris@16
|
722
|
Chris@16
|
723 template<class R1, class R2, class O, class C>
|
Chris@16
|
724 typename detail::decay_array<O>::type operator()(R1& r1, R2& r2, O o, C c) const
|
Chris@16
|
725 {
|
Chris@16
|
726 return std::merge(
|
Chris@16
|
727 detail::begin_(r1), detail::end_(r1)
|
Chris@16
|
728 , detail::begin_(r2), detail::end_(r2)
|
Chris@16
|
729 , o
|
Chris@16
|
730 , c
|
Chris@16
|
731 );
|
Chris@16
|
732 }
|
Chris@16
|
733 };
|
Chris@16
|
734
|
Chris@16
|
735 struct inplace_merge
|
Chris@16
|
736 {
|
Chris@16
|
737 typedef void result_type;
|
Chris@16
|
738
|
Chris@16
|
739 template<class R, class M>
|
Chris@16
|
740 void operator()(R& r, M m) const
|
Chris@16
|
741 {
|
Chris@16
|
742 return std::inplace_merge(detail::begin_(r), m, detail::end_(r));
|
Chris@16
|
743 }
|
Chris@16
|
744
|
Chris@16
|
745 template<class R, class M, class C>
|
Chris@16
|
746 void operator()(R& r, M m, C c) const
|
Chris@16
|
747 {
|
Chris@16
|
748 return std::inplace_merge(detail::begin_(r), m, detail::end_(r), c);
|
Chris@16
|
749 }
|
Chris@16
|
750 };
|
Chris@16
|
751
|
Chris@16
|
752 struct next_permutation
|
Chris@16
|
753 {
|
Chris@16
|
754 typedef bool result_type;
|
Chris@16
|
755
|
Chris@16
|
756 template<class R>
|
Chris@16
|
757 bool operator()(R& r) const
|
Chris@16
|
758 {
|
Chris@16
|
759 return std::next_permutation(detail::begin_(r), detail::end_(r));
|
Chris@16
|
760 }
|
Chris@16
|
761
|
Chris@16
|
762 template<class R, class C>
|
Chris@16
|
763 bool operator()(R& r, C c) const
|
Chris@16
|
764 {
|
Chris@16
|
765 return std::next_permutation(detail::begin_(r), detail::end_(r), c);
|
Chris@16
|
766 }
|
Chris@16
|
767 };
|
Chris@16
|
768
|
Chris@16
|
769 struct prev_permutation
|
Chris@16
|
770 {
|
Chris@16
|
771 typedef bool result_type;
|
Chris@16
|
772
|
Chris@16
|
773 template<class R>
|
Chris@16
|
774 bool operator()(R& r) const
|
Chris@16
|
775 {
|
Chris@16
|
776 return std::prev_permutation(detail::begin_(r), detail::end_(r));
|
Chris@16
|
777 }
|
Chris@16
|
778
|
Chris@16
|
779 template<class R, class C>
|
Chris@16
|
780 bool operator()(R& r, C c) const
|
Chris@16
|
781 {
|
Chris@16
|
782 return std::prev_permutation(detail::begin_(r), detail::end_(r), c);
|
Chris@16
|
783 }
|
Chris@16
|
784 };
|
Chris@16
|
785
|
Chris@16
|
786
|
Chris@16
|
787 struct inner_product
|
Chris@16
|
788 {
|
Chris@16
|
789 template <typename Sig>
|
Chris@16
|
790 struct result;
|
Chris@16
|
791
|
Chris@16
|
792 template <typename This, typename R, typename I, typename T>
|
Chris@16
|
793 struct result<This(R&, I, T)>
|
Chris@16
|
794 : result<This(R&, I const &, T)>
|
Chris@16
|
795 {};
|
Chris@16
|
796
|
Chris@16
|
797 template <typename This, typename R, typename I, typename T>
|
Chris@16
|
798 struct result<This(R&, I, T &)>
|
Chris@16
|
799 {
|
Chris@16
|
800 typedef T type;
|
Chris@16
|
801 };
|
Chris@16
|
802
|
Chris@16
|
803 template <typename This, typename R, typename I, typename T, typename C1, typename C2>
|
Chris@16
|
804 struct result<This(R&, I, T, C1, C2)>
|
Chris@16
|
805 : result<This(R&, I, T const &, C1, C2)>
|
Chris@16
|
806 {};
|
Chris@16
|
807
|
Chris@16
|
808 template <typename This, typename R, typename I, typename T, typename C1, typename C2>
|
Chris@16
|
809 struct result<This(R&, I, T &, C1, C2)>
|
Chris@16
|
810 {
|
Chris@16
|
811 typedef T type;
|
Chris@16
|
812 };
|
Chris@16
|
813
|
Chris@16
|
814 template <class R, class I, class T>
|
Chris@16
|
815 T
|
Chris@16
|
816 operator()(R& r, I i, T t) const
|
Chris@16
|
817 {
|
Chris@16
|
818 return std::inner_product(
|
Chris@16
|
819 detail::begin_(r), detail::end_(r), i, t);
|
Chris@16
|
820 }
|
Chris@16
|
821
|
Chris@16
|
822 template <class R, class I, class T, class C1, class C2>
|
Chris@16
|
823 T
|
Chris@16
|
824 operator()(R& r, I i, T t, C1 c1, C2 c2) const
|
Chris@16
|
825 {
|
Chris@16
|
826 return std::inner_product(
|
Chris@16
|
827 detail::begin_(r), detail::end_(r), i,
|
Chris@16
|
828 t, c1, c2);
|
Chris@16
|
829 }
|
Chris@16
|
830 };
|
Chris@16
|
831
|
Chris@16
|
832 struct partial_sum
|
Chris@16
|
833 {
|
Chris@16
|
834 template <typename Sig>
|
Chris@16
|
835 struct result;
|
Chris@16
|
836
|
Chris@16
|
837 template <typename This, class R, class I>
|
Chris@16
|
838 struct result<This(R&, I)>
|
Chris@16
|
839 : detail::decay_array<I>
|
Chris@16
|
840 {};
|
Chris@16
|
841
|
Chris@16
|
842 template <typename This, class R, class I, class C>
|
Chris@16
|
843 struct result<This(R&, I, C)>
|
Chris@16
|
844 : detail::decay_array<I>
|
Chris@16
|
845 {};
|
Chris@16
|
846
|
Chris@16
|
847 template <class R, class I>
|
Chris@16
|
848 typename detail::decay_array<I>::type
|
Chris@16
|
849 operator()(R& r, I i) const
|
Chris@16
|
850 {
|
Chris@16
|
851 return std::partial_sum(
|
Chris@16
|
852 detail::begin_(r), detail::end_(r), i);
|
Chris@16
|
853 }
|
Chris@16
|
854
|
Chris@16
|
855 template <class R, class I, class C>
|
Chris@16
|
856 typename detail::decay_array<I>::type
|
Chris@16
|
857 operator()(R& r, I i, C c) const
|
Chris@16
|
858 {
|
Chris@16
|
859 return std::partial_sum(
|
Chris@16
|
860 detail::begin_(r), detail::end_(r), i, c);
|
Chris@16
|
861 }
|
Chris@16
|
862 };
|
Chris@16
|
863
|
Chris@16
|
864 struct adjacent_difference
|
Chris@16
|
865 {
|
Chris@16
|
866 template <typename Sig>
|
Chris@16
|
867 struct result;
|
Chris@16
|
868
|
Chris@16
|
869 template <typename This, class R, class I>
|
Chris@16
|
870 struct result<This(R&, I)>
|
Chris@16
|
871 : detail::decay_array<I>
|
Chris@16
|
872 {};
|
Chris@16
|
873
|
Chris@16
|
874 template <typename This,class R, class I, class C>
|
Chris@16
|
875 struct result<This(R&, I, C)>
|
Chris@16
|
876 : detail::decay_array<I>
|
Chris@16
|
877 {};
|
Chris@16
|
878
|
Chris@16
|
879 template <class R, class I>
|
Chris@16
|
880 typename detail::decay_array<I>::type
|
Chris@16
|
881 operator()(R& r, I i) const
|
Chris@16
|
882 {
|
Chris@16
|
883 return std::adjacent_difference(
|
Chris@16
|
884 detail::begin_(r), detail::end_(r), i);
|
Chris@16
|
885 }
|
Chris@16
|
886
|
Chris@16
|
887 template <class R, class I, class C>
|
Chris@16
|
888 typename detail::decay_array<I>::type
|
Chris@16
|
889 operator()(R& r, I i, C c) const
|
Chris@16
|
890 {
|
Chris@16
|
891 return std::adjacent_difference(
|
Chris@16
|
892 detail::begin_(r), detail::end_(r), i, c);
|
Chris@16
|
893 }
|
Chris@16
|
894 };
|
Chris@16
|
895
|
Chris@16
|
896 struct push_heap
|
Chris@16
|
897 {
|
Chris@16
|
898 typedef void result_type;
|
Chris@16
|
899
|
Chris@16
|
900 template <class R>
|
Chris@16
|
901 void operator()(R& r) const
|
Chris@16
|
902 {
|
Chris@16
|
903 std::push_heap(detail::begin_(r), detail::end_(r));
|
Chris@16
|
904 }
|
Chris@16
|
905
|
Chris@16
|
906 template <class R, class C>
|
Chris@16
|
907 void operator()(R& r, C c) const
|
Chris@16
|
908 {
|
Chris@16
|
909 std::push_heap(detail::begin_(r), detail::end_(r), c);
|
Chris@16
|
910 }
|
Chris@16
|
911 };
|
Chris@16
|
912
|
Chris@16
|
913 struct pop_heap
|
Chris@16
|
914 {
|
Chris@16
|
915 typedef void result_type;
|
Chris@16
|
916
|
Chris@16
|
917 template <class R>
|
Chris@16
|
918 void operator()(R& r) const
|
Chris@16
|
919 {
|
Chris@16
|
920 std::pop_heap(detail::begin_(r), detail::end_(r));
|
Chris@16
|
921 }
|
Chris@16
|
922
|
Chris@16
|
923 template <class R, class C>
|
Chris@16
|
924 void operator()(R& r, C c) const
|
Chris@16
|
925 {
|
Chris@16
|
926 std::pop_heap(detail::begin_(r), detail::end_(r), c);
|
Chris@16
|
927 }
|
Chris@16
|
928 };
|
Chris@16
|
929
|
Chris@16
|
930 struct make_heap
|
Chris@16
|
931 {
|
Chris@16
|
932 typedef void result_type;
|
Chris@16
|
933
|
Chris@16
|
934 template <class R>
|
Chris@16
|
935 void operator()(R& r) const
|
Chris@16
|
936 {
|
Chris@16
|
937 std::make_heap(detail::begin_(r), detail::end_(r));
|
Chris@16
|
938 }
|
Chris@16
|
939
|
Chris@16
|
940 template <class R, class C>
|
Chris@16
|
941 void operator()(R& r, C c) const
|
Chris@16
|
942 {
|
Chris@16
|
943 std::make_heap(detail::begin_(r), detail::end_(r), c);
|
Chris@16
|
944 }
|
Chris@16
|
945 };
|
Chris@16
|
946
|
Chris@16
|
947 struct sort_heap
|
Chris@16
|
948 {
|
Chris@16
|
949 typedef void result_type;
|
Chris@16
|
950
|
Chris@16
|
951 template <class R>
|
Chris@16
|
952 void operator()(R& r) const
|
Chris@16
|
953 {
|
Chris@16
|
954 std::sort_heap(detail::begin_(r), detail::end_(r));
|
Chris@16
|
955 }
|
Chris@16
|
956
|
Chris@16
|
957 template <class R, class C>
|
Chris@16
|
958 void operator()(R& r, C c) const
|
Chris@16
|
959 {
|
Chris@16
|
960 std::sort_heap(detail::begin_(r), detail::end_(r), c);
|
Chris@16
|
961 }
|
Chris@16
|
962 };
|
Chris@16
|
963
|
Chris@16
|
964 struct set_union
|
Chris@16
|
965 {
|
Chris@16
|
966 template <typename Sig>
|
Chris@16
|
967 struct result;
|
Chris@16
|
968
|
Chris@16
|
969 template <typename This, class R1, class R2, class O>
|
Chris@16
|
970 struct result<This(R1&, R2&, O)>
|
Chris@16
|
971 : detail::decay_array<O>
|
Chris@16
|
972 {};
|
Chris@16
|
973
|
Chris@16
|
974 template <typename This, class R1, class R2, class O, typename C>
|
Chris@16
|
975 struct result<This(R1&, R2&, O, C)>
|
Chris@16
|
976 : detail::decay_array<O>
|
Chris@16
|
977 {};
|
Chris@16
|
978
|
Chris@16
|
979 template <class R1, class R2, class O>
|
Chris@16
|
980 typename detail::decay_array<O>::type
|
Chris@16
|
981 operator()(R1& r1, R2& r2, O o) const
|
Chris@16
|
982 {
|
Chris@16
|
983 return std::set_union(
|
Chris@16
|
984 detail::begin_(r1), detail::end_(r1)
|
Chris@16
|
985 , detail::begin_(r2), detail::end_(r2)
|
Chris@16
|
986 , o
|
Chris@16
|
987 );
|
Chris@16
|
988 }
|
Chris@16
|
989
|
Chris@16
|
990 template <class R1, class R2, class O, class C>
|
Chris@16
|
991 typename detail::decay_array<O>::type
|
Chris@16
|
992 operator()(R1& r1, R2& r2, O o, C c) const
|
Chris@16
|
993 {
|
Chris@16
|
994 return std::set_union(
|
Chris@16
|
995 detail::begin_(r1), detail::end_(r1)
|
Chris@16
|
996 , detail::begin_(r2), detail::end_(r2)
|
Chris@16
|
997 , o
|
Chris@16
|
998 , c
|
Chris@16
|
999 );
|
Chris@16
|
1000 }
|
Chris@16
|
1001 };
|
Chris@16
|
1002
|
Chris@16
|
1003 struct set_intersection
|
Chris@16
|
1004 {
|
Chris@16
|
1005 template <typename Sig>
|
Chris@16
|
1006 struct result;
|
Chris@16
|
1007
|
Chris@16
|
1008 template <typename This, class R1, class R2, class O>
|
Chris@16
|
1009 struct result<This(R1&, R2&, O)>
|
Chris@16
|
1010 : detail::decay_array<O>
|
Chris@16
|
1011 {};
|
Chris@16
|
1012
|
Chris@16
|
1013 template <typename This, class R1, class R2, class O, typename C>
|
Chris@16
|
1014 struct result<This(R1&, R2&, O, C)>
|
Chris@16
|
1015 : detail::decay_array<O>
|
Chris@16
|
1016 {};
|
Chris@16
|
1017
|
Chris@16
|
1018 template <class R1, class R2, class O>
|
Chris@16
|
1019 typename detail::decay_array<O>::type
|
Chris@16
|
1020 operator()(R1& r1, R2& r2, O o) const
|
Chris@16
|
1021 {
|
Chris@16
|
1022 return std::set_intersection(
|
Chris@16
|
1023 detail::begin_(r1), detail::end_(r1)
|
Chris@16
|
1024 , detail::begin_(r2), detail::end_(r2)
|
Chris@16
|
1025 , o
|
Chris@16
|
1026 );
|
Chris@16
|
1027 }
|
Chris@16
|
1028
|
Chris@16
|
1029 template <class R1, class R2, class O, class C>
|
Chris@16
|
1030 typename detail::decay_array<O>::type
|
Chris@16
|
1031 operator()(R1& r1, R2& r2, O o, C c) const
|
Chris@16
|
1032 {
|
Chris@16
|
1033 return std::set_intersection(
|
Chris@16
|
1034 detail::begin_(r1), detail::end_(r1)
|
Chris@16
|
1035 , detail::begin_(r2), detail::end_(r2)
|
Chris@16
|
1036 , o
|
Chris@16
|
1037 , c
|
Chris@16
|
1038 );
|
Chris@16
|
1039 }
|
Chris@16
|
1040 };
|
Chris@16
|
1041
|
Chris@16
|
1042 struct set_difference
|
Chris@16
|
1043 {
|
Chris@16
|
1044 template <typename Sig>
|
Chris@16
|
1045 struct result;
|
Chris@16
|
1046
|
Chris@16
|
1047 template <typename This, class R1, class R2, class O>
|
Chris@16
|
1048 struct result<This(R1&, R2&, O)>
|
Chris@16
|
1049 : detail::decay_array<O>
|
Chris@16
|
1050 {};
|
Chris@16
|
1051
|
Chris@16
|
1052 template <typename This, class R1, class R2, class O, class C>
|
Chris@16
|
1053 struct result<This(R1&, R2&, O, C)>
|
Chris@16
|
1054 : detail::decay_array<O>
|
Chris@16
|
1055 {};
|
Chris@16
|
1056
|
Chris@16
|
1057 template <class R1, class R2, class O>
|
Chris@16
|
1058 typename detail::decay_array<O>::type
|
Chris@16
|
1059 operator()(R1& r1, R2& r2, O o) const
|
Chris@16
|
1060 {
|
Chris@16
|
1061 return std::set_difference(
|
Chris@16
|
1062 detail::begin_(r1), detail::end_(r1)
|
Chris@16
|
1063 , detail::begin_(r2), detail::end_(r2)
|
Chris@16
|
1064 , o
|
Chris@16
|
1065 );
|
Chris@16
|
1066 }
|
Chris@16
|
1067
|
Chris@16
|
1068 template <class R1, class R2, class O, class C>
|
Chris@16
|
1069 typename detail::decay_array<O>::type
|
Chris@16
|
1070 operator()(R1& r1, R2& r2, O o, C c) const
|
Chris@16
|
1071 {
|
Chris@16
|
1072 return std::set_difference(
|
Chris@16
|
1073 detail::begin_(r1), detail::end_(r1)
|
Chris@16
|
1074 , detail::begin_(r2), detail::end_(r2)
|
Chris@16
|
1075 , o
|
Chris@16
|
1076 , c
|
Chris@16
|
1077 );
|
Chris@16
|
1078 }
|
Chris@16
|
1079 };
|
Chris@16
|
1080
|
Chris@16
|
1081 struct set_symmetric_difference
|
Chris@16
|
1082 {
|
Chris@16
|
1083 template <typename Sig>
|
Chris@16
|
1084 struct result;
|
Chris@16
|
1085
|
Chris@16
|
1086 template <typename This, class R1, class R2, class O>
|
Chris@16
|
1087 struct result<This(R1&, R2, O)>
|
Chris@16
|
1088 : detail::decay_array<O>
|
Chris@16
|
1089 {};
|
Chris@16
|
1090
|
Chris@16
|
1091 template <typename This, class R1, class R2, class O, class C>
|
Chris@16
|
1092 struct result<This(R1&, R2, O, C)>
|
Chris@16
|
1093 : detail::decay_array<O>
|
Chris@16
|
1094 {};
|
Chris@16
|
1095
|
Chris@16
|
1096 template <class R1, class R2, class O>
|
Chris@16
|
1097 typename detail::decay_array<O>::type
|
Chris@16
|
1098 operator()(R1& r1, R2& r2, O o) const
|
Chris@16
|
1099 {
|
Chris@16
|
1100 return std::set_symmetric_difference(
|
Chris@16
|
1101 detail::begin_(r1), detail::end_(r1)
|
Chris@16
|
1102 , detail::begin_(r2), detail::end_(r2)
|
Chris@16
|
1103 , o
|
Chris@16
|
1104 );
|
Chris@16
|
1105 }
|
Chris@16
|
1106
|
Chris@16
|
1107 template <class R1, class R2, class O, class C>
|
Chris@16
|
1108 typename detail::decay_array<O>::type
|
Chris@16
|
1109 operator()(R1& r1, R2& r2, O o, C c) const
|
Chris@16
|
1110 {
|
Chris@16
|
1111 return std::set_symmetric_difference(
|
Chris@16
|
1112 detail::begin_(r1), detail::end_(r1)
|
Chris@16
|
1113 , detail::begin_(r2), detail::end_(r2)
|
Chris@16
|
1114 , o
|
Chris@16
|
1115 , c
|
Chris@16
|
1116 );
|
Chris@16
|
1117 }
|
Chris@16
|
1118 };
|
Chris@16
|
1119
|
Chris@16
|
1120 }}} // boost::phoenix::impl
|
Chris@16
|
1121
|
Chris@16
|
1122 namespace boost { namespace phoenix
|
Chris@16
|
1123 {
|
Chris@16
|
1124 BOOST_PHOENIX_ADAPT_CALLABLE(swap, impl::swap, 2)
|
Chris@16
|
1125 BOOST_PHOENIX_ADAPT_CALLABLE(copy, impl::copy, 2)
|
Chris@16
|
1126 BOOST_PHOENIX_ADAPT_CALLABLE(copy_backward, impl::copy_backward, 2)
|
Chris@16
|
1127 BOOST_PHOENIX_ADAPT_CALLABLE(transform, impl::transform, 3)
|
Chris@16
|
1128 BOOST_PHOENIX_ADAPT_CALLABLE(transform, impl::transform, 4)
|
Chris@16
|
1129 BOOST_PHOENIX_ADAPT_CALLABLE(replace, impl::replace, 3)
|
Chris@16
|
1130 BOOST_PHOENIX_ADAPT_CALLABLE(replace_if, impl::replace_if, 3)
|
Chris@16
|
1131 BOOST_PHOENIX_ADAPT_CALLABLE(replace_copy, impl::replace_copy, 4)
|
Chris@16
|
1132 BOOST_PHOENIX_ADAPT_CALLABLE(replace_copy_if, impl::replace_copy_if, 4)
|
Chris@16
|
1133 BOOST_PHOENIX_ADAPT_CALLABLE(fill, impl::fill, 2)
|
Chris@16
|
1134 BOOST_PHOENIX_ADAPT_CALLABLE(fill_n, impl::fill_n, 3)
|
Chris@16
|
1135 BOOST_PHOENIX_ADAPT_CALLABLE(generate, impl::generate, 2)
|
Chris@16
|
1136 BOOST_PHOENIX_ADAPT_CALLABLE(generate_n, impl::generate_n, 3)
|
Chris@16
|
1137 BOOST_PHOENIX_ADAPT_CALLABLE(remove, impl::remove, 2)
|
Chris@16
|
1138 BOOST_PHOENIX_ADAPT_CALLABLE(remove_if, impl::remove_if, 2)
|
Chris@16
|
1139 BOOST_PHOENIX_ADAPT_CALLABLE(remove_copy, impl::remove_copy, 3)
|
Chris@16
|
1140 BOOST_PHOENIX_ADAPT_CALLABLE(remove_copy_if, impl::remove_copy_if, 3)
|
Chris@16
|
1141 BOOST_PHOENIX_ADAPT_CALLABLE(unique, impl::unique, 1)
|
Chris@16
|
1142 BOOST_PHOENIX_ADAPT_CALLABLE(unique, impl::unique, 2)
|
Chris@16
|
1143 BOOST_PHOENIX_ADAPT_CALLABLE(unique_copy, impl::unique_copy, 2)
|
Chris@16
|
1144 BOOST_PHOENIX_ADAPT_CALLABLE(unique_copy, impl::unique_copy, 3)
|
Chris@16
|
1145 BOOST_PHOENIX_ADAPT_CALLABLE(reverse, impl::reverse, 1)
|
Chris@16
|
1146 BOOST_PHOENIX_ADAPT_CALLABLE(reverse_copy, impl::reverse_copy, 2)
|
Chris@16
|
1147 BOOST_PHOENIX_ADAPT_CALLABLE(rotate, impl::rotate, 2)
|
Chris@16
|
1148 BOOST_PHOENIX_ADAPT_CALLABLE(rotate_copy, impl::rotate_copy, 3)
|
Chris@16
|
1149 BOOST_PHOENIX_ADAPT_CALLABLE(random_shuffle, impl::random_shuffle, 1)
|
Chris@16
|
1150 BOOST_PHOENIX_ADAPT_CALLABLE(random_shuffle, impl::random_shuffle, 2)
|
Chris@16
|
1151 BOOST_PHOENIX_ADAPT_CALLABLE(partition, impl::partition, 2)
|
Chris@16
|
1152 BOOST_PHOENIX_ADAPT_CALLABLE(stable_partition, impl::stable_partition, 2)
|
Chris@16
|
1153 BOOST_PHOENIX_ADAPT_CALLABLE(sort, impl::sort, 1)
|
Chris@16
|
1154 BOOST_PHOENIX_ADAPT_CALLABLE(sort, impl::sort, 2)
|
Chris@16
|
1155 BOOST_PHOENIX_ADAPT_CALLABLE(stable_sort, impl::stable_sort, 1)
|
Chris@16
|
1156 BOOST_PHOENIX_ADAPT_CALLABLE(stable_sort, impl::stable_sort, 2)
|
Chris@16
|
1157 BOOST_PHOENIX_ADAPT_CALLABLE(partial_sort, impl::partial_sort, 2)
|
Chris@16
|
1158 BOOST_PHOENIX_ADAPT_CALLABLE(partial_sort, impl::partial_sort, 3)
|
Chris@16
|
1159 BOOST_PHOENIX_ADAPT_CALLABLE(partial_sort_copy, impl::partial_sort_copy, 2)
|
Chris@16
|
1160 BOOST_PHOENIX_ADAPT_CALLABLE(partial_sort_copy, impl::partial_sort_copy, 3)
|
Chris@16
|
1161 BOOST_PHOENIX_ADAPT_CALLABLE(nth_element, impl::nth_element, 2)
|
Chris@16
|
1162 BOOST_PHOENIX_ADAPT_CALLABLE(nth_element, impl::nth_element, 3)
|
Chris@16
|
1163 BOOST_PHOENIX_ADAPT_CALLABLE(merge, impl::merge, 3)
|
Chris@16
|
1164 BOOST_PHOENIX_ADAPT_CALLABLE(merge, impl::merge, 4)
|
Chris@16
|
1165 BOOST_PHOENIX_ADAPT_CALLABLE(inplace_merge, impl::inplace_merge, 2)
|
Chris@16
|
1166 BOOST_PHOENIX_ADAPT_CALLABLE(inplace_merge, impl::inplace_merge, 3)
|
Chris@16
|
1167 BOOST_PHOENIX_ADAPT_CALLABLE(next_permutation, impl::next_permutation, 1)
|
Chris@16
|
1168 BOOST_PHOENIX_ADAPT_CALLABLE(next_permutation, impl::next_permutation, 2)
|
Chris@16
|
1169 BOOST_PHOENIX_ADAPT_CALLABLE(prev_permutation, impl::prev_permutation, 1)
|
Chris@16
|
1170 BOOST_PHOENIX_ADAPT_CALLABLE(prev_permutation, impl::prev_permutation, 2)
|
Chris@16
|
1171 BOOST_PHOENIX_ADAPT_CALLABLE(inner_product, impl::inner_product, 3)
|
Chris@16
|
1172 BOOST_PHOENIX_ADAPT_CALLABLE(inner_product, impl::inner_product, 5)
|
Chris@16
|
1173 BOOST_PHOENIX_ADAPT_CALLABLE(partial_sum, impl::partial_sum, 2)
|
Chris@16
|
1174 BOOST_PHOENIX_ADAPT_CALLABLE(partial_sum, impl::partial_sum, 3)
|
Chris@16
|
1175 BOOST_PHOENIX_ADAPT_CALLABLE(adjacent_difference, impl::adjacent_difference, 2)
|
Chris@16
|
1176 BOOST_PHOENIX_ADAPT_CALLABLE(adjacent_difference, impl::adjacent_difference, 3)
|
Chris@16
|
1177 BOOST_PHOENIX_ADAPT_CALLABLE(push_heap, impl::push_heap, 1)
|
Chris@16
|
1178 BOOST_PHOENIX_ADAPT_CALLABLE(push_heap, impl::push_heap, 2)
|
Chris@16
|
1179 BOOST_PHOENIX_ADAPT_CALLABLE(pop_heap, impl::pop_heap, 1)
|
Chris@16
|
1180 BOOST_PHOENIX_ADAPT_CALLABLE(pop_heap, impl::pop_heap, 2)
|
Chris@16
|
1181 BOOST_PHOENIX_ADAPT_CALLABLE(make_heap, impl::make_heap, 1)
|
Chris@16
|
1182 BOOST_PHOENIX_ADAPT_CALLABLE(make_heap, impl::make_heap, 2)
|
Chris@16
|
1183 BOOST_PHOENIX_ADAPT_CALLABLE(sort_heap, impl::sort_heap, 1)
|
Chris@16
|
1184 BOOST_PHOENIX_ADAPT_CALLABLE(sort_heap, impl::sort_heap, 2)
|
Chris@16
|
1185 BOOST_PHOENIX_ADAPT_CALLABLE(set_union, impl::set_union, 3)
|
Chris@16
|
1186 BOOST_PHOENIX_ADAPT_CALLABLE(set_union, impl::set_union, 4)
|
Chris@16
|
1187 BOOST_PHOENIX_ADAPT_CALLABLE(set_intersection, impl::set_intersection, 3)
|
Chris@16
|
1188 BOOST_PHOENIX_ADAPT_CALLABLE(set_intersection, impl::set_intersection, 4)
|
Chris@16
|
1189 BOOST_PHOENIX_ADAPT_CALLABLE(set_difference, impl::set_difference, 3)
|
Chris@16
|
1190 BOOST_PHOENIX_ADAPT_CALLABLE(set_difference, impl::set_difference, 4)
|
Chris@16
|
1191 BOOST_PHOENIX_ADAPT_CALLABLE(set_symmetric_difference, impl::set_symmetric_difference, 3)
|
Chris@16
|
1192 BOOST_PHOENIX_ADAPT_CALLABLE(set_symmetric_difference, impl::set_symmetric_difference, 4)
|
Chris@16
|
1193 }}
|
Chris@16
|
1194
|
Chris@16
|
1195 #endif
|