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