1 ///////////////////////////////////////////////////////////////////////////////
3 /// Contains definition of the call<> transform.
5 // Copyright 2008 Eric Niebler. Distributed under the Boost
6 // Software License, Version 1.0. (See accompanying file
7 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
11 template<typename Fun , typename A0>
12 struct call<Fun(A0...)> : transform<call<Fun(A0...)> >
14 template<typename Expr, typename State, typename Data>
17 typename detail::expand_pattern<
18 proto::arity_of<Expr>::value
20 , detail::expand_pattern_rest_0<
25 >::template impl<Expr, State, Data>
31 template<typename Fun , typename A0 , typename A1>
32 struct call<Fun(A0 , A1...)> : transform<call<Fun(A0 , A1...)> >
34 template<typename Expr, typename State, typename Data>
37 typename detail::expand_pattern<
38 proto::arity_of<Expr>::value
40 , detail::expand_pattern_rest_1<
45 >::template impl<Expr, State, Data>
51 template<typename Fun , typename A0 , typename A1 , typename A2>
52 struct call<Fun(A0 , A1 , A2...)> : transform<call<Fun(A0 , A1 , A2...)> >
54 template<typename Expr, typename State, typename Data>
57 typename detail::expand_pattern<
58 proto::arity_of<Expr>::value
60 , detail::expand_pattern_rest_2<
65 >::template impl<Expr, State, Data>
71 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3>
72 struct call<Fun(A0 , A1 , A2 , A3)> : transform<call<Fun(A0 , A1 , A2 , A3)> >
74 template<typename Expr, typename State, typename Data>
75 struct impl : transform_impl<Expr, State, Data>
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;
78 typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3)> function_traits;
79 typedef typename function_traits::result_type result_type;
88 result_type operator ()(
89 typename impl::expr_param e
90 , typename impl::state_param s
91 , typename impl::data_param d
94 typedef typename function_traits::function_type function_type;
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)));
102 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3>
103 struct call<Fun(A0 , A1 , A2 , A3...)> : transform<call<Fun(A0 , A1 , A2 , A3...)> >
105 template<typename Expr, typename State, typename Data>
108 typename detail::expand_pattern<
109 proto::arity_of<Expr>::value
111 , detail::expand_pattern_rest_3<
116 >::template impl<Expr, State, Data>
122 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
123 struct call<Fun(A0 , A1 , A2 , A3 , A4)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4)> >
125 template<typename Expr, typename State, typename Data>
126 struct impl : transform_impl<Expr, State, Data>
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;
129 typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4)> function_traits;
130 typedef typename function_traits::result_type result_type;
139 result_type operator ()(
140 typename impl::expr_param e
141 , typename impl::state_param s
142 , typename impl::data_param d
145 typedef typename function_traits::function_type function_type;
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)));
153 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
154 struct call<Fun(A0 , A1 , A2 , A3 , A4...)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4...)> >
156 template<typename Expr, typename State, typename Data>
159 typename detail::expand_pattern<
160 proto::arity_of<Expr>::value
162 , detail::expand_pattern_rest_4<
167 >::template impl<Expr, State, Data>
173 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
174 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5)> >
176 template<typename Expr, typename State, typename Data>
177 struct impl : transform_impl<Expr, State, Data>
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;
180 typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4 , b5)> function_traits;
181 typedef typename function_traits::result_type result_type;
190 result_type operator ()(
191 typename impl::expr_param e
192 , typename impl::state_param s
193 , typename impl::data_param d
196 typedef typename function_traits::function_type function_type;
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)));
204 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
205 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5...)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5...)> >
207 template<typename Expr, typename State, typename Data>
210 typename detail::expand_pattern<
211 proto::arity_of<Expr>::value
213 , detail::expand_pattern_rest_5<
215 , A0 , A1 , A2 , A3 , A4
218 >::template impl<Expr, State, Data>
224 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
225 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6)> >
227 template<typename Expr, typename State, typename Data>
228 struct impl : transform_impl<Expr, State, Data>
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;
231 typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4 , b5 , b6)> function_traits;
232 typedef typename function_traits::result_type result_type;
241 result_type operator ()(
242 typename impl::expr_param e
243 , typename impl::state_param s
244 , typename impl::data_param d
247 typedef typename function_traits::function_type function_type;
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)));
255 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
256 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6...)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6...)> >
258 template<typename Expr, typename State, typename Data>
261 typename detail::expand_pattern<
262 proto::arity_of<Expr>::value
264 , detail::expand_pattern_rest_6<
266 , A0 , A1 , A2 , A3 , A4 , A5
269 >::template impl<Expr, State, Data>
275 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
276 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> >
278 template<typename Expr, typename State, typename Data>
279 struct impl : transform_impl<Expr, State, Data>
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;
282 typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4 , b5 , b6 , b7)> function_traits;
283 typedef typename function_traits::result_type result_type;
292 result_type operator ()(
293 typename impl::expr_param e
294 , typename impl::state_param s
295 , typename impl::data_param d
298 typedef typename function_traits::function_type function_type;
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)));
306 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
307 struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7...)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7...)> >
309 template<typename Expr, typename State, typename Data>
312 typename detail::expand_pattern<
313 proto::arity_of<Expr>::value
315 , detail::expand_pattern_rest_7<
317 , A0 , A1 , A2 , A3 , A4 , A5 , A6
320 >::template impl<Expr, State, Data>
326 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
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)> >
329 template<typename Expr, typename State, typename Data>
330 struct impl : transform_impl<Expr, State, Data>
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;
333 typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4 , b5 , b6 , b7 , b8)> function_traits;
334 typedef typename function_traits::result_type result_type;
343 result_type operator ()(
344 typename impl::expr_param e
345 , typename impl::state_param s
346 , typename impl::data_param d
349 typedef typename function_traits::function_type function_type;
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)));
357 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
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...)> >
360 template<typename Expr, typename State, typename Data>
363 typename detail::expand_pattern<
364 proto::arity_of<Expr>::value
366 , detail::expand_pattern_rest_8<
368 , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7
371 >::template impl<Expr, State, Data>
377 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
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)> >
380 template<typename Expr, typename State, typename Data>
381 struct impl : transform_impl<Expr, State, Data>
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;
384 typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4 , b5 , b6 , b7 , b8 , b9)> function_traits;
385 typedef typename function_traits::result_type result_type;
394 result_type operator ()(
395 typename impl::expr_param e
396 , typename impl::state_param s
397 , typename impl::data_param d
400 typedef typename function_traits::function_type function_type;
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)));
408 template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
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...)> >
411 template<typename Expr, typename State, typename Data>
414 typename detail::expand_pattern<
415 proto::arity_of<Expr>::value
417 , detail::expand_pattern_rest_9<
419 , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8
422 >::template impl<Expr, State, Data>