call.hpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. ///////////////////////////////////////////////////////////////////////////////
  2. /// \file call.hpp
  3. /// Contains definition of the call<> transform.
  4. //
  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)
  8. template<typename Fun , typename A0>
  9. struct call<Fun(A0...)> : transform<call<Fun(A0...)> >
  10. {
  11. template<typename Expr, typename State, typename Data>
  12. struct impl
  13. : call<
  14. typename detail::expand_pattern<
  15. proto::arity_of<Expr>::value
  16. , A0
  17. , detail::expand_pattern_rest_0<
  18. Fun
  19. >
  20. >::type
  21. >::template impl<Expr, State, Data>
  22. {};
  23. };
  24. template<typename Fun , typename A0 , typename A1>
  25. struct call<Fun(A0 , A1...)> : transform<call<Fun(A0 , A1...)> >
  26. {
  27. template<typename Expr, typename State, typename Data>
  28. struct impl
  29. : call<
  30. typename detail::expand_pattern<
  31. proto::arity_of<Expr>::value
  32. , A1
  33. , detail::expand_pattern_rest_1<
  34. Fun
  35. , A0
  36. >
  37. >::type
  38. >::template impl<Expr, State, Data>
  39. {};
  40. };
  41. template<typename Fun , typename A0 , typename A1 , typename A2>
  42. struct call<Fun(A0 , A1 , A2...)> : transform<call<Fun(A0 , A1 , A2...)> >
  43. {
  44. template<typename Expr, typename State, typename Data>
  45. struct impl
  46. : call<
  47. typename detail::expand_pattern<
  48. proto::arity_of<Expr>::value
  49. , A2
  50. , detail::expand_pattern_rest_2<
  51. Fun
  52. , A0 , A1
  53. >
  54. >::type
  55. >::template impl<Expr, State, Data>
  56. {};
  57. };
  58. template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3>
  59. struct call<Fun(A0 , A1 , A2 , A3)> : transform<call<Fun(A0 , A1 , A2 , A3)> >
  60. {
  61. template<typename Expr, typename State, typename Data>
  62. struct impl : transform_impl<Expr, State, Data>
  63. {
  64. 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;
  65. typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3)> function_traits;
  66. typedef typename function_traits::result_type result_type;
  67. BOOST_FORCEINLINE
  68. result_type operator ()(
  69. typename impl::expr_param e
  70. , typename impl::state_param s
  71. , typename impl::data_param d
  72. ) const
  73. {
  74. typedef typename function_traits::function_type function_type;
  75. 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)));
  76. }
  77. };
  78. };
  79. template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3>
  80. struct call<Fun(A0 , A1 , A2 , A3...)> : transform<call<Fun(A0 , A1 , A2 , A3...)> >
  81. {
  82. template<typename Expr, typename State, typename Data>
  83. struct impl
  84. : call<
  85. typename detail::expand_pattern<
  86. proto::arity_of<Expr>::value
  87. , A3
  88. , detail::expand_pattern_rest_3<
  89. Fun
  90. , A0 , A1 , A2
  91. >
  92. >::type
  93. >::template impl<Expr, State, Data>
  94. {};
  95. };
  96. template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
  97. struct call<Fun(A0 , A1 , A2 , A3 , A4)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4)> >
  98. {
  99. template<typename Expr, typename State, typename Data>
  100. struct impl : transform_impl<Expr, State, Data>
  101. {
  102. 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;
  103. typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4)> function_traits;
  104. typedef typename function_traits::result_type result_type;
  105. BOOST_FORCEINLINE
  106. result_type operator ()(
  107. typename impl::expr_param e
  108. , typename impl::state_param s
  109. , typename impl::data_param d
  110. ) const
  111. {
  112. typedef typename function_traits::function_type function_type;
  113. 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)));
  114. }
  115. };
  116. };
  117. template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
  118. struct call<Fun(A0 , A1 , A2 , A3 , A4...)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4...)> >
  119. {
  120. template<typename Expr, typename State, typename Data>
  121. struct impl
  122. : call<
  123. typename detail::expand_pattern<
  124. proto::arity_of<Expr>::value
  125. , A4
  126. , detail::expand_pattern_rest_4<
  127. Fun
  128. , A0 , A1 , A2 , A3
  129. >
  130. >::type
  131. >::template impl<Expr, State, Data>
  132. {};
  133. };
  134. template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
  135. struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5)> >
  136. {
  137. template<typename Expr, typename State, typename Data>
  138. struct impl : transform_impl<Expr, State, Data>
  139. {
  140. 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;
  141. typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4 , b5)> function_traits;
  142. typedef typename function_traits::result_type result_type;
  143. BOOST_FORCEINLINE
  144. result_type operator ()(
  145. typename impl::expr_param e
  146. , typename impl::state_param s
  147. , typename impl::data_param d
  148. ) const
  149. {
  150. typedef typename function_traits::function_type function_type;
  151. 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)));
  152. }
  153. };
  154. };
  155. template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
  156. struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5...)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5...)> >
  157. {
  158. template<typename Expr, typename State, typename Data>
  159. struct impl
  160. : call<
  161. typename detail::expand_pattern<
  162. proto::arity_of<Expr>::value
  163. , A5
  164. , detail::expand_pattern_rest_5<
  165. Fun
  166. , A0 , A1 , A2 , A3 , A4
  167. >
  168. >::type
  169. >::template impl<Expr, State, Data>
  170. {};
  171. };
  172. template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
  173. struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6)> >
  174. {
  175. template<typename Expr, typename State, typename Data>
  176. struct impl : transform_impl<Expr, State, Data>
  177. {
  178. 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;
  179. typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4 , b5 , b6)> function_traits;
  180. typedef typename function_traits::result_type result_type;
  181. BOOST_FORCEINLINE
  182. result_type operator ()(
  183. typename impl::expr_param e
  184. , typename impl::state_param s
  185. , typename impl::data_param d
  186. ) const
  187. {
  188. typedef typename function_traits::function_type function_type;
  189. 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)));
  190. }
  191. };
  192. };
  193. template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
  194. struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6...)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6...)> >
  195. {
  196. template<typename Expr, typename State, typename Data>
  197. struct impl
  198. : call<
  199. typename detail::expand_pattern<
  200. proto::arity_of<Expr>::value
  201. , A6
  202. , detail::expand_pattern_rest_6<
  203. Fun
  204. , A0 , A1 , A2 , A3 , A4 , A5
  205. >
  206. >::type
  207. >::template impl<Expr, State, Data>
  208. {};
  209. };
  210. template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
  211. struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> >
  212. {
  213. template<typename Expr, typename State, typename Data>
  214. struct impl : transform_impl<Expr, State, Data>
  215. {
  216. 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;
  217. typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4 , b5 , b6 , b7)> function_traits;
  218. typedef typename function_traits::result_type result_type;
  219. BOOST_FORCEINLINE
  220. result_type operator ()(
  221. typename impl::expr_param e
  222. , typename impl::state_param s
  223. , typename impl::data_param d
  224. ) const
  225. {
  226. typedef typename function_traits::function_type function_type;
  227. 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)));
  228. }
  229. };
  230. };
  231. template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
  232. struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7...)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7...)> >
  233. {
  234. template<typename Expr, typename State, typename Data>
  235. struct impl
  236. : call<
  237. typename detail::expand_pattern<
  238. proto::arity_of<Expr>::value
  239. , A7
  240. , detail::expand_pattern_rest_7<
  241. Fun
  242. , A0 , A1 , A2 , A3 , A4 , A5 , A6
  243. >
  244. >::type
  245. >::template impl<Expr, State, Data>
  246. {};
  247. };
  248. template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
  249. struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> >
  250. {
  251. template<typename Expr, typename State, typename Data>
  252. struct impl : transform_impl<Expr, State, Data>
  253. {
  254. 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;
  255. typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4 , b5 , b6 , b7 , b8)> function_traits;
  256. typedef typename function_traits::result_type result_type;
  257. BOOST_FORCEINLINE
  258. result_type operator ()(
  259. typename impl::expr_param e
  260. , typename impl::state_param s
  261. , typename impl::data_param d
  262. ) const
  263. {
  264. typedef typename function_traits::function_type function_type;
  265. 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)));
  266. }
  267. };
  268. };
  269. template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
  270. struct call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8...)> : transform<call<Fun(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8...)> >
  271. {
  272. template<typename Expr, typename State, typename Data>
  273. struct impl
  274. : call<
  275. typename detail::expand_pattern<
  276. proto::arity_of<Expr>::value
  277. , A8
  278. , detail::expand_pattern_rest_8<
  279. Fun
  280. , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7
  281. >
  282. >::type
  283. >::template impl<Expr, State, Data>
  284. {};
  285. };
  286. template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
  287. 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)> >
  288. {
  289. template<typename Expr, typename State, typename Data>
  290. struct impl : transform_impl<Expr, State, Data>
  291. {
  292. 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;
  293. typedef detail::poly_function_traits<Fun, Fun(b0 , b1 , b2 , b3 , b4 , b5 , b6 , b7 , b8 , b9)> function_traits;
  294. typedef typename function_traits::result_type result_type;
  295. BOOST_FORCEINLINE
  296. result_type operator ()(
  297. typename impl::expr_param e
  298. , typename impl::state_param s
  299. , typename impl::data_param d
  300. ) const
  301. {
  302. typedef typename function_traits::function_type function_type;
  303. 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)));
  304. }
  305. };
  306. };
  307. template<typename Fun , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
  308. 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...)> >
  309. {
  310. template<typename Expr, typename State, typename Data>
  311. struct impl
  312. : call<
  313. typename detail::expand_pattern<
  314. proto::arity_of<Expr>::value
  315. , A9
  316. , detail::expand_pattern_rest_9<
  317. Fun
  318. , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8
  319. >
  320. >::type
  321. >::template impl<Expr, State, Data>
  322. {};
  323. };