Chris@16
|
1 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
2 /// \file call.hpp
|
Chris@16
|
3 /// Contains definition of the call<> transform.
|
Chris@16
|
4 //
|
Chris@16
|
5 // Copyright 2008 Eric Niebler. Distributed under the Boost
|
Chris@16
|
6 // Software License, Version 1.0. (See accompanying file
|
Chris@16
|
7 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
8
|
Chris@16
|
9
|
Chris@16
|
10
|
Chris@16
|
11 template<typename Fun , typename A0>
|
Chris@16
|
12 struct call<Fun(A0...)> : transform<call<Fun(A0...)> >
|
Chris@16
|
13 {
|
Chris@16
|
14 template<typename Expr, typename State, typename Data>
|
Chris@16
|
15 struct impl
|
Chris@16
|
16 : call<
|
Chris@16
|
17 typename detail::expand_pattern<
|
Chris@16
|
18 proto::arity_of<Expr>::value
|
Chris@16
|
19 , A0
|
Chris@16
|
20 , detail::expand_pattern_rest_0<
|
Chris@16
|
21 Fun
|
Chris@16
|
22
|
Chris@16
|
23 >
|
Chris@16
|
24 >::type
|
Chris@16
|
25 >::template impl<Expr, State, Data>
|
Chris@16
|
26 {};
|
Chris@16
|
27 };
|
Chris@16
|
28
|
Chris@16
|
29
|
Chris@16
|
30
|
Chris@16
|
31 template<typename Fun , typename A0 , typename A1>
|
Chris@16
|
32 struct call<Fun(A0 , A1...)> : transform<call<Fun(A0 , A1...)> >
|
Chris@16
|
33 {
|
Chris@16
|
34 template<typename Expr, typename State, typename Data>
|
Chris@16
|
35 struct impl
|
Chris@16
|
36 : call<
|
Chris@16
|
37 typename detail::expand_pattern<
|
Chris@16
|
38 proto::arity_of<Expr>::value
|
Chris@16
|
39 , A1
|
Chris@16
|
40 , detail::expand_pattern_rest_1<
|
Chris@16
|
41 Fun
|
Chris@16
|
42 , A0
|
Chris@16
|
43 >
|
Chris@16
|
44 >::type
|
Chris@16
|
45 >::template impl<Expr, State, Data>
|
Chris@16
|
46 {};
|
Chris@16
|
47 };
|
Chris@16
|
48
|
Chris@16
|
49
|
Chris@16
|
50
|
Chris@16
|
51 template<typename Fun , typename A0 , typename A1 , typename A2>
|
Chris@16
|
52 struct call<Fun(A0 , A1 , A2...)> : transform<call<Fun(A0 , A1 , A2...)> >
|
Chris@16
|
53 {
|
Chris@16
|
54 template<typename Expr, typename State, typename Data>
|
Chris@16
|
55 struct impl
|
Chris@16
|
56 : call<
|
Chris@16
|
57 typename detail::expand_pattern<
|
Chris@16
|
58 proto::arity_of<Expr>::value
|
Chris@16
|
59 , A2
|
Chris@16
|
60 , detail::expand_pattern_rest_2<
|
Chris@16
|
61 Fun
|
Chris@16
|
62 , A0 , A1
|
Chris@16
|
63 >
|
Chris@16
|
64 >::type
|
Chris@16
|
65 >::template impl<Expr, State, Data>
|
Chris@16
|
66 {};
|
Chris@16
|
67 };
|
Chris@16
|
68
|
Chris@16
|
69
|
Chris@16
|
70
|
Chris@16
|
71 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3>
|
Chris@16
|
72 struct call<Fun(A0 , A1 , A2 , A3)> : transform<call<Fun(A0 , A1 , A2 , A3)> >
|
Chris@16
|
73 {
|
Chris@16
|
74 template<typename Expr, typename State, typename Data>
|
Chris@16
|
75 struct impl : transform_impl<Expr, State, Data>
|
Chris@16
|
76 {
|
Chris@16
|
77 typedef typename when<_, A0>::template impl<Expr, State, Data> a0; typedef typename a0::result_type b0; typedef typename when<_, A1>::template impl<Expr, State, Data> a1; typedef typename a1::result_type b1; typedef typename when<_, A2>::template impl<Expr, State, Data> a2; typedef typename a2::result_type b2; typedef typename when<_, A3>::template impl<Expr, State, Data> a3; typedef typename a3::result_type b3;
|
Chris@16
|
78 typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3)> function_traits;
|
Chris@16
|
79 typedef typename function_traits::result_type result_type;
|
Chris@16
|
80
|
Chris@16
|
81
|
Chris@16
|
82
|
Chris@16
|
83
|
Chris@16
|
84
|
Chris@16
|
85
|
Chris@16
|
86
|
Chris@16
|
87 BOOST_FORCEINLINE
|
Chris@16
|
88 result_type operator ()(
|
Chris@16
|
89 typename impl::expr_param e
|
Chris@16
|
90 , typename impl::state_param s
|
Chris@16
|
91 , typename impl::data_param d
|
Chris@16
|
92 ) const
|
Chris@16
|
93 {
|
Chris@16
|
94 typedef typename function_traits::function_type function_type;
|
Chris@16
|
95 return function_type()(detail::as_lvalue(a0()(e, s, d)) , detail::as_lvalue(a1()(e, s, d)) , detail::as_lvalue(a2()(e, s, d)) , detail::as_lvalue(a3()(e, s, d)));
|
Chris@16
|
96 }
|
Chris@16
|
97 };
|
Chris@16
|
98 };
|
Chris@16
|
99
|
Chris@16
|
100
|
Chris@16
|
101
|
Chris@16
|
102 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3>
|
Chris@16
|
103 struct call<Fun(A0 , A1 , A2 , A3...)> : transform<call<Fun(A0 , A1 , A2 , A3...)> >
|
Chris@16
|
104 {
|
Chris@16
|
105 template<typename Expr, typename State, typename Data>
|
Chris@16
|
106 struct impl
|
Chris@16
|
107 : call<
|
Chris@16
|
108 typename detail::expand_pattern<
|
Chris@16
|
109 proto::arity_of<Expr>::value
|
Chris@16
|
110 , A3
|
Chris@16
|
111 , detail::expand_pattern_rest_3<
|
Chris@16
|
112 Fun
|
Chris@16
|
113 , A0 , A1 , A2
|
Chris@16
|
114 >
|
Chris@16
|
115 >::type
|
Chris@16
|
116 >::template impl<Expr, State, Data>
|
Chris@16
|
117 {};
|
Chris@16
|
118 };
|
Chris@16
|
119
|
Chris@16
|
120
|
Chris@16
|
121
|
Chris@16
|
122 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
|
Chris@16
|
123 struct call<Fun(A0 , A1 , A2 , A3 , A4)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4)> >
|
Chris@16
|
124 {
|
Chris@16
|
125 template<typename Expr, typename State, typename Data>
|
Chris@16
|
126 struct impl : transform_impl<Expr, State, Data>
|
Chris@16
|
127 {
|
Chris@16
|
128 typedef typename when<_, A0>::template impl<Expr, State, Data> a0; typedef typename a0::result_type b0; typedef typename when<_, A1>::template impl<Expr, State, Data> a1; typedef typename a1::result_type b1; typedef typename when<_, A2>::template impl<Expr, State, Data> a2; typedef typename a2::result_type b2; typedef typename when<_, A3>::template impl<Expr, State, Data> a3; typedef typename a3::result_type b3; typedef typename when<_, A4>::template impl<Expr, State, Data> a4; typedef typename a4::result_type b4;
|
Chris@16
|
129 typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4)> function_traits;
|
Chris@16
|
130 typedef typename function_traits::result_type result_type;
|
Chris@16
|
131
|
Chris@16
|
132
|
Chris@16
|
133
|
Chris@16
|
134
|
Chris@16
|
135
|
Chris@16
|
136
|
Chris@16
|
137
|
Chris@16
|
138 BOOST_FORCEINLINE
|
Chris@16
|
139 result_type operator ()(
|
Chris@16
|
140 typename impl::expr_param e
|
Chris@16
|
141 , typename impl::state_param s
|
Chris@16
|
142 , typename impl::data_param d
|
Chris@16
|
143 ) const
|
Chris@16
|
144 {
|
Chris@16
|
145 typedef typename function_traits::function_type function_type;
|
Chris@16
|
146 return function_type()(detail::as_lvalue(a0()(e, s, d)) , detail::as_lvalue(a1()(e, s, d)) , detail::as_lvalue(a2()(e, s, d)) , detail::as_lvalue(a3()(e, s, d)) , detail::as_lvalue(a4()(e, s, d)));
|
Chris@16
|
147 }
|
Chris@16
|
148 };
|
Chris@16
|
149 };
|
Chris@16
|
150
|
Chris@16
|
151
|
Chris@16
|
152
|
Chris@16
|
153 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
|
Chris@16
|
154 struct call<Fun(A0 , A1 , A2 , A3 , A4...)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4...)> >
|
Chris@16
|
155 {
|
Chris@16
|
156 template<typename Expr, typename State, typename Data>
|
Chris@16
|
157 struct impl
|
Chris@16
|
158 : call<
|
Chris@16
|
159 typename detail::expand_pattern<
|
Chris@16
|
160 proto::arity_of<Expr>::value
|
Chris@16
|
161 , A4
|
Chris@16
|
162 , detail::expand_pattern_rest_4<
|
Chris@16
|
163 Fun
|
Chris@16
|
164 , A0 , A1 , A2 , A3
|
Chris@16
|
165 >
|
Chris@16
|
166 >::type
|
Chris@16
|
167 >::template impl<Expr, State, Data>
|
Chris@16
|
168 {};
|
Chris@16
|
169 };
|
Chris@16
|
170
|
Chris@16
|
171
|
Chris@16
|
172
|
Chris@16
|
173 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
|
Chris@16
|
174 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5)> >
|
Chris@16
|
175 {
|
Chris@16
|
176 template<typename Expr, typename State, typename Data>
|
Chris@16
|
177 struct impl : transform_impl<Expr, State, Data>
|
Chris@16
|
178 {
|
Chris@16
|
179 typedef typename when<_, A0>::template impl<Expr, State, Data> a0; typedef typename a0::result_type b0; typedef typename when<_, A1>::template impl<Expr, State, Data> a1; typedef typename a1::result_type b1; typedef typename when<_, A2>::template impl<Expr, State, Data> a2; typedef typename a2::result_type b2; typedef typename when<_, A3>::template impl<Expr, State, Data> a3; typedef typename a3::result_type b3; typedef typename when<_, A4>::template impl<Expr, State, Data> a4; typedef typename a4::result_type b4; typedef typename when<_, A5>::template impl<Expr, State, Data> a5; typedef typename a5::result_type b5;
|
Chris@16
|
180 typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4 , b5)> function_traits;
|
Chris@16
|
181 typedef typename function_traits::result_type result_type;
|
Chris@16
|
182
|
Chris@16
|
183
|
Chris@16
|
184
|
Chris@16
|
185
|
Chris@16
|
186
|
Chris@16
|
187
|
Chris@16
|
188
|
Chris@16
|
189 BOOST_FORCEINLINE
|
Chris@16
|
190 result_type operator ()(
|
Chris@16
|
191 typename impl::expr_param e
|
Chris@16
|
192 , typename impl::state_param s
|
Chris@16
|
193 , typename impl::data_param d
|
Chris@16
|
194 ) const
|
Chris@16
|
195 {
|
Chris@16
|
196 typedef typename function_traits::function_type function_type;
|
Chris@16
|
197 return function_type()(detail::as_lvalue(a0()(e, s, d)) , detail::as_lvalue(a1()(e, s, d)) , detail::as_lvalue(a2()(e, s, d)) , detail::as_lvalue(a3()(e, s, d)) , detail::as_lvalue(a4()(e, s, d)) , detail::as_lvalue(a5()(e, s, d)));
|
Chris@16
|
198 }
|
Chris@16
|
199 };
|
Chris@16
|
200 };
|
Chris@16
|
201
|
Chris@16
|
202
|
Chris@16
|
203
|
Chris@16
|
204 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
|
Chris@16
|
205 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5...)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5...)> >
|
Chris@16
|
206 {
|
Chris@16
|
207 template<typename Expr, typename State, typename Data>
|
Chris@16
|
208 struct impl
|
Chris@16
|
209 : call<
|
Chris@16
|
210 typename detail::expand_pattern<
|
Chris@16
|
211 proto::arity_of<Expr>::value
|
Chris@16
|
212 , A5
|
Chris@16
|
213 , detail::expand_pattern_rest_5<
|
Chris@16
|
214 Fun
|
Chris@16
|
215 , A0 , A1 , A2 , A3 , A4
|
Chris@16
|
216 >
|
Chris@16
|
217 >::type
|
Chris@16
|
218 >::template impl<Expr, State, Data>
|
Chris@16
|
219 {};
|
Chris@16
|
220 };
|
Chris@16
|
221
|
Chris@16
|
222
|
Chris@16
|
223
|
Chris@16
|
224 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
|
Chris@16
|
225 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6)> >
|
Chris@16
|
226 {
|
Chris@16
|
227 template<typename Expr, typename State, typename Data>
|
Chris@16
|
228 struct impl : transform_impl<Expr, State, Data>
|
Chris@16
|
229 {
|
Chris@16
|
230 typedef typename when<_, A0>::template impl<Expr, State, Data> a0; typedef typename a0::result_type b0; typedef typename when<_, A1>::template impl<Expr, State, Data> a1; typedef typename a1::result_type b1; typedef typename when<_, A2>::template impl<Expr, State, Data> a2; typedef typename a2::result_type b2; typedef typename when<_, A3>::template impl<Expr, State, Data> a3; typedef typename a3::result_type b3; typedef typename when<_, A4>::template impl<Expr, State, Data> a4; typedef typename a4::result_type b4; typedef typename when<_, A5>::template impl<Expr, State, Data> a5; typedef typename a5::result_type b5; typedef typename when<_, A6>::template impl<Expr, State, Data> a6; typedef typename a6::result_type b6;
|
Chris@16
|
231 typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4 , b5 , b6)> function_traits;
|
Chris@16
|
232 typedef typename function_traits::result_type result_type;
|
Chris@16
|
233
|
Chris@16
|
234
|
Chris@16
|
235
|
Chris@16
|
236
|
Chris@16
|
237
|
Chris@16
|
238
|
Chris@16
|
239
|
Chris@16
|
240 BOOST_FORCEINLINE
|
Chris@16
|
241 result_type operator ()(
|
Chris@16
|
242 typename impl::expr_param e
|
Chris@16
|
243 , typename impl::state_param s
|
Chris@16
|
244 , typename impl::data_param d
|
Chris@16
|
245 ) const
|
Chris@16
|
246 {
|
Chris@16
|
247 typedef typename function_traits::function_type function_type;
|
Chris@16
|
248 return function_type()(detail::as_lvalue(a0()(e, s, d)) , detail::as_lvalue(a1()(e, s, d)) , detail::as_lvalue(a2()(e, s, d)) , detail::as_lvalue(a3()(e, s, d)) , detail::as_lvalue(a4()(e, s, d)) , detail::as_lvalue(a5()(e, s, d)) , detail::as_lvalue(a6()(e, s, d)));
|
Chris@16
|
249 }
|
Chris@16
|
250 };
|
Chris@16
|
251 };
|
Chris@16
|
252
|
Chris@16
|
253
|
Chris@16
|
254
|
Chris@16
|
255 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
|
Chris@16
|
256 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6...)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6...)> >
|
Chris@16
|
257 {
|
Chris@16
|
258 template<typename Expr, typename State, typename Data>
|
Chris@16
|
259 struct impl
|
Chris@16
|
260 : call<
|
Chris@16
|
261 typename detail::expand_pattern<
|
Chris@16
|
262 proto::arity_of<Expr>::value
|
Chris@16
|
263 , A6
|
Chris@16
|
264 , detail::expand_pattern_rest_6<
|
Chris@16
|
265 Fun
|
Chris@16
|
266 , A0 , A1 , A2 , A3 , A4 , A5
|
Chris@16
|
267 >
|
Chris@16
|
268 >::type
|
Chris@16
|
269 >::template impl<Expr, State, Data>
|
Chris@16
|
270 {};
|
Chris@16
|
271 };
|
Chris@16
|
272
|
Chris@16
|
273
|
Chris@16
|
274
|
Chris@16
|
275 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
|
Chris@16
|
276 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> >
|
Chris@16
|
277 {
|
Chris@16
|
278 template<typename Expr, typename State, typename Data>
|
Chris@16
|
279 struct impl : transform_impl<Expr, State, Data>
|
Chris@16
|
280 {
|
Chris@16
|
281 typedef typename when<_, A0>::template impl<Expr, State, Data> a0; typedef typename a0::result_type b0; typedef typename when<_, A1>::template impl<Expr, State, Data> a1; typedef typename a1::result_type b1; typedef typename when<_, A2>::template impl<Expr, State, Data> a2; typedef typename a2::result_type b2; typedef typename when<_, A3>::template impl<Expr, State, Data> a3; typedef typename a3::result_type b3; typedef typename when<_, A4>::template impl<Expr, State, Data> a4; typedef typename a4::result_type b4; typedef typename when<_, A5>::template impl<Expr, State, Data> a5; typedef typename a5::result_type b5; typedef typename when<_, A6>::template impl<Expr, State, Data> a6; typedef typename a6::result_type b6; typedef typename when<_, A7>::template impl<Expr, State, Data> a7; typedef typename a7::result_type b7;
|
Chris@16
|
282 typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4 , b5 , b6 , b7)> function_traits;
|
Chris@16
|
283 typedef typename function_traits::result_type result_type;
|
Chris@16
|
284
|
Chris@16
|
285
|
Chris@16
|
286
|
Chris@16
|
287
|
Chris@16
|
288
|
Chris@16
|
289
|
Chris@16
|
290
|
Chris@16
|
291 BOOST_FORCEINLINE
|
Chris@16
|
292 result_type operator ()(
|
Chris@16
|
293 typename impl::expr_param e
|
Chris@16
|
294 , typename impl::state_param s
|
Chris@16
|
295 , typename impl::data_param d
|
Chris@16
|
296 ) const
|
Chris@16
|
297 {
|
Chris@16
|
298 typedef typename function_traits::function_type function_type;
|
Chris@16
|
299 return function_type()(detail::as_lvalue(a0()(e, s, d)) , detail::as_lvalue(a1()(e, s, d)) , detail::as_lvalue(a2()(e, s, d)) , detail::as_lvalue(a3()(e, s, d)) , detail::as_lvalue(a4()(e, s, d)) , detail::as_lvalue(a5()(e, s, d)) , detail::as_lvalue(a6()(e, s, d)) , detail::as_lvalue(a7()(e, s, d)));
|
Chris@16
|
300 }
|
Chris@16
|
301 };
|
Chris@16
|
302 };
|
Chris@16
|
303
|
Chris@16
|
304
|
Chris@16
|
305
|
Chris@16
|
306 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
|
Chris@16
|
307 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7...)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7...)> >
|
Chris@16
|
308 {
|
Chris@16
|
309 template<typename Expr, typename State, typename Data>
|
Chris@16
|
310 struct impl
|
Chris@16
|
311 : call<
|
Chris@16
|
312 typename detail::expand_pattern<
|
Chris@16
|
313 proto::arity_of<Expr>::value
|
Chris@16
|
314 , A7
|
Chris@16
|
315 , detail::expand_pattern_rest_7<
|
Chris@16
|
316 Fun
|
Chris@16
|
317 , A0 , A1 , A2 , A3 , A4 , A5 , A6
|
Chris@16
|
318 >
|
Chris@16
|
319 >::type
|
Chris@16
|
320 >::template impl<Expr, State, Data>
|
Chris@16
|
321 {};
|
Chris@16
|
322 };
|
Chris@16
|
323
|
Chris@16
|
324
|
Chris@16
|
325
|
Chris@16
|
326 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
|
Chris@16
|
327 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> >
|
Chris@16
|
328 {
|
Chris@16
|
329 template<typename Expr, typename State, typename Data>
|
Chris@16
|
330 struct impl : transform_impl<Expr, State, Data>
|
Chris@16
|
331 {
|
Chris@16
|
332 typedef typename when<_, A0>::template impl<Expr, State, Data> a0; typedef typename a0::result_type b0; typedef typename when<_, A1>::template impl<Expr, State, Data> a1; typedef typename a1::result_type b1; typedef typename when<_, A2>::template impl<Expr, State, Data> a2; typedef typename a2::result_type b2; typedef typename when<_, A3>::template impl<Expr, State, Data> a3; typedef typename a3::result_type b3; typedef typename when<_, A4>::template impl<Expr, State, Data> a4; typedef typename a4::result_type b4; typedef typename when<_, A5>::template impl<Expr, State, Data> a5; typedef typename a5::result_type b5; typedef typename when<_, A6>::template impl<Expr, State, Data> a6; typedef typename a6::result_type b6; typedef typename when<_, A7>::template impl<Expr, State, Data> a7; typedef typename a7::result_type b7; typedef typename when<_, A8>::template impl<Expr, State, Data> a8; typedef typename a8::result_type b8;
|
Chris@16
|
333 typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4 , b5 , b6 , b7 , b8)> function_traits;
|
Chris@16
|
334 typedef typename function_traits::result_type result_type;
|
Chris@16
|
335
|
Chris@16
|
336
|
Chris@16
|
337
|
Chris@16
|
338
|
Chris@16
|
339
|
Chris@16
|
340
|
Chris@16
|
341
|
Chris@16
|
342 BOOST_FORCEINLINE
|
Chris@16
|
343 result_type operator ()(
|
Chris@16
|
344 typename impl::expr_param e
|
Chris@16
|
345 , typename impl::state_param s
|
Chris@16
|
346 , typename impl::data_param d
|
Chris@16
|
347 ) const
|
Chris@16
|
348 {
|
Chris@16
|
349 typedef typename function_traits::function_type function_type;
|
Chris@16
|
350 return function_type()(detail::as_lvalue(a0()(e, s, d)) , detail::as_lvalue(a1()(e, s, d)) , detail::as_lvalue(a2()(e, s, d)) , detail::as_lvalue(a3()(e, s, d)) , detail::as_lvalue(a4()(e, s, d)) , detail::as_lvalue(a5()(e, s, d)) , detail::as_lvalue(a6()(e, s, d)) , detail::as_lvalue(a7()(e, s, d)) , detail::as_lvalue(a8()(e, s, d)));
|
Chris@16
|
351 }
|
Chris@16
|
352 };
|
Chris@16
|
353 };
|
Chris@16
|
354
|
Chris@16
|
355
|
Chris@16
|
356
|
Chris@16
|
357 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
|
Chris@16
|
358 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8...)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8...)> >
|
Chris@16
|
359 {
|
Chris@16
|
360 template<typename Expr, typename State, typename Data>
|
Chris@16
|
361 struct impl
|
Chris@16
|
362 : call<
|
Chris@16
|
363 typename detail::expand_pattern<
|
Chris@16
|
364 proto::arity_of<Expr>::value
|
Chris@16
|
365 , A8
|
Chris@16
|
366 , detail::expand_pattern_rest_8<
|
Chris@16
|
367 Fun
|
Chris@16
|
368 , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7
|
Chris@16
|
369 >
|
Chris@16
|
370 >::type
|
Chris@16
|
371 >::template impl<Expr, State, Data>
|
Chris@16
|
372 {};
|
Chris@16
|
373 };
|
Chris@16
|
374
|
Chris@16
|
375
|
Chris@16
|
376
|
Chris@16
|
377 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
|
Chris@16
|
378 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)> >
|
Chris@16
|
379 {
|
Chris@16
|
380 template<typename Expr, typename State, typename Data>
|
Chris@16
|
381 struct impl : transform_impl<Expr, State, Data>
|
Chris@16
|
382 {
|
Chris@16
|
383 typedef typename when<_, A0>::template impl<Expr, State, Data> a0; typedef typename a0::result_type b0; typedef typename when<_, A1>::template impl<Expr, State, Data> a1; typedef typename a1::result_type b1; typedef typename when<_, A2>::template impl<Expr, State, Data> a2; typedef typename a2::result_type b2; typedef typename when<_, A3>::template impl<Expr, State, Data> a3; typedef typename a3::result_type b3; typedef typename when<_, A4>::template impl<Expr, State, Data> a4; typedef typename a4::result_type b4; typedef typename when<_, A5>::template impl<Expr, State, Data> a5; typedef typename a5::result_type b5; typedef typename when<_, A6>::template impl<Expr, State, Data> a6; typedef typename a6::result_type b6; typedef typename when<_, A7>::template impl<Expr, State, Data> a7; typedef typename a7::result_type b7; typedef typename when<_, A8>::template impl<Expr, State, Data> a8; typedef typename a8::result_type b8; typedef typename when<_, A9>::template impl<Expr, State, Data> a9; typedef typename a9::result_type b9;
|
Chris@16
|
384 typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4 , b5 , b6 , b7 , b8 , b9)> function_traits;
|
Chris@16
|
385 typedef typename function_traits::result_type result_type;
|
Chris@16
|
386
|
Chris@16
|
387
|
Chris@16
|
388
|
Chris@16
|
389
|
Chris@16
|
390
|
Chris@16
|
391
|
Chris@16
|
392
|
Chris@16
|
393 BOOST_FORCEINLINE
|
Chris@16
|
394 result_type operator ()(
|
Chris@16
|
395 typename impl::expr_param e
|
Chris@16
|
396 , typename impl::state_param s
|
Chris@16
|
397 , typename impl::data_param d
|
Chris@16
|
398 ) const
|
Chris@16
|
399 {
|
Chris@16
|
400 typedef typename function_traits::function_type function_type;
|
Chris@16
|
401 return function_type()(detail::as_lvalue(a0()(e, s, d)) , detail::as_lvalue(a1()(e, s, d)) , detail::as_lvalue(a2()(e, s, d)) , detail::as_lvalue(a3()(e, s, d)) , detail::as_lvalue(a4()(e, s, d)) , detail::as_lvalue(a5()(e, s, d)) , detail::as_lvalue(a6()(e, s, d)) , detail::as_lvalue(a7()(e, s, d)) , detail::as_lvalue(a8()(e, s, d)) , detail::as_lvalue(a9()(e, s, d)));
|
Chris@16
|
402 }
|
Chris@16
|
403 };
|
Chris@16
|
404 };
|
Chris@16
|
405
|
Chris@16
|
406
|
Chris@16
|
407
|
Chris@16
|
408 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
|
Chris@16
|
409 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9...)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9...)> >
|
Chris@16
|
410 {
|
Chris@16
|
411 template<typename Expr, typename State, typename Data>
|
Chris@16
|
412 struct impl
|
Chris@16
|
413 : call<
|
Chris@16
|
414 typename detail::expand_pattern<
|
Chris@16
|
415 proto::arity_of<Expr>::value
|
Chris@16
|
416 , A9
|
Chris@16
|
417 , detail::expand_pattern_rest_9<
|
Chris@16
|
418 Fun
|
Chris@16
|
419 , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8
|
Chris@16
|
420 >
|
Chris@16
|
421 >::type
|
Chris@16
|
422 >::template impl<Expr, State, Data>
|
Chris@16
|
423 {};
|
Chris@16
|
424 };
|