1 /*=============================================================================
2     Copyright (c) 2011 Thomas Heller
3 
4     Distributed under the Boost Software License, Version 1.0. (See accompanying
5     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
7 
8 
9 
10 
11 
12 
13 
14         template <typename F, typename A0>
15         struct has_phx2_result<F, A0>
16             : mpl::eval_if<
17                 has_result_type<F>
18               , mpl::false_
19               , has_phx2_result_impl<typename F::template result<F(A0)> >
20             >::type
21         {};
22         template <typename F, typename A0>
23         struct phx2_result<F, A0>
24         {
25             typedef typename F::template result<A0>::type type;
26         };
27 
28         template <typename F, typename A0>
29         struct phx2_result<F, A0 &>
30         {
31             typedef typename F::template result<A0>::type type;
32         };
33 
34         template <typename F, typename A0>
35         struct phx2_result<F, A0 const&>
36         {
37             typedef typename F::template result<A0>::type type;
38         };
39 
40 
41 
42 
43 
44 
45 
46         template <typename F, typename A0 , typename A1>
47         struct has_phx2_result<F, A0 , A1>
48             : mpl::eval_if<
49                 has_result_type<F>
50               , mpl::false_
51               , has_phx2_result_impl<typename F::template result<F(A0 , A1)> >
52             >::type
53         {};
54         template <typename F, typename A0 , typename A1>
55         struct phx2_result<F, A0 , A1>
56         {
57             typedef typename F::template result<A0 , A1>::type type;
58         };
59 
60         template <typename F, typename A0 , typename A1>
61         struct phx2_result<F, A0 & , A1 &>
62         {
63             typedef typename F::template result<A0 , A1>::type type;
64         };
65 
66         template <typename F, typename A0 , typename A1>
67         struct phx2_result<F, A0 const& , A1 const&>
68         {
69             typedef typename F::template result<A0 , A1>::type type;
70         };
71 
72 
73 
74 
75 
76 
77 
78         template <typename F, typename A0 , typename A1 , typename A2>
79         struct has_phx2_result<F, A0 , A1 , A2>
80             : mpl::eval_if<
81                 has_result_type<F>
82               , mpl::false_
83               , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2)> >
84             >::type
85         {};
86         template <typename F, typename A0 , typename A1 , typename A2>
87         struct phx2_result<F, A0 , A1 , A2>
88         {
89             typedef typename F::template result<A0 , A1 , A2>::type type;
90         };
91 
92         template <typename F, typename A0 , typename A1 , typename A2>
93         struct phx2_result<F, A0 & , A1 & , A2 &>
94         {
95             typedef typename F::template result<A0 , A1 , A2>::type type;
96         };
97 
98         template <typename F, typename A0 , typename A1 , typename A2>
99         struct phx2_result<F, A0 const& , A1 const& , A2 const&>
100         {
101             typedef typename F::template result<A0 , A1 , A2>::type type;
102         };
103 
104 
105 
106 
107 
108 
109 
110         template <typename F, typename A0 , typename A1 , typename A2 , typename A3>
111         struct has_phx2_result<F, A0 , A1 , A2 , A3>
112             : mpl::eval_if<
113                 has_result_type<F>
114               , mpl::false_
115               , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3)> >
116             >::type
117         {};
118         template <typename F, typename A0 , typename A1 , typename A2 , typename A3>
119         struct phx2_result<F, A0 , A1 , A2 , A3>
120         {
121             typedef typename F::template result<A0 , A1 , A2 , A3>::type type;
122         };
123 
124         template <typename F, typename A0 , typename A1 , typename A2 , typename A3>
125         struct phx2_result<F, A0 & , A1 & , A2 & , A3 &>
126         {
127             typedef typename F::template result<A0 , A1 , A2 , A3>::type type;
128         };
129 
130         template <typename F, typename A0 , typename A1 , typename A2 , typename A3>
131         struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const&>
132         {
133             typedef typename F::template result<A0 , A1 , A2 , A3>::type type;
134         };
135 
136 
137 
138 
139 
140 
141 
142         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
143         struct has_phx2_result<F, A0 , A1 , A2 , A3 , A4>
144             : mpl::eval_if<
145                 has_result_type<F>
146               , mpl::false_
147               , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3 , A4)> >
148             >::type
149         {};
150         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
151         struct phx2_result<F, A0 , A1 , A2 , A3 , A4>
152         {
153             typedef typename F::template result<A0 , A1 , A2 , A3 , A4>::type type;
154         };
155 
156         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
157         struct phx2_result<F, A0 & , A1 & , A2 & , A3 & , A4 &>
158         {
159             typedef typename F::template result<A0 , A1 , A2 , A3 , A4>::type type;
160         };
161 
162         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
163         struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const& , A4 const&>
164         {
165             typedef typename F::template result<A0 , A1 , A2 , A3 , A4>::type type;
166         };
167 
168 
169 
170 
171 
172 
173 
174         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
175         struct has_phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5>
176             : mpl::eval_if<
177                 has_result_type<F>
178               , mpl::false_
179               , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3 , A4 , A5)> >
180             >::type
181         {};
182         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
183         struct phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5>
184         {
185             typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5>::type type;
186         };
187 
188         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
189         struct phx2_result<F, A0 & , A1 & , A2 & , A3 & , A4 & , A5 &>
190         {
191             typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5>::type type;
192         };
193 
194         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
195         struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const& , A4 const& , A5 const&>
196         {
197             typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5>::type type;
198         };
199 
200 
201 
202 
203 
204 
205 
206         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
207         struct has_phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6>
208             : mpl::eval_if<
209                 has_result_type<F>
210               , mpl::false_
211               , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3 , A4 , A5 , A6)> >
212             >::type
213         {};
214         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
215         struct phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6>
216         {
217             typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6>::type type;
218         };
219 
220         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
221         struct phx2_result<F, A0 & , A1 & , A2 & , A3 & , A4 & , A5 & , A6 &>
222         {
223             typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6>::type type;
224         };
225 
226         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
227         struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const& , A4 const& , A5 const& , A6 const&>
228         {
229             typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6>::type type;
230         };
231 
232 
233 
234 
235 
236 
237 
238         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
239         struct has_phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>
240             : mpl::eval_if<
241                 has_result_type<F>
242               , mpl::false_
243               , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> >
244             >::type
245         {};
246         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
247         struct phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>
248         {
249             typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>::type type;
250         };
251 
252         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
253         struct phx2_result<F, A0 & , A1 & , A2 & , A3 & , A4 & , A5 & , A6 & , A7 &>
254         {
255             typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>::type type;
256         };
257 
258         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
259         struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const& , A4 const& , A5 const& , A6 const& , A7 const&>
260         {
261             typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>::type type;
262         };
263 
264 
265 
266 
267 
268 
269 
270         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
271         struct has_phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>
272             : mpl::eval_if<
273                 has_result_type<F>
274               , mpl::false_
275               , has_phx2_result_impl<typename F::template result<F(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> >
276             >::type
277         {};
278         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
279         struct phx2_result<F, A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>
280         {
281             typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>::type type;
282         };
283 
284         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
285         struct phx2_result<F, A0 & , A1 & , A2 & , A3 & , A4 & , A5 & , A6 & , A7 & , A8 &>
286         {
287             typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>::type type;
288         };
289 
290         template <typename F, typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
291         struct phx2_result<F, A0 const& , A1 const& , A2 const& , A3 const& , A4 const& , A5 const& , A6 const& , A7 const& , A8 const&>
292         {
293             typedef typename F::template result<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>::type type;
294         };
295