Fixes for VS 2008
[dyninst.git] / external / boost / mpl / aux_ / preprocessed / mwcw / basic_bind.hpp
1 \r
2 // Copyright Peter Dimov 2001\r
3 // Copyright Aleksey Gurtovoy 2001-2004\r
4 //\r
5 // Distributed under the Boost Software License, Version 1.0. \r
6 // (See accompanying file LICENSE_1_0.txt or copy at \r
7 // http://www.boost.org/LICENSE_1_0.txt)\r
8 //\r
9 \r
10 // Preprocessed version of "boost/mpl/aux_/basic_bind.hpp" header\r
11 // -- DO NOT modify by hand!\r
12 \r
13 namespace boost { namespace mpl {\r
14 \r
15 namespace aux {\r
16 \r
17 template<\r
18       typename T, typename U1, typename U2, typename U3, typename U4\r
19     , typename U5\r
20     >\r
21 struct resolve_bind_arg\r
22 {\r
23     typedef T type;\r
24 };\r
25 \r
26 template<\r
27       int N, typename U1, typename U2, typename U3, typename U4, typename U5\r
28     >\r
29 struct resolve_bind_arg< arg<N>, U1, U2, U3, U4, U5 >\r
30 {\r
31     typedef typename apply_wrap5<mpl::arg<N>, U1, U2, U3, U4, U5>::type type;\r
32 };\r
33 \r
34 template<\r
35       typename F, typename T1, typename T2, typename T3, typename T4\r
36     , typename T5, typename U1, typename U2, typename U3, typename U4\r
37     , typename U5\r
38     >\r
39 struct resolve_bind_arg< bind< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5 >\r
40 {\r
41     typedef bind< F,T1,T2,T3,T4,T5 > f_;\r
42     typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\r
43 };\r
44 \r
45 } // namespace aux\r
46 \r
47 template<\r
48       typename F\r
49     >\r
50 struct bind0\r
51 {\r
52     template<\r
53           typename U1 = na, typename U2 = na, typename U3 = na\r
54         , typename U4 = na, typename U5 = na\r
55         >\r
56     struct apply\r
57     {\r
58      private:\r
59         typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\r
60 \r
61      public:\r
62         typedef typename apply_wrap0<\r
63               f_\r
64             >::type type;\r
65 \r
66     };\r
67 };\r
68 \r
69 namespace aux {\r
70 \r
71 template<\r
72       typename F, typename U1, typename U2, typename U3, typename U4\r
73     , typename U5\r
74     >\r
75 struct resolve_bind_arg<\r
76       bind0<F>, U1, U2, U3, U4, U5\r
77     >\r
78 {\r
79     typedef bind0<F> f_;\r
80     typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\r
81 };\r
82 \r
83 } // namespace aux\r
84 \r
85 BOOST_MPL_AUX_ARITY_SPEC(1, bind0)\r
86 BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(1, bind0)\r
87 \r
88 template<\r
89       typename F\r
90     >\r
91 struct bind< F,na,na,na,na,na >\r
92     : bind0<F>\r
93 {\r
94 };\r
95 \r
96 template<\r
97       typename F, typename T1\r
98     >\r
99 struct bind1\r
100 {\r
101     template<\r
102           typename U1 = na, typename U2 = na, typename U3 = na\r
103         , typename U4 = na, typename U5 = na\r
104         >\r
105     struct apply\r
106     {\r
107      private:\r
108         typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\r
109         typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\r
110 \r
111      public:\r
112         typedef typename apply_wrap1<\r
113               f_\r
114             , typename t1::type\r
115             >::type type;\r
116 \r
117     };\r
118 };\r
119 \r
120 namespace aux {\r
121 \r
122 template<\r
123       typename F, typename T1, typename U1, typename U2, typename U3\r
124     , typename U4, typename U5\r
125     >\r
126 struct resolve_bind_arg<\r
127       bind1< F,T1 >, U1, U2, U3, U4, U5\r
128     >\r
129 {\r
130     typedef bind1< F,T1 > f_;\r
131     typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\r
132 };\r
133 \r
134 } // namespace aux\r
135 \r
136 BOOST_MPL_AUX_ARITY_SPEC(2, bind1)\r
137 BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(2, bind1)\r
138 \r
139 template<\r
140       typename F, typename T1\r
141     >\r
142 struct bind< F,T1,na,na,na,na >\r
143     : bind1< F,T1 >\r
144 {\r
145 };\r
146 \r
147 template<\r
148       typename F, typename T1, typename T2\r
149     >\r
150 struct bind2\r
151 {\r
152     template<\r
153           typename U1 = na, typename U2 = na, typename U3 = na\r
154         , typename U4 = na, typename U5 = na\r
155         >\r
156     struct apply\r
157     {\r
158      private:\r
159         typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\r
160         typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\r
161         typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\r
162 \r
163      public:\r
164         typedef typename apply_wrap2<\r
165               f_\r
166             , typename t1::type, typename t2::type\r
167             >::type type;\r
168 \r
169     };\r
170 };\r
171 \r
172 namespace aux {\r
173 \r
174 template<\r
175       typename F, typename T1, typename T2, typename U1, typename U2\r
176     , typename U3, typename U4, typename U5\r
177     >\r
178 struct resolve_bind_arg<\r
179       bind2< F,T1,T2 >, U1, U2, U3, U4, U5\r
180     >\r
181 {\r
182     typedef bind2< F,T1,T2 > f_;\r
183     typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\r
184 };\r
185 \r
186 } // namespace aux\r
187 \r
188 BOOST_MPL_AUX_ARITY_SPEC(3, bind2)\r
189 BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(3, bind2)\r
190 \r
191 template<\r
192       typename F, typename T1, typename T2\r
193     >\r
194 struct bind< F,T1,T2,na,na,na >\r
195     : bind2< F,T1,T2 >\r
196 {\r
197 };\r
198 \r
199 template<\r
200       typename F, typename T1, typename T2, typename T3\r
201     >\r
202 struct bind3\r
203 {\r
204     template<\r
205           typename U1 = na, typename U2 = na, typename U3 = na\r
206         , typename U4 = na, typename U5 = na\r
207         >\r
208     struct apply\r
209     {\r
210      private:\r
211         typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\r
212         typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\r
213         typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\r
214         typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\r
215 \r
216      public:\r
217         typedef typename apply_wrap3<\r
218               f_\r
219             , typename t1::type, typename t2::type, typename t3::type\r
220             >::type type;\r
221 \r
222     };\r
223 };\r
224 \r
225 namespace aux {\r
226 \r
227 template<\r
228       typename F, typename T1, typename T2, typename T3, typename U1\r
229     , typename U2, typename U3, typename U4, typename U5\r
230     >\r
231 struct resolve_bind_arg<\r
232       bind3< F,T1,T2,T3 >, U1, U2, U3, U4, U5\r
233     >\r
234 {\r
235     typedef bind3< F,T1,T2,T3 > f_;\r
236     typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\r
237 };\r
238 \r
239 } // namespace aux\r
240 \r
241 BOOST_MPL_AUX_ARITY_SPEC(4, bind3)\r
242 BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(4, bind3)\r
243 \r
244 template<\r
245       typename F, typename T1, typename T2, typename T3\r
246     >\r
247 struct bind< F,T1,T2,T3,na,na >\r
248     : bind3< F,T1,T2,T3 >\r
249 {\r
250 };\r
251 \r
252 template<\r
253       typename F, typename T1, typename T2, typename T3, typename T4\r
254     >\r
255 struct bind4\r
256 {\r
257     template<\r
258           typename U1 = na, typename U2 = na, typename U3 = na\r
259         , typename U4 = na, typename U5 = na\r
260         >\r
261     struct apply\r
262     {\r
263      private:\r
264         typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\r
265         typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\r
266         typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\r
267         typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\r
268         typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\r
269 \r
270      public:\r
271         typedef typename apply_wrap4<\r
272               f_\r
273             , typename t1::type, typename t2::type, typename t3::type\r
274             , typename t4::type\r
275             >::type type;\r
276 \r
277     };\r
278 };\r
279 \r
280 namespace aux {\r
281 \r
282 template<\r
283       typename F, typename T1, typename T2, typename T3, typename T4\r
284     , typename U1, typename U2, typename U3, typename U4, typename U5\r
285     >\r
286 struct resolve_bind_arg<\r
287       bind4< F,T1,T2,T3,T4 >, U1, U2, U3, U4, U5\r
288     >\r
289 {\r
290     typedef bind4< F,T1,T2,T3,T4 > f_;\r
291     typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\r
292 };\r
293 \r
294 } // namespace aux\r
295 \r
296 BOOST_MPL_AUX_ARITY_SPEC(5, bind4)\r
297 BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(5, bind4)\r
298 \r
299 template<\r
300       typename F, typename T1, typename T2, typename T3, typename T4\r
301     >\r
302 struct bind< F,T1,T2,T3,T4,na >\r
303     : bind4< F,T1,T2,T3,T4 >\r
304 {\r
305 };\r
306 \r
307 template<\r
308       typename F, typename T1, typename T2, typename T3, typename T4\r
309     , typename T5\r
310     >\r
311 struct bind5\r
312 {\r
313     template<\r
314           typename U1 = na, typename U2 = na, typename U3 = na\r
315         , typename U4 = na, typename U5 = na\r
316         >\r
317     struct apply\r
318     {\r
319      private:\r
320         typedef typename aux::resolve_bind_arg< F,U1,U2,U3,U4,U5 >::type f_;\r
321         typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\r
322         typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\r
323         typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\r
324         typedef aux::resolve_bind_arg< T4,U1,U2,U3,U4,U5 > t4;\r
325         typedef aux::resolve_bind_arg< T5,U1,U2,U3,U4,U5 > t5;\r
326 \r
327      public:\r
328         typedef typename apply_wrap5<\r
329               f_\r
330             , typename t1::type, typename t2::type, typename t3::type\r
331             , typename t4::type, typename t5::type\r
332             >::type type;\r
333 \r
334     };\r
335 };\r
336 \r
337 namespace aux {\r
338 \r
339 template<\r
340       typename F, typename T1, typename T2, typename T3, typename T4\r
341     , typename T5, typename U1, typename U2, typename U3, typename U4\r
342     , typename U5\r
343     >\r
344 struct resolve_bind_arg<\r
345       bind5< F,T1,T2,T3,T4,T5 >, U1, U2, U3, U4, U5\r
346     >\r
347 {\r
348     typedef bind5< F,T1,T2,T3,T4,T5 > f_;\r
349     typedef typename apply_wrap5< f_,U1,U2,U3,U4,U5 >::type type;\r
350 };\r
351 \r
352 } // namespace aux\r
353 \r
354 BOOST_MPL_AUX_ARITY_SPEC(6, bind5)\r
355 BOOST_MPL_AUX_TEMPLATE_ARITY_SPEC(6, bind5)\r
356 \r
357 /// primary template (not a specialization!)\r
358 \r
359 template<\r
360       typename F, typename T1, typename T2, typename T3, typename T4\r
361     , typename T5\r
362     >\r
363 struct bind\r
364     : bind5< F,T1,T2,T3,T4,T5 >\r
365 {\r
366 };\r
367 \r
368 /// if_/eval_if specializations\r
369 template< template< typename T1, typename T2, typename T3 > class F, typename Tag >\r
370 struct quote3;\r
371 \r
372 template< typename T1, typename T2, typename T3 > struct if_;\r
373 \r
374 template<\r
375       typename Tag, typename T1, typename T2, typename T3\r
376     >\r
377 struct bind3<\r
378       quote3< if_,Tag >\r
379     , T1, T2, T3\r
380     >\r
381 {\r
382     template<\r
383           typename U1 = na, typename U2 = na, typename U3 = na\r
384         , typename U4 = na, typename U5 = na\r
385         >\r
386     struct apply\r
387     {\r
388      private:\r
389         typedef mpl::arg<1> n1;\r
390         typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\r
391         typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\r
392         typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\r
393         typedef typename if_<\r
394               typename t1::type\r
395             , t2, t3\r
396             >::type f_;\r
397 \r
398      public:\r
399         typedef typename f_::type type;\r
400     };\r
401 };\r
402 \r
403 template<\r
404       template< typename T1, typename T2, typename T3 > class F, typename Tag\r
405     >\r
406 struct quote3;\r
407 \r
408 template< typename T1, typename T2, typename T3 > struct eval_if;\r
409 \r
410 template<\r
411       typename Tag, typename T1, typename T2, typename T3\r
412     >\r
413 struct bind3<\r
414       quote3< eval_if,Tag >\r
415     , T1, T2, T3\r
416     >\r
417 {\r
418     template<\r
419           typename U1 = na, typename U2 = na, typename U3 = na\r
420         , typename U4 = na, typename U5 = na\r
421         >\r
422     struct apply\r
423     {\r
424      private:\r
425         typedef mpl::arg<1> n1;\r
426         typedef aux::resolve_bind_arg< T1,U1,U2,U3,U4,U5 > t1;\r
427         typedef aux::resolve_bind_arg< T2,U1,U2,U3,U4,U5 > t2;\r
428         typedef aux::resolve_bind_arg< T3,U1,U2,U3,U4,U5 > t3;\r
429         typedef typename eval_if<\r
430               typename t1::type\r
431             , t2, t3\r
432             >::type f_;\r
433 \r
434      public:\r
435         typedef typename f_::type type;\r
436     };\r
437 };\r
438 \r
439 }}\r
440 \r