1 | |
2 | // Copyright Peter Dimov 2001 |
3 | // Copyright Aleksey Gurtovoy 2001-2004 |
4 | // |
5 | // Distributed under the Boost Software License, Version 1.0. |
6 | // (See accompanying file LICENSE_1_0.txt or copy at |
7 | // http://www.boost.org/LICENSE_1_0.txt) |
8 | // |
9 | |
10 | // Preprocessed version of "boost/mpl/bind.hpp" header |
11 | // -- DO NOT modify by hand! |
12 | |
13 | namespace boost { namespace mpl { |
14 | |
15 | namespace aux { |
16 | |
17 | template< |
18 | typename T, typename U1, typename U2, typename U3, typename U4 |
19 | , typename U5 |
20 | > |
21 | struct resolve_bind_arg |
22 | { |
23 | typedef T type; |
24 | }; |
25 | |
26 | template< |
27 | typename T |
28 | , typename Arg |
29 | > |
30 | struct replace_unnamed_arg |
31 | { |
32 | typedef Arg next; |
33 | typedef T type; |
34 | }; |
35 | |
36 | template< |
37 | typename Arg |
38 | > |
39 | struct replace_unnamed_arg< arg< -1 >, Arg > |
40 | { |
41 | typedef typename Arg::next next; |
42 | typedef Arg type; |
43 | }; |
44 | |
45 | template< |
46 | int N, typename U1, typename U2, typename U3, typename U4, typename U5 |
47 | > |
48 | struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 > |
49 | { |
50 | typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type; |
51 | }; |
52 | |
53 | template< |
54 | typename F, typename T1, typename T2, typename T3, typename T4 |
55 | , typename T5, typename U1, typename U2, typename U3, typename U4 |
56 | , typename U5 |
57 | > |
58 | struct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 > |
59 | { |
60 | typedef bind< F,T1,T2,T3,T4,T5 > f_; |
61 | typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type; |
62 | }; |
63 | |
64 | } // namespace aux |
65 | |
66 | template< |
67 | typename F |
68 | > |
69 | struct bind0 |
70 | { |
71 | template< |
72 | typename U1 = na, typename U2 = na, typename U3 = na |
73 | , typename U4 = na, typename U5 = na |
74 | > |
75 | struct apply |
76 | { |
77 | private: |
78 | typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0; |
79 | typedef typename r0::type a0; |
80 | typedef typename r0::next n1; |
81 | typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_; |
82 | /// |
83 | public: |
84 | typedef typename apply_wrap0< |
85 | f_ |
86 | >::type type; |
87 | |
88 | }; |
89 | }; |
90 | |
91 | namespace aux { |
92 | |
93 | template< |
94 | typename F, typename U1, typename U2, typename U3, typename U4 |
95 | , typename U5 |
96 | > |
97 | struct resolve_bind_arg< |
98 | bind0<F>, U1, U2, U3, U4, U5 |
99 | > |
100 | { |
101 | typedef bind0<F> f_; |
102 | typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type; |
103 | }; |
104 | |
105 | } // namespace aux |
106 | |
107 | BOOST_MPL_AUX_ARITY_SPEC(1, bind0) |
108 | BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0) |
109 | |
110 | template< |
111 | typename F |
112 | > |
113 | struct bind< F,na,na,na,na,na > |
114 | : bind0<F> |
115 | { |
116 | }; |
117 | |
118 | template< |
119 | typename F, typename T1 |
120 | > |
121 | struct bind1 |
122 | { |
123 | template< |
124 | typename U1 = na, typename U2 = na, typename U3 = na |
125 | , typename U4 = na, typename U5 = na |
126 | > |
127 | struct apply |
128 | { |
129 | private: |
130 | typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0; |
131 | typedef typename r0::type a0; |
132 | typedef typename r0::next n1; |
133 | typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_; |
134 | /// |
135 | typedef aux::replace_unnamed_arg< T1,n1 > r1; |
136 | typedef typename r1::type a1; |
137 | typedef typename r1::next n2; |
138 | typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1; |
139 | /// |
140 | public: |
141 | typedef typename apply_wrap1< |
142 | f_ |
143 | , typename t1::type |
144 | >::type type; |
145 | |
146 | }; |
147 | }; |
148 | |
149 | namespace aux { |
150 | |
151 | template< |
152 | typename F, typename T1, typename U1, typename U2, typename U3 |
153 | , typename U4, typename U5 |
154 | > |
155 | struct resolve_bind_arg< |
156 | bind1< F,T1 >, U1, U2, U3, U4, U5 |
157 | > |
158 | { |
159 | typedef bind1< F,T1 > f_; |
160 | typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type; |
161 | }; |
162 | |
163 | } // namespace aux |
164 | |
165 | BOOST_MPL_AUX_ARITY_SPEC(2, bind1) |
166 | BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1) |
167 | |
168 | template< |
169 | typename F, typename T1 |
170 | > |
171 | struct bind< F,T1,na,na,na,na > |
172 | : bind1< F,T1 > |
173 | { |
174 | }; |
175 | |
176 | template< |
177 | typename F, typename T1, typename T2 |
178 | > |
179 | struct bind2 |
180 | { |
181 | template< |
182 | typename U1 = na, typename U2 = na, typename U3 = na |
183 | , typename U4 = na, typename U5 = na |
184 | > |
185 | struct apply |
186 | { |
187 | private: |
188 | typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0; |
189 | typedef typename r0::type a0; |
190 | typedef typename r0::next n1; |
191 | typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_; |
192 | /// |
193 | typedef aux::replace_unnamed_arg< T1,n1 > r1; |
194 | typedef typename r1::type a1; |
195 | typedef typename r1::next n2; |
196 | typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1; |
197 | /// |
198 | typedef aux::replace_unnamed_arg< T2,n2 > r2; |
199 | typedef typename r2::type a2; |
200 | typedef typename r2::next n3; |
201 | typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2; |
202 | /// |
203 | public: |
204 | typedef typename apply_wrap2< |
205 | f_ |
206 | , typename t1::type, typename t2::type |
207 | >::type type; |
208 | |
209 | }; |
210 | }; |
211 | |
212 | namespace aux { |
213 | |
214 | template< |
215 | typename F, typename T1, typename T2, typename U1, typename U2 |
216 | , typename U3, typename U4, typename U5 |
217 | > |
218 | struct resolve_bind_arg< |
219 | bind2< F,T1,T2 >, U1, U2, U3, U4, U5 |
220 | > |
221 | { |
222 | typedef bind2< F,T1,T2 > f_; |
223 | typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type; |
224 | }; |
225 | |
226 | } // namespace aux |
227 | |
228 | BOOST_MPL_AUX_ARITY_SPEC(3, bind2) |
229 | BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2) |
230 | |
231 | template< |
232 | typename F, typename T1, typename T2 |
233 | > |
234 | struct bind< F,T1,T2,na,na,na > |
235 | : bind2< F,T1,T2 > |
236 | { |
237 | }; |
238 | |
239 | template< |
240 | typename F, typename T1, typename T2, typename T3 |
241 | > |
242 | struct bind3 |
243 | { |
244 | template< |
245 | typename U1 = na, typename U2 = na, typename U3 = na |
246 | , typename U4 = na, typename U5 = na |
247 | > |
248 | struct apply |
249 | { |
250 | private: |
251 | typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0; |
252 | typedef typename r0::type a0; |
253 | typedef typename r0::next n1; |
254 | typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_; |
255 | /// |
256 | typedef aux::replace_unnamed_arg< T1,n1 > r1; |
257 | typedef typename r1::type a1; |
258 | typedef typename r1::next n2; |
259 | typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1; |
260 | /// |
261 | typedef aux::replace_unnamed_arg< T2,n2 > r2; |
262 | typedef typename r2::type a2; |
263 | typedef typename r2::next n3; |
264 | typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2; |
265 | /// |
266 | typedef aux::replace_unnamed_arg< T3,n3 > r3; |
267 | typedef typename r3::type a3; |
268 | typedef typename r3::next n4; |
269 | typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3; |
270 | /// |
271 | public: |
272 | typedef typename apply_wrap3< |
273 | f_ |
274 | , typename t1::type, typename t2::type, typename t3::type |
275 | >::type type; |
276 | |
277 | }; |
278 | }; |
279 | |
280 | namespace aux { |
281 | |
282 | template< |
283 | typename F, typename T1, typename T2, typename T3, typename U1 |
284 | , typename U2, typename U3, typename U4, typename U5 |
285 | > |
286 | struct resolve_bind_arg< |
287 | bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5 |
288 | > |
289 | { |
290 | typedef bind3< F,T1,T2,T3 > f_; |
291 | typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type; |
292 | }; |
293 | |
294 | } // namespace aux |
295 | |
296 | BOOST_MPL_AUX_ARITY_SPEC(4, bind3) |
297 | BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3) |
298 | |
299 | template< |
300 | typename F, typename T1, typename T2, typename T3 |
301 | > |
302 | struct bind< F,T1,T2,T3,na,na > |
303 | : bind3< F,T1,T2,T3 > |
304 | { |
305 | }; |
306 | |
307 | template< |
308 | typename F, typename T1, typename T2, typename T3, typename T4 |
309 | > |
310 | struct bind4 |
311 | { |
312 | template< |
313 | typename U1 = na, typename U2 = na, typename U3 = na |
314 | , typename U4 = na, typename U5 = na |
315 | > |
316 | struct apply |
317 | { |
318 | private: |
319 | typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0; |
320 | typedef typename r0::type a0; |
321 | typedef typename r0::next n1; |
322 | typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_; |
323 | /// |
324 | typedef aux::replace_unnamed_arg< T1,n1 > r1; |
325 | typedef typename r1::type a1; |
326 | typedef typename r1::next n2; |
327 | typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1; |
328 | /// |
329 | typedef aux::replace_unnamed_arg< T2,n2 > r2; |
330 | typedef typename r2::type a2; |
331 | typedef typename r2::next n3; |
332 | typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2; |
333 | /// |
334 | typedef aux::replace_unnamed_arg< T3,n3 > r3; |
335 | typedef typename r3::type a3; |
336 | typedef typename r3::next n4; |
337 | typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3; |
338 | /// |
339 | typedef aux::replace_unnamed_arg< T4,n4 > r4; |
340 | typedef typename r4::type a4; |
341 | typedef typename r4::next n5; |
342 | typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4; |
343 | /// |
344 | public: |
345 | typedef typename apply_wrap4< |
346 | f_ |
347 | , typename t1::type, typename t2::type, typename t3::type |
348 | , typename t4::type |
349 | >::type type; |
350 | |
351 | }; |
352 | }; |
353 | |
354 | namespace aux { |
355 | |
356 | template< |
357 | typename F, typename T1, typename T2, typename T3, typename T4 |
358 | , typename U1, typename U2, typename U3, typename U4, typename U5 |
359 | > |
360 | struct resolve_bind_arg< |
361 | bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5 |
362 | > |
363 | { |
364 | typedef bind4< F,T1,T2,T3,T4 > f_; |
365 | typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type; |
366 | }; |
367 | |
368 | } // namespace aux |
369 | |
370 | BOOST_MPL_AUX_ARITY_SPEC(5, bind4) |
371 | BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4) |
372 | |
373 | template< |
374 | typename F, typename T1, typename T2, typename T3, typename T4 |
375 | > |
376 | struct bind< F,T1,T2,T3,T4,na > |
377 | : bind4< F,T1,T2,T3,T4 > |
378 | { |
379 | }; |
380 | |
381 | template< |
382 | typename F, typename T1, typename T2, typename T3, typename T4 |
383 | , typename T5 |
384 | > |
385 | struct bind5 |
386 | { |
387 | template< |
388 | typename U1 = na, typename U2 = na, typename U3 = na |
389 | , typename U4 = na, typename U5 = na |
390 | > |
391 | struct apply |
392 | { |
393 | private: |
394 | typedef aux::replace_unnamed_arg< F, mpl::arg<1> > r0; |
395 | typedef typename r0::type a0; |
396 | typedef typename r0::next n1; |
397 | typedef typename aux::resolve_bind_arg< a0,U1,U2,U3,U4,U5 >::type f_; |
398 | /// |
399 | typedef aux::replace_unnamed_arg< T1,n1 > r1; |
400 | typedef typename r1::type a1; |
401 | typedef typename r1::next n2; |
402 | typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1; |
403 | /// |
404 | typedef aux::replace_unnamed_arg< T2,n2 > r2; |
405 | typedef typename r2::type a2; |
406 | typedef typename r2::next n3; |
407 | typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2; |
408 | /// |
409 | typedef aux::replace_unnamed_arg< T3,n3 > r3; |
410 | typedef typename r3::type a3; |
411 | typedef typename r3::next n4; |
412 | typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3; |
413 | /// |
414 | typedef aux::replace_unnamed_arg< T4,n4 > r4; |
415 | typedef typename r4::type a4; |
416 | typedef typename r4::next n5; |
417 | typedef aux::resolve_bind_arg< a4,U1,U2,U3,U4,U5 > t4; |
418 | /// |
419 | typedef aux::replace_unnamed_arg< T5,n5 > r5; |
420 | typedef typename r5::type a5; |
421 | typedef typename r5::next n6; |
422 | typedef aux::resolve_bind_arg< a5,U1,U2,U3,U4,U5 > t5; |
423 | /// |
424 | public: |
425 | typedef typename apply_wrap5< |
426 | f_ |
427 | , typename t1::type, typename t2::type, typename t3::type |
428 | , typename t4::type, typename t5::type |
429 | >::type type; |
430 | |
431 | }; |
432 | }; |
433 | |
434 | namespace aux { |
435 | |
436 | template< |
437 | typename F, typename T1, typename T2, typename T3, typename T4 |
438 | , typename T5, typename U1, typename U2, typename U3, typename U4 |
439 | , typename U5 |
440 | > |
441 | struct resolve_bind_arg< |
442 | bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 |
443 | > |
444 | { |
445 | typedef bind5< F,T1,T2,T3,T4,T5 > f_; |
446 | typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type; |
447 | }; |
448 | |
449 | } // namespace aux |
450 | |
451 | BOOST_MPL_AUX_ARITY_SPEC(6, bind5) |
452 | BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5) |
453 | |
454 | /// primary template (not a specialization!) |
455 | |
456 | template< |
457 | typename F, typename T1, typename T2, typename T3, typename T4 |
458 | , typename T5 |
459 | > |
460 | struct bind |
461 | : bind5< F,T1,T2,T3,T4,T5 > |
462 | { |
463 | }; |
464 | |
465 | /// if_/eval_if specializations |
466 | template< template< typename T1, typename T2, typename T3 > class F, typename Tag > |
467 | struct quote3; |
468 | |
469 | template< typename T1, typename T2, typename T3 > struct if_; |
470 | |
471 | template< |
472 | typename Tag, typename T1, typename T2, typename T3 |
473 | > |
474 | struct bind3< |
475 | quote3< if_,Tag > |
476 | , T1, T2, T3 |
477 | > |
478 | { |
479 | template< |
480 | typename U1 = na, typename U2 = na, typename U3 = na |
481 | , typename U4 = na, typename U5 = na |
482 | > |
483 | struct apply |
484 | { |
485 | private: |
486 | typedef mpl::arg<1> n1; |
487 | typedef aux::replace_unnamed_arg< T1,n1 > r1; |
488 | typedef typename r1::type a1; |
489 | typedef typename r1::next n2; |
490 | typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1; |
491 | /// |
492 | typedef aux::replace_unnamed_arg< T2,n2 > r2; |
493 | typedef typename r2::type a2; |
494 | typedef typename r2::next n3; |
495 | typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2; |
496 | /// |
497 | typedef aux::replace_unnamed_arg< T3,n3 > r3; |
498 | typedef typename r3::type a3; |
499 | typedef typename r3::next n4; |
500 | typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3; |
501 | /// |
502 | typedef typename if_< |
503 | typename t1::type |
504 | , t2, t3 |
505 | >::type f_; |
506 | |
507 | public: |
508 | typedef typename f_::type type; |
509 | }; |
510 | }; |
511 | |
512 | template< |
513 | template< typename T1, typename T2, typename T3 > class F, typename Tag |
514 | > |
515 | struct quote3; |
516 | |
517 | template< typename T1, typename T2, typename T3 > struct eval_if; |
518 | |
519 | template< |
520 | typename Tag, typename T1, typename T2, typename T3 |
521 | > |
522 | struct bind3< |
523 | quote3< eval_if,Tag > |
524 | , T1, T2, T3 |
525 | > |
526 | { |
527 | template< |
528 | typename U1 = na, typename U2 = na, typename U3 = na |
529 | , typename U4 = na, typename U5 = na |
530 | > |
531 | struct apply |
532 | { |
533 | private: |
534 | typedef mpl::arg<1> n1; |
535 | typedef aux::replace_unnamed_arg< T1,n1 > r1; |
536 | typedef typename r1::type a1; |
537 | typedef typename r1::next n2; |
538 | typedef aux::resolve_bind_arg< a1,U1,U2,U3,U4,U5 > t1; |
539 | /// |
540 | typedef aux::replace_unnamed_arg< T2,n2 > r2; |
541 | typedef typename r2::type a2; |
542 | typedef typename r2::next n3; |
543 | typedef aux::resolve_bind_arg< a2,U1,U2,U3,U4,U5 > t2; |
544 | /// |
545 | typedef aux::replace_unnamed_arg< T3,n3 > r3; |
546 | typedef typename r3::type a3; |
547 | typedef typename r3::next n4; |
548 | typedef aux::resolve_bind_arg< a3,U1,U2,U3,U4,U5 > t3; |
549 | /// |
550 | typedef typename eval_if< |
551 | typename t1::type |
552 | , t2, t3 |
553 | >::type f_; |
554 | |
555 | public: |
556 | typedef typename f_::type type; |
557 | }; |
558 | }; |
559 | |
560 | }} |
561 | |
562 | |