/Src/Dependencies/Boost/boost/proto/transform/detail/preprocessed/make_gcc_workaround.hpp

http://hadesmem.googlecode.com/ · C++ Header · 459 lines · 438 code · 13 blank · 8 comment · 0 complexity · 5cf91f84dd3e2b43d11d565df6724897 MD5 · raw file

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