default_function_impl.hpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. ///////////////////////////////////////////////////////////////////////////////
  2. /// \file default_function_impl.hpp
  3. /// Contains definition of the default_function_impl, the implementation of the
  4. /// _default transform for function-like nodes.
  5. //
  6. // Copyright 2008 Eric Niebler. Distributed under the Boost
  7. // Software License, Version 1.0. (See accompanying file
  8. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. template<typename Grammar, typename Expr, typename State, typename Data>
  10. struct default_function_impl<Grammar, Expr, State, Data, 3>
  11. : transform_impl<Expr, State, Data>
  12. {
  13. typedef typename result_of::child_c< Expr, 0>::type e0; typedef typename Grammar::template impl<e0, State, Data>::result_type r0; typedef typename result_of::child_c< Expr, 1>::type e1; typedef typename Grammar::template impl<e1, State, Data>::result_type r1; typedef typename result_of::child_c< Expr, 2>::type e2; typedef typename Grammar::template impl<e2, State, Data>::result_type r2;
  14. typedef
  15. typename proto::detail::result_of_fixup<r0>::type
  16. function_type;
  17. typedef
  18. typename BOOST_PROTO_RESULT_OF<
  19. function_type(r1 , r2)
  20. >::type
  21. result_type;
  22. result_type operator ()(
  23. typename default_function_impl::expr_param e
  24. , typename default_function_impl::state_param s
  25. , typename default_function_impl::data_param d
  26. ) const
  27. {
  28. return this->invoke(e, s, d, is_member_function_pointer<function_type>());
  29. }
  30. private:
  31. result_type invoke(
  32. typename default_function_impl::expr_param e
  33. , typename default_function_impl::state_param s
  34. , typename default_function_impl::data_param d
  35. , mpl::false_
  36. ) const
  37. {
  38. return typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )(
  39. typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ) , typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d )
  40. );
  41. }
  42. result_type invoke(
  43. typename default_function_impl::expr_param e
  44. , typename default_function_impl::state_param s
  45. , typename default_function_impl::data_param d
  46. , mpl::true_
  47. ) const
  48. {
  49. BOOST_PROTO_USE_GET_POINTER();
  50. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  51. return (
  52. BOOST_PROTO_GET_POINTER(class_type, (typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ))) ->*
  53. typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )
  54. )(typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d ));
  55. }
  56. };
  57. template<typename Grammar, typename Expr, typename State, typename Data>
  58. struct default_function_impl<Grammar, Expr, State, Data, 4>
  59. : transform_impl<Expr, State, Data>
  60. {
  61. typedef typename result_of::child_c< Expr, 0>::type e0; typedef typename Grammar::template impl<e0, State, Data>::result_type r0; typedef typename result_of::child_c< Expr, 1>::type e1; typedef typename Grammar::template impl<e1, State, Data>::result_type r1; typedef typename result_of::child_c< Expr, 2>::type e2; typedef typename Grammar::template impl<e2, State, Data>::result_type r2; typedef typename result_of::child_c< Expr, 3>::type e3; typedef typename Grammar::template impl<e3, State, Data>::result_type r3;
  62. typedef
  63. typename proto::detail::result_of_fixup<r0>::type
  64. function_type;
  65. typedef
  66. typename BOOST_PROTO_RESULT_OF<
  67. function_type(r1 , r2 , r3)
  68. >::type
  69. result_type;
  70. result_type operator ()(
  71. typename default_function_impl::expr_param e
  72. , typename default_function_impl::state_param s
  73. , typename default_function_impl::data_param d
  74. ) const
  75. {
  76. return this->invoke(e, s, d, is_member_function_pointer<function_type>());
  77. }
  78. private:
  79. result_type invoke(
  80. typename default_function_impl::expr_param e
  81. , typename default_function_impl::state_param s
  82. , typename default_function_impl::data_param d
  83. , mpl::false_
  84. ) const
  85. {
  86. return typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )(
  87. typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ) , typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d ) , typename Grammar::template impl<e3, State, Data>()( proto::child_c< 3>( e), s, d )
  88. );
  89. }
  90. result_type invoke(
  91. typename default_function_impl::expr_param e
  92. , typename default_function_impl::state_param s
  93. , typename default_function_impl::data_param d
  94. , mpl::true_
  95. ) const
  96. {
  97. BOOST_PROTO_USE_GET_POINTER();
  98. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  99. return (
  100. BOOST_PROTO_GET_POINTER(class_type, (typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ))) ->*
  101. typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )
  102. )(typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d ) , typename Grammar::template impl<e3, State, Data>()( proto::child_c< 3>( e), s, d ));
  103. }
  104. };
  105. template<typename Grammar, typename Expr, typename State, typename Data>
  106. struct default_function_impl<Grammar, Expr, State, Data, 5>
  107. : transform_impl<Expr, State, Data>
  108. {
  109. typedef typename result_of::child_c< Expr, 0>::type e0; typedef typename Grammar::template impl<e0, State, Data>::result_type r0; typedef typename result_of::child_c< Expr, 1>::type e1; typedef typename Grammar::template impl<e1, State, Data>::result_type r1; typedef typename result_of::child_c< Expr, 2>::type e2; typedef typename Grammar::template impl<e2, State, Data>::result_type r2; typedef typename result_of::child_c< Expr, 3>::type e3; typedef typename Grammar::template impl<e3, State, Data>::result_type r3; typedef typename result_of::child_c< Expr, 4>::type e4; typedef typename Grammar::template impl<e4, State, Data>::result_type r4;
  110. typedef
  111. typename proto::detail::result_of_fixup<r0>::type
  112. function_type;
  113. typedef
  114. typename BOOST_PROTO_RESULT_OF<
  115. function_type(r1 , r2 , r3 , r4)
  116. >::type
  117. result_type;
  118. result_type operator ()(
  119. typename default_function_impl::expr_param e
  120. , typename default_function_impl::state_param s
  121. , typename default_function_impl::data_param d
  122. ) const
  123. {
  124. return this->invoke(e, s, d, is_member_function_pointer<function_type>());
  125. }
  126. private:
  127. result_type invoke(
  128. typename default_function_impl::expr_param e
  129. , typename default_function_impl::state_param s
  130. , typename default_function_impl::data_param d
  131. , mpl::false_
  132. ) const
  133. {
  134. return typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )(
  135. typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ) , typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d ) , typename Grammar::template impl<e3, State, Data>()( proto::child_c< 3>( e), s, d ) , typename Grammar::template impl<e4, State, Data>()( proto::child_c< 4>( e), s, d )
  136. );
  137. }
  138. result_type invoke(
  139. typename default_function_impl::expr_param e
  140. , typename default_function_impl::state_param s
  141. , typename default_function_impl::data_param d
  142. , mpl::true_
  143. ) const
  144. {
  145. BOOST_PROTO_USE_GET_POINTER();
  146. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  147. return (
  148. BOOST_PROTO_GET_POINTER(class_type, (typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ))) ->*
  149. typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )
  150. )(typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d ) , typename Grammar::template impl<e3, State, Data>()( proto::child_c< 3>( e), s, d ) , typename Grammar::template impl<e4, State, Data>()( proto::child_c< 4>( e), s, d ));
  151. }
  152. };
  153. template<typename Grammar, typename Expr, typename State, typename Data>
  154. struct default_function_impl<Grammar, Expr, State, Data, 6>
  155. : transform_impl<Expr, State, Data>
  156. {
  157. typedef typename result_of::child_c< Expr, 0>::type e0; typedef typename Grammar::template impl<e0, State, Data>::result_type r0; typedef typename result_of::child_c< Expr, 1>::type e1; typedef typename Grammar::template impl<e1, State, Data>::result_type r1; typedef typename result_of::child_c< Expr, 2>::type e2; typedef typename Grammar::template impl<e2, State, Data>::result_type r2; typedef typename result_of::child_c< Expr, 3>::type e3; typedef typename Grammar::template impl<e3, State, Data>::result_type r3; typedef typename result_of::child_c< Expr, 4>::type e4; typedef typename Grammar::template impl<e4, State, Data>::result_type r4; typedef typename result_of::child_c< Expr, 5>::type e5; typedef typename Grammar::template impl<e5, State, Data>::result_type r5;
  158. typedef
  159. typename proto::detail::result_of_fixup<r0>::type
  160. function_type;
  161. typedef
  162. typename BOOST_PROTO_RESULT_OF<
  163. function_type(r1 , r2 , r3 , r4 , r5)
  164. >::type
  165. result_type;
  166. result_type operator ()(
  167. typename default_function_impl::expr_param e
  168. , typename default_function_impl::state_param s
  169. , typename default_function_impl::data_param d
  170. ) const
  171. {
  172. return this->invoke(e, s, d, is_member_function_pointer<function_type>());
  173. }
  174. private:
  175. result_type invoke(
  176. typename default_function_impl::expr_param e
  177. , typename default_function_impl::state_param s
  178. , typename default_function_impl::data_param d
  179. , mpl::false_
  180. ) const
  181. {
  182. return typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )(
  183. typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ) , typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d ) , typename Grammar::template impl<e3, State, Data>()( proto::child_c< 3>( e), s, d ) , typename Grammar::template impl<e4, State, Data>()( proto::child_c< 4>( e), s, d ) , typename Grammar::template impl<e5, State, Data>()( proto::child_c< 5>( e), s, d )
  184. );
  185. }
  186. result_type invoke(
  187. typename default_function_impl::expr_param e
  188. , typename default_function_impl::state_param s
  189. , typename default_function_impl::data_param d
  190. , mpl::true_
  191. ) const
  192. {
  193. BOOST_PROTO_USE_GET_POINTER();
  194. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  195. return (
  196. BOOST_PROTO_GET_POINTER(class_type, (typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ))) ->*
  197. typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )
  198. )(typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d ) , typename Grammar::template impl<e3, State, Data>()( proto::child_c< 3>( e), s, d ) , typename Grammar::template impl<e4, State, Data>()( proto::child_c< 4>( e), s, d ) , typename Grammar::template impl<e5, State, Data>()( proto::child_c< 5>( e), s, d ));
  199. }
  200. };
  201. template<typename Grammar, typename Expr, typename State, typename Data>
  202. struct default_function_impl<Grammar, Expr, State, Data, 7>
  203. : transform_impl<Expr, State, Data>
  204. {
  205. typedef typename result_of::child_c< Expr, 0>::type e0; typedef typename Grammar::template impl<e0, State, Data>::result_type r0; typedef typename result_of::child_c< Expr, 1>::type e1; typedef typename Grammar::template impl<e1, State, Data>::result_type r1; typedef typename result_of::child_c< Expr, 2>::type e2; typedef typename Grammar::template impl<e2, State, Data>::result_type r2; typedef typename result_of::child_c< Expr, 3>::type e3; typedef typename Grammar::template impl<e3, State, Data>::result_type r3; typedef typename result_of::child_c< Expr, 4>::type e4; typedef typename Grammar::template impl<e4, State, Data>::result_type r4; typedef typename result_of::child_c< Expr, 5>::type e5; typedef typename Grammar::template impl<e5, State, Data>::result_type r5; typedef typename result_of::child_c< Expr, 6>::type e6; typedef typename Grammar::template impl<e6, State, Data>::result_type r6;
  206. typedef
  207. typename proto::detail::result_of_fixup<r0>::type
  208. function_type;
  209. typedef
  210. typename BOOST_PROTO_RESULT_OF<
  211. function_type(r1 , r2 , r3 , r4 , r5 , r6)
  212. >::type
  213. result_type;
  214. result_type operator ()(
  215. typename default_function_impl::expr_param e
  216. , typename default_function_impl::state_param s
  217. , typename default_function_impl::data_param d
  218. ) const
  219. {
  220. return this->invoke(e, s, d, is_member_function_pointer<function_type>());
  221. }
  222. private:
  223. result_type invoke(
  224. typename default_function_impl::expr_param e
  225. , typename default_function_impl::state_param s
  226. , typename default_function_impl::data_param d
  227. , mpl::false_
  228. ) const
  229. {
  230. return typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )(
  231. typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ) , typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d ) , typename Grammar::template impl<e3, State, Data>()( proto::child_c< 3>( e), s, d ) , typename Grammar::template impl<e4, State, Data>()( proto::child_c< 4>( e), s, d ) , typename Grammar::template impl<e5, State, Data>()( proto::child_c< 5>( e), s, d ) , typename Grammar::template impl<e6, State, Data>()( proto::child_c< 6>( e), s, d )
  232. );
  233. }
  234. result_type invoke(
  235. typename default_function_impl::expr_param e
  236. , typename default_function_impl::state_param s
  237. , typename default_function_impl::data_param d
  238. , mpl::true_
  239. ) const
  240. {
  241. BOOST_PROTO_USE_GET_POINTER();
  242. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  243. return (
  244. BOOST_PROTO_GET_POINTER(class_type, (typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ))) ->*
  245. typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )
  246. )(typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d ) , typename Grammar::template impl<e3, State, Data>()( proto::child_c< 3>( e), s, d ) , typename Grammar::template impl<e4, State, Data>()( proto::child_c< 4>( e), s, d ) , typename Grammar::template impl<e5, State, Data>()( proto::child_c< 5>( e), s, d ) , typename Grammar::template impl<e6, State, Data>()( proto::child_c< 6>( e), s, d ));
  247. }
  248. };
  249. template<typename Grammar, typename Expr, typename State, typename Data>
  250. struct default_function_impl<Grammar, Expr, State, Data, 8>
  251. : transform_impl<Expr, State, Data>
  252. {
  253. typedef typename result_of::child_c< Expr, 0>::type e0; typedef typename Grammar::template impl<e0, State, Data>::result_type r0; typedef typename result_of::child_c< Expr, 1>::type e1; typedef typename Grammar::template impl<e1, State, Data>::result_type r1; typedef typename result_of::child_c< Expr, 2>::type e2; typedef typename Grammar::template impl<e2, State, Data>::result_type r2; typedef typename result_of::child_c< Expr, 3>::type e3; typedef typename Grammar::template impl<e3, State, Data>::result_type r3; typedef typename result_of::child_c< Expr, 4>::type e4; typedef typename Grammar::template impl<e4, State, Data>::result_type r4; typedef typename result_of::child_c< Expr, 5>::type e5; typedef typename Grammar::template impl<e5, State, Data>::result_type r5; typedef typename result_of::child_c< Expr, 6>::type e6; typedef typename Grammar::template impl<e6, State, Data>::result_type r6; typedef typename result_of::child_c< Expr, 7>::type e7; typedef typename Grammar::template impl<e7, State, Data>::result_type r7;
  254. typedef
  255. typename proto::detail::result_of_fixup<r0>::type
  256. function_type;
  257. typedef
  258. typename BOOST_PROTO_RESULT_OF<
  259. function_type(r1 , r2 , r3 , r4 , r5 , r6 , r7)
  260. >::type
  261. result_type;
  262. result_type operator ()(
  263. typename default_function_impl::expr_param e
  264. , typename default_function_impl::state_param s
  265. , typename default_function_impl::data_param d
  266. ) const
  267. {
  268. return this->invoke(e, s, d, is_member_function_pointer<function_type>());
  269. }
  270. private:
  271. result_type invoke(
  272. typename default_function_impl::expr_param e
  273. , typename default_function_impl::state_param s
  274. , typename default_function_impl::data_param d
  275. , mpl::false_
  276. ) const
  277. {
  278. return typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )(
  279. typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ) , typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d ) , typename Grammar::template impl<e3, State, Data>()( proto::child_c< 3>( e), s, d ) , typename Grammar::template impl<e4, State, Data>()( proto::child_c< 4>( e), s, d ) , typename Grammar::template impl<e5, State, Data>()( proto::child_c< 5>( e), s, d ) , typename Grammar::template impl<e6, State, Data>()( proto::child_c< 6>( e), s, d ) , typename Grammar::template impl<e7, State, Data>()( proto::child_c< 7>( e), s, d )
  280. );
  281. }
  282. result_type invoke(
  283. typename default_function_impl::expr_param e
  284. , typename default_function_impl::state_param s
  285. , typename default_function_impl::data_param d
  286. , mpl::true_
  287. ) const
  288. {
  289. BOOST_PROTO_USE_GET_POINTER();
  290. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  291. return (
  292. BOOST_PROTO_GET_POINTER(class_type, (typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ))) ->*
  293. typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )
  294. )(typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d ) , typename Grammar::template impl<e3, State, Data>()( proto::child_c< 3>( e), s, d ) , typename Grammar::template impl<e4, State, Data>()( proto::child_c< 4>( e), s, d ) , typename Grammar::template impl<e5, State, Data>()( proto::child_c< 5>( e), s, d ) , typename Grammar::template impl<e6, State, Data>()( proto::child_c< 6>( e), s, d ) , typename Grammar::template impl<e7, State, Data>()( proto::child_c< 7>( e), s, d ));
  295. }
  296. };
  297. template<typename Grammar, typename Expr, typename State, typename Data>
  298. struct default_function_impl<Grammar, Expr, State, Data, 9>
  299. : transform_impl<Expr, State, Data>
  300. {
  301. typedef typename result_of::child_c< Expr, 0>::type e0; typedef typename Grammar::template impl<e0, State, Data>::result_type r0; typedef typename result_of::child_c< Expr, 1>::type e1; typedef typename Grammar::template impl<e1, State, Data>::result_type r1; typedef typename result_of::child_c< Expr, 2>::type e2; typedef typename Grammar::template impl<e2, State, Data>::result_type r2; typedef typename result_of::child_c< Expr, 3>::type e3; typedef typename Grammar::template impl<e3, State, Data>::result_type r3; typedef typename result_of::child_c< Expr, 4>::type e4; typedef typename Grammar::template impl<e4, State, Data>::result_type r4; typedef typename result_of::child_c< Expr, 5>::type e5; typedef typename Grammar::template impl<e5, State, Data>::result_type r5; typedef typename result_of::child_c< Expr, 6>::type e6; typedef typename Grammar::template impl<e6, State, Data>::result_type r6; typedef typename result_of::child_c< Expr, 7>::type e7; typedef typename Grammar::template impl<e7, State, Data>::result_type r7; typedef typename result_of::child_c< Expr, 8>::type e8; typedef typename Grammar::template impl<e8, State, Data>::result_type r8;
  302. typedef
  303. typename proto::detail::result_of_fixup<r0>::type
  304. function_type;
  305. typedef
  306. typename BOOST_PROTO_RESULT_OF<
  307. function_type(r1 , r2 , r3 , r4 , r5 , r6 , r7 , r8)
  308. >::type
  309. result_type;
  310. result_type operator ()(
  311. typename default_function_impl::expr_param e
  312. , typename default_function_impl::state_param s
  313. , typename default_function_impl::data_param d
  314. ) const
  315. {
  316. return this->invoke(e, s, d, is_member_function_pointer<function_type>());
  317. }
  318. private:
  319. result_type invoke(
  320. typename default_function_impl::expr_param e
  321. , typename default_function_impl::state_param s
  322. , typename default_function_impl::data_param d
  323. , mpl::false_
  324. ) const
  325. {
  326. return typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )(
  327. typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ) , typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d ) , typename Grammar::template impl<e3, State, Data>()( proto::child_c< 3>( e), s, d ) , typename Grammar::template impl<e4, State, Data>()( proto::child_c< 4>( e), s, d ) , typename Grammar::template impl<e5, State, Data>()( proto::child_c< 5>( e), s, d ) , typename Grammar::template impl<e6, State, Data>()( proto::child_c< 6>( e), s, d ) , typename Grammar::template impl<e7, State, Data>()( proto::child_c< 7>( e), s, d ) , typename Grammar::template impl<e8, State, Data>()( proto::child_c< 8>( e), s, d )
  328. );
  329. }
  330. result_type invoke(
  331. typename default_function_impl::expr_param e
  332. , typename default_function_impl::state_param s
  333. , typename default_function_impl::data_param d
  334. , mpl::true_
  335. ) const
  336. {
  337. BOOST_PROTO_USE_GET_POINTER();
  338. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  339. return (
  340. BOOST_PROTO_GET_POINTER(class_type, (typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ))) ->*
  341. typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )
  342. )(typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d ) , typename Grammar::template impl<e3, State, Data>()( proto::child_c< 3>( e), s, d ) , typename Grammar::template impl<e4, State, Data>()( proto::child_c< 4>( e), s, d ) , typename Grammar::template impl<e5, State, Data>()( proto::child_c< 5>( e), s, d ) , typename Grammar::template impl<e6, State, Data>()( proto::child_c< 6>( e), s, d ) , typename Grammar::template impl<e7, State, Data>()( proto::child_c< 7>( e), s, d ) , typename Grammar::template impl<e8, State, Data>()( proto::child_c< 8>( e), s, d ));
  343. }
  344. };
  345. template<typename Grammar, typename Expr, typename State, typename Data>
  346. struct default_function_impl<Grammar, Expr, State, Data, 10>
  347. : transform_impl<Expr, State, Data>
  348. {
  349. typedef typename result_of::child_c< Expr, 0>::type e0; typedef typename Grammar::template impl<e0, State, Data>::result_type r0; typedef typename result_of::child_c< Expr, 1>::type e1; typedef typename Grammar::template impl<e1, State, Data>::result_type r1; typedef typename result_of::child_c< Expr, 2>::type e2; typedef typename Grammar::template impl<e2, State, Data>::result_type r2; typedef typename result_of::child_c< Expr, 3>::type e3; typedef typename Grammar::template impl<e3, State, Data>::result_type r3; typedef typename result_of::child_c< Expr, 4>::type e4; typedef typename Grammar::template impl<e4, State, Data>::result_type r4; typedef typename result_of::child_c< Expr, 5>::type e5; typedef typename Grammar::template impl<e5, State, Data>::result_type r5; typedef typename result_of::child_c< Expr, 6>::type e6; typedef typename Grammar::template impl<e6, State, Data>::result_type r6; typedef typename result_of::child_c< Expr, 7>::type e7; typedef typename Grammar::template impl<e7, State, Data>::result_type r7; typedef typename result_of::child_c< Expr, 8>::type e8; typedef typename Grammar::template impl<e8, State, Data>::result_type r8; typedef typename result_of::child_c< Expr, 9>::type e9; typedef typename Grammar::template impl<e9, State, Data>::result_type r9;
  350. typedef
  351. typename proto::detail::result_of_fixup<r0>::type
  352. function_type;
  353. typedef
  354. typename BOOST_PROTO_RESULT_OF<
  355. function_type(r1 , r2 , r3 , r4 , r5 , r6 , r7 , r8 , r9)
  356. >::type
  357. result_type;
  358. result_type operator ()(
  359. typename default_function_impl::expr_param e
  360. , typename default_function_impl::state_param s
  361. , typename default_function_impl::data_param d
  362. ) const
  363. {
  364. return this->invoke(e, s, d, is_member_function_pointer<function_type>());
  365. }
  366. private:
  367. result_type invoke(
  368. typename default_function_impl::expr_param e
  369. , typename default_function_impl::state_param s
  370. , typename default_function_impl::data_param d
  371. , mpl::false_
  372. ) const
  373. {
  374. return typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )(
  375. typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ) , typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d ) , typename Grammar::template impl<e3, State, Data>()( proto::child_c< 3>( e), s, d ) , typename Grammar::template impl<e4, State, Data>()( proto::child_c< 4>( e), s, d ) , typename Grammar::template impl<e5, State, Data>()( proto::child_c< 5>( e), s, d ) , typename Grammar::template impl<e6, State, Data>()( proto::child_c< 6>( e), s, d ) , typename Grammar::template impl<e7, State, Data>()( proto::child_c< 7>( e), s, d ) , typename Grammar::template impl<e8, State, Data>()( proto::child_c< 8>( e), s, d ) , typename Grammar::template impl<e9, State, Data>()( proto::child_c< 9>( e), s, d )
  376. );
  377. }
  378. result_type invoke(
  379. typename default_function_impl::expr_param e
  380. , typename default_function_impl::state_param s
  381. , typename default_function_impl::data_param d
  382. , mpl::true_
  383. ) const
  384. {
  385. BOOST_PROTO_USE_GET_POINTER();
  386. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  387. return (
  388. BOOST_PROTO_GET_POINTER(class_type, (typename Grammar::template impl<e1, State, Data>()( proto::child_c< 1>( e), s, d ))) ->*
  389. typename Grammar::template impl<e0, State, Data>()( proto::child_c< 0>( e), s, d )
  390. )(typename Grammar::template impl<e2, State, Data>()( proto::child_c< 2>( e), s, d ) , typename Grammar::template impl<e3, State, Data>()( proto::child_c< 3>( e), s, d ) , typename Grammar::template impl<e4, State, Data>()( proto::child_c< 4>( e), s, d ) , typename Grammar::template impl<e5, State, Data>()( proto::child_c< 5>( e), s, d ) , typename Grammar::template impl<e6, State, Data>()( proto::child_c< 6>( e), s, d ) , typename Grammar::template impl<e7, State, Data>()( proto::child_c< 7>( e), s, d ) , typename Grammar::template impl<e8, State, Data>()( proto::child_c< 8>( e), s, d ) , typename Grammar::template impl<e9, State, Data>()( proto::child_c< 9>( e), s, d ));
  391. }
  392. };