make_gcc_workaround.hpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. ///////////////////////////////////////////////////////////////////////////////
  2. /// \file make_gcc_workaround.hpp
  3. /// Special workaround code to make the make\<\> transform work on certain
  4. /// versions of gcc.
  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 Tag, typename Args, long Arity >
  10. struct make<proto::expr<Tag, Args, Arity>()>
  11. : transform<make<proto::expr<Tag, Args, Arity>()> >
  12. {
  13. template<typename Expr, typename State, typename Data>
  14. struct impl : transform_impl<Expr, State, Data>
  15. {
  16. typedef proto::expr<Tag, Args, Arity> result_type;
  17. BOOST_FORCEINLINE
  18. result_type operator ()(
  19. typename impl::expr_param e
  20. , typename impl::state_param s
  21. , typename impl::data_param d
  22. ) const
  23. {
  24. return proto::expr<Tag, Args, Arity>::make(
  25. );
  26. }
  27. };
  28. };
  29. template<typename Tag, typename Args, long Arity >
  30. struct make<proto::basic_expr<Tag, Args, Arity>()>
  31. : transform<make<proto::basic_expr<Tag, Args, Arity>()> >
  32. {
  33. template<typename Expr, typename State, typename Data>
  34. struct impl : transform_impl<Expr, State, Data>
  35. {
  36. typedef proto::basic_expr<Tag, Args, Arity> result_type;
  37. BOOST_FORCEINLINE
  38. result_type operator ()(
  39. typename impl::expr_param e
  40. , typename impl::state_param s
  41. , typename impl::data_param d
  42. ) const
  43. {
  44. return proto::basic_expr<Tag, Args, Arity>::make(
  45. );
  46. }
  47. };
  48. };
  49. template<typename Tag, typename Args, long Arity , typename A0>
  50. struct make<proto::expr<Tag, Args, Arity>(A0)>
  51. : transform<make<proto::expr<Tag, Args, Arity>(A0)> >
  52. {
  53. template<typename Expr, typename State, typename Data>
  54. struct impl : transform_impl<Expr, State, Data>
  55. {
  56. typedef proto::expr<Tag, Args, Arity> result_type;
  57. BOOST_FORCEINLINE
  58. result_type operator ()(
  59. typename impl::expr_param e
  60. , typename impl::state_param s
  61. , typename impl::data_param d
  62. ) const
  63. {
  64. return proto::expr<Tag, Args, Arity>::make(
  65. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) )
  66. );
  67. }
  68. };
  69. };
  70. template<typename Tag, typename Args, long Arity , typename A0>
  71. struct make<proto::basic_expr<Tag, Args, Arity>(A0)>
  72. : transform<make<proto::basic_expr<Tag, Args, Arity>(A0)> >
  73. {
  74. template<typename Expr, typename State, typename Data>
  75. struct impl : transform_impl<Expr, State, Data>
  76. {
  77. typedef proto::basic_expr<Tag, Args, Arity> result_type;
  78. BOOST_FORCEINLINE
  79. result_type operator ()(
  80. typename impl::expr_param e
  81. , typename impl::state_param s
  82. , typename impl::data_param d
  83. ) const
  84. {
  85. return proto::basic_expr<Tag, Args, Arity>::make(
  86. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) )
  87. );
  88. }
  89. };
  90. };
  91. template<typename Tag, typename Args, long Arity , typename A0 , typename A1>
  92. struct make<proto::expr<Tag, Args, Arity>(A0 , A1)>
  93. : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1)> >
  94. {
  95. template<typename Expr, typename State, typename Data>
  96. struct impl : transform_impl<Expr, State, Data>
  97. {
  98. typedef proto::expr<Tag, Args, Arity> result_type;
  99. BOOST_FORCEINLINE
  100. result_type operator ()(
  101. typename impl::expr_param e
  102. , typename impl::state_param s
  103. , typename impl::data_param d
  104. ) const
  105. {
  106. return proto::expr<Tag, Args, Arity>::make(
  107. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) )
  108. );
  109. }
  110. };
  111. };
  112. template<typename Tag, typename Args, long Arity , typename A0 , typename A1>
  113. struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1)>
  114. : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1)> >
  115. {
  116. template<typename Expr, typename State, typename Data>
  117. struct impl : transform_impl<Expr, State, Data>
  118. {
  119. typedef proto::basic_expr<Tag, Args, Arity> result_type;
  120. BOOST_FORCEINLINE
  121. result_type operator ()(
  122. typename impl::expr_param e
  123. , typename impl::state_param s
  124. , typename impl::data_param d
  125. ) const
  126. {
  127. return proto::basic_expr<Tag, Args, Arity>::make(
  128. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) )
  129. );
  130. }
  131. };
  132. };
  133. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2>
  134. struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2)>
  135. : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2)> >
  136. {
  137. template<typename Expr, typename State, typename Data>
  138. struct impl : transform_impl<Expr, State, Data>
  139. {
  140. typedef proto::expr<Tag, Args, Arity> result_type;
  141. BOOST_FORCEINLINE
  142. result_type operator ()(
  143. typename impl::expr_param e
  144. , typename impl::state_param s
  145. , typename impl::data_param d
  146. ) const
  147. {
  148. return proto::expr<Tag, Args, Arity>::make(
  149. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) )
  150. );
  151. }
  152. };
  153. };
  154. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2>
  155. struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2)>
  156. : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2)> >
  157. {
  158. template<typename Expr, typename State, typename Data>
  159. struct impl : transform_impl<Expr, State, Data>
  160. {
  161. typedef proto::basic_expr<Tag, Args, Arity> result_type;
  162. BOOST_FORCEINLINE
  163. result_type operator ()(
  164. typename impl::expr_param e
  165. , typename impl::state_param s
  166. , typename impl::data_param d
  167. ) const
  168. {
  169. return proto::basic_expr<Tag, Args, Arity>::make(
  170. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) )
  171. );
  172. }
  173. };
  174. };
  175. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3>
  176. struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3)>
  177. : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3)> >
  178. {
  179. template<typename Expr, typename State, typename Data>
  180. struct impl : transform_impl<Expr, State, Data>
  181. {
  182. typedef proto::expr<Tag, Args, Arity> result_type;
  183. BOOST_FORCEINLINE
  184. result_type operator ()(
  185. typename impl::expr_param e
  186. , typename impl::state_param s
  187. , typename impl::data_param d
  188. ) const
  189. {
  190. return proto::expr<Tag, Args, Arity>::make(
  191. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) )
  192. );
  193. }
  194. };
  195. };
  196. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3>
  197. struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3)>
  198. : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3)> >
  199. {
  200. template<typename Expr, typename State, typename Data>
  201. struct impl : transform_impl<Expr, State, Data>
  202. {
  203. typedef proto::basic_expr<Tag, Args, Arity> result_type;
  204. BOOST_FORCEINLINE
  205. result_type operator ()(
  206. typename impl::expr_param e
  207. , typename impl::state_param s
  208. , typename impl::data_param d
  209. ) const
  210. {
  211. return proto::basic_expr<Tag, Args, Arity>::make(
  212. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) )
  213. );
  214. }
  215. };
  216. };
  217. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
  218. struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4)>
  219. : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4)> >
  220. {
  221. template<typename Expr, typename State, typename Data>
  222. struct impl : transform_impl<Expr, State, Data>
  223. {
  224. typedef proto::expr<Tag, Args, Arity> result_type;
  225. BOOST_FORCEINLINE
  226. result_type operator ()(
  227. typename impl::expr_param e
  228. , typename impl::state_param s
  229. , typename impl::data_param d
  230. ) const
  231. {
  232. return proto::expr<Tag, Args, Arity>::make(
  233. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) )
  234. );
  235. }
  236. };
  237. };
  238. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
  239. struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4)>
  240. : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4)> >
  241. {
  242. template<typename Expr, typename State, typename Data>
  243. struct impl : transform_impl<Expr, State, Data>
  244. {
  245. typedef proto::basic_expr<Tag, Args, Arity> result_type;
  246. BOOST_FORCEINLINE
  247. result_type operator ()(
  248. typename impl::expr_param e
  249. , typename impl::state_param s
  250. , typename impl::data_param d
  251. ) const
  252. {
  253. return proto::basic_expr<Tag, Args, Arity>::make(
  254. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) )
  255. );
  256. }
  257. };
  258. };
  259. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
  260. struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5)>
  261. : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5)> >
  262. {
  263. template<typename Expr, typename State, typename Data>
  264. struct impl : transform_impl<Expr, State, Data>
  265. {
  266. typedef proto::expr<Tag, Args, Arity> result_type;
  267. BOOST_FORCEINLINE
  268. result_type operator ()(
  269. typename impl::expr_param e
  270. , typename impl::state_param s
  271. , typename impl::data_param d
  272. ) const
  273. {
  274. return proto::expr<Tag, Args, Arity>::make(
  275. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) )
  276. );
  277. }
  278. };
  279. };
  280. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
  281. struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5)>
  282. : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5)> >
  283. {
  284. template<typename Expr, typename State, typename Data>
  285. struct impl : transform_impl<Expr, State, Data>
  286. {
  287. typedef proto::basic_expr<Tag, Args, Arity> result_type;
  288. BOOST_FORCEINLINE
  289. result_type operator ()(
  290. typename impl::expr_param e
  291. , typename impl::state_param s
  292. , typename impl::data_param d
  293. ) const
  294. {
  295. return proto::basic_expr<Tag, Args, Arity>::make(
  296. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) )
  297. );
  298. }
  299. };
  300. };
  301. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
  302. struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6)>
  303. : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6)> >
  304. {
  305. template<typename Expr, typename State, typename Data>
  306. struct impl : transform_impl<Expr, State, Data>
  307. {
  308. typedef proto::expr<Tag, Args, Arity> result_type;
  309. BOOST_FORCEINLINE
  310. result_type operator ()(
  311. typename impl::expr_param e
  312. , typename impl::state_param s
  313. , typename impl::data_param d
  314. ) const
  315. {
  316. return proto::expr<Tag, Args, Arity>::make(
  317. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) )
  318. );
  319. }
  320. };
  321. };
  322. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
  323. struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6)>
  324. : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6)> >
  325. {
  326. template<typename Expr, typename State, typename Data>
  327. struct impl : transform_impl<Expr, State, Data>
  328. {
  329. typedef proto::basic_expr<Tag, Args, Arity> result_type;
  330. BOOST_FORCEINLINE
  331. result_type operator ()(
  332. typename impl::expr_param e
  333. , typename impl::state_param s
  334. , typename impl::data_param d
  335. ) const
  336. {
  337. return proto::basic_expr<Tag, Args, Arity>::make(
  338. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) )
  339. );
  340. }
  341. };
  342. };
  343. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
  344. struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)>
  345. : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> >
  346. {
  347. template<typename Expr, typename State, typename Data>
  348. struct impl : transform_impl<Expr, State, Data>
  349. {
  350. typedef proto::expr<Tag, Args, Arity> result_type;
  351. BOOST_FORCEINLINE
  352. result_type operator ()(
  353. typename impl::expr_param e
  354. , typename impl::state_param s
  355. , typename impl::data_param d
  356. ) const
  357. {
  358. return proto::expr<Tag, Args, Arity>::make(
  359. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) )
  360. );
  361. }
  362. };
  363. };
  364. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
  365. struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)>
  366. : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> >
  367. {
  368. template<typename Expr, typename State, typename Data>
  369. struct impl : transform_impl<Expr, State, Data>
  370. {
  371. typedef proto::basic_expr<Tag, Args, Arity> result_type;
  372. BOOST_FORCEINLINE
  373. result_type operator ()(
  374. typename impl::expr_param e
  375. , typename impl::state_param s
  376. , typename impl::data_param d
  377. ) const
  378. {
  379. return proto::basic_expr<Tag, Args, Arity>::make(
  380. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) )
  381. );
  382. }
  383. };
  384. };
  385. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
  386. struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)>
  387. : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> >
  388. {
  389. template<typename Expr, typename State, typename Data>
  390. struct impl : transform_impl<Expr, State, Data>
  391. {
  392. typedef proto::expr<Tag, Args, Arity> result_type;
  393. BOOST_FORCEINLINE
  394. result_type operator ()(
  395. typename impl::expr_param e
  396. , typename impl::state_param s
  397. , typename impl::data_param d
  398. ) const
  399. {
  400. return proto::expr<Tag, Args, Arity>::make(
  401. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl<Expr, State, Data>()(e, s, d) )
  402. );
  403. }
  404. };
  405. };
  406. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
  407. struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)>
  408. : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> >
  409. {
  410. template<typename Expr, typename State, typename Data>
  411. struct impl : transform_impl<Expr, State, Data>
  412. {
  413. typedef proto::basic_expr<Tag, Args, Arity> result_type;
  414. BOOST_FORCEINLINE
  415. result_type operator ()(
  416. typename impl::expr_param e
  417. , typename impl::state_param s
  418. , typename impl::data_param d
  419. ) const
  420. {
  421. return proto::basic_expr<Tag, Args, Arity>::make(
  422. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl<Expr, State, Data>()(e, s, d) )
  423. );
  424. }
  425. };
  426. };
  427. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
  428. struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)>
  429. : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)> >
  430. {
  431. template<typename Expr, typename State, typename Data>
  432. struct impl : transform_impl<Expr, State, Data>
  433. {
  434. typedef proto::expr<Tag, Args, Arity> result_type;
  435. BOOST_FORCEINLINE
  436. result_type operator ()(
  437. typename impl::expr_param e
  438. , typename impl::state_param s
  439. , typename impl::data_param d
  440. ) const
  441. {
  442. return proto::expr<Tag, Args, Arity>::make(
  443. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A9>::template impl<Expr, State, Data>()(e, s, d) )
  444. );
  445. }
  446. };
  447. };
  448. template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
  449. struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)>
  450. : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)> >
  451. {
  452. template<typename Expr, typename State, typename Data>
  453. struct impl : transform_impl<Expr, State, Data>
  454. {
  455. typedef proto::basic_expr<Tag, Args, Arity> result_type;
  456. BOOST_FORCEINLINE
  457. result_type operator ()(
  458. typename impl::expr_param e
  459. , typename impl::state_param s
  460. , typename impl::data_param d
  461. ) const
  462. {
  463. return proto::basic_expr<Tag, Args, Arity>::make(
  464. detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A9>::template impl<Expr, State, Data>()(e, s, d) )
  465. );
  466. }
  467. };
  468. };