make.hpp 59 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321
  1. ///////////////////////////////////////////////////////////////////////////////
  2. /// \file make.hpp
  3. /// Contains definition of the make<> 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. namespace detail
  9. {
  10. template<typename R >
  11. struct is_applyable<R()>
  12. : mpl::true_
  13. {};
  14. template<typename R >
  15. struct is_applyable<R(*)()>
  16. : mpl::true_
  17. {};
  18. template<typename T, typename A>
  19. struct construct_<proto::expr<T, A, 0>, true>
  20. {
  21. typedef proto::expr<T, A, 0> result_type;
  22. template<typename A0>
  23. BOOST_FORCEINLINE
  24. result_type operator ()(A0 &a0) const
  25. {
  26. return result_type::make(a0);
  27. }
  28. };
  29. template<typename T, typename A>
  30. struct construct_<proto::basic_expr<T, A, 0>, true>
  31. {
  32. typedef proto::basic_expr<T, A, 0> result_type;
  33. template<typename A0>
  34. BOOST_FORCEINLINE
  35. result_type operator ()(A0 &a0) const
  36. {
  37. return result_type::make(a0);
  38. }
  39. };
  40. template<typename Type >
  41. BOOST_FORCEINLINE
  42. Type construct()
  43. {
  44. return construct_<Type>()();
  45. }
  46. }
  47. template<typename Object >
  48. struct make<Object()>
  49. : transform<make<Object()> >
  50. {
  51. template<typename Expr, typename State, typename Data>
  52. struct impl : transform_impl<Expr, State, Data>
  53. {
  54. typedef typename detail::make_if_<Object, Expr, State, Data>::type result_type;
  55. BOOST_FORCEINLINE
  56. result_type operator ()(
  57. typename impl::expr_param e
  58. , typename impl::state_param s
  59. , typename impl::data_param d
  60. ) const
  61. {
  62. proto::detail::ignore_unused(e);
  63. proto::detail::ignore_unused(s);
  64. proto::detail::ignore_unused(d);
  65. return detail::construct<result_type>();
  66. }
  67. };
  68. };
  69. namespace detail
  70. {
  71. template<
  72. template<typename> class R
  73. , typename A0
  74. , typename Expr, typename State, typename Data
  75. >
  76. struct make_<
  77. R<A0>
  78. , Expr, State, Data
  79. BOOST_PROTO_TEMPLATE_ARITY_PARAM(1)
  80. >
  81. : nested_type_if<
  82. R<typename make_if_<A0, Expr, State, Data> ::type>
  83. , (make_if_<A0, Expr, State, Data> ::applied || false)
  84. >
  85. {};
  86. template<
  87. template<typename> class R
  88. , typename A0
  89. , typename Expr, typename State, typename Data
  90. >
  91. struct make_<
  92. noinvoke<R<A0> >
  93. , Expr, State, Data
  94. BOOST_PROTO_TEMPLATE_ARITY_PARAM(1)
  95. >
  96. {
  97. typedef R<typename make_if_<A0, Expr, State, Data> ::type> type;
  98. static bool const applied = true;
  99. };
  100. template<typename R , typename A0>
  101. struct is_applyable<R(A0)>
  102. : mpl::true_
  103. {};
  104. template<typename R , typename A0>
  105. struct is_applyable<R(*)(A0)>
  106. : mpl::true_
  107. {};
  108. template<typename T, typename A>
  109. struct construct_<proto::expr<T, A, 1>, true>
  110. {
  111. typedef proto::expr<T, A, 1> result_type;
  112. template<typename A0>
  113. BOOST_FORCEINLINE
  114. result_type operator ()(A0 &a0) const
  115. {
  116. return result_type::make(a0);
  117. }
  118. };
  119. template<typename T, typename A>
  120. struct construct_<proto::basic_expr<T, A, 1>, true>
  121. {
  122. typedef proto::basic_expr<T, A, 1> result_type;
  123. template<typename A0>
  124. BOOST_FORCEINLINE
  125. result_type operator ()(A0 &a0) const
  126. {
  127. return result_type::make(a0);
  128. }
  129. };
  130. template<typename Type , typename A0>
  131. BOOST_FORCEINLINE
  132. Type construct(A0 &a0)
  133. {
  134. return construct_<Type>()(a0);
  135. }
  136. }
  137. template<typename Object , typename A0>
  138. struct make<Object(A0)>
  139. : transform<make<Object(A0)> >
  140. {
  141. template<typename Expr, typename State, typename Data>
  142. struct impl : transform_impl<Expr, State, Data>
  143. {
  144. typedef typename detail::make_if_<Object, Expr, State, Data>::type result_type;
  145. BOOST_FORCEINLINE
  146. result_type operator ()(
  147. typename impl::expr_param e
  148. , typename impl::state_param s
  149. , typename impl::data_param d
  150. ) const
  151. {
  152. proto::detail::ignore_unused(e);
  153. proto::detail::ignore_unused(s);
  154. proto::detail::ignore_unused(d);
  155. return detail::construct<result_type>(detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ));
  156. }
  157. };
  158. };
  159. template<typename Object , typename A0>
  160. struct make<Object(A0...)>
  161. : transform<make<Object(A0...)> >
  162. {
  163. template<typename Expr, typename State, typename Data>
  164. struct impl
  165. : make<
  166. typename detail::expand_pattern<
  167. proto::arity_of<Expr>::value
  168. , A0
  169. , detail::expand_pattern_rest_0<
  170. Object
  171. >
  172. >::type
  173. >::template impl<Expr, State, Data>
  174. {};
  175. };
  176. namespace detail
  177. {
  178. template<
  179. template<typename , typename> class R
  180. , typename A0 , typename A1
  181. , typename Expr, typename State, typename Data
  182. >
  183. struct make_<
  184. R<A0 , A1>
  185. , Expr, State, Data
  186. BOOST_PROTO_TEMPLATE_ARITY_PARAM(2)
  187. >
  188. : nested_type_if<
  189. R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type>
  190. , (make_if_<A0, Expr, State, Data> ::applied || make_if_<A1, Expr, State, Data> ::applied || false)
  191. >
  192. {};
  193. template<
  194. template<typename , typename> class R
  195. , typename A0 , typename A1
  196. , typename Expr, typename State, typename Data
  197. >
  198. struct make_<
  199. noinvoke<R<A0 , A1> >
  200. , Expr, State, Data
  201. BOOST_PROTO_TEMPLATE_ARITY_PARAM(1)
  202. >
  203. {
  204. typedef R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type> type;
  205. static bool const applied = true;
  206. };
  207. template<typename R , typename A0 , typename A1>
  208. struct is_applyable<R(A0 , A1)>
  209. : mpl::true_
  210. {};
  211. template<typename R , typename A0 , typename A1>
  212. struct is_applyable<R(*)(A0 , A1)>
  213. : mpl::true_
  214. {};
  215. template<typename T, typename A>
  216. struct construct_<proto::expr<T, A, 2>, true>
  217. {
  218. typedef proto::expr<T, A, 2> result_type;
  219. template<typename A0 , typename A1>
  220. BOOST_FORCEINLINE
  221. result_type operator ()(A0 &a0 , A1 &a1) const
  222. {
  223. return result_type::make(a0 , a1);
  224. }
  225. };
  226. template<typename T, typename A>
  227. struct construct_<proto::basic_expr<T, A, 2>, true>
  228. {
  229. typedef proto::basic_expr<T, A, 2> result_type;
  230. template<typename A0 , typename A1>
  231. BOOST_FORCEINLINE
  232. result_type operator ()(A0 &a0 , A1 &a1) const
  233. {
  234. return result_type::make(a0 , a1);
  235. }
  236. };
  237. template<typename Type , typename A0 , typename A1>
  238. BOOST_FORCEINLINE
  239. Type construct(A0 &a0 , A1 &a1)
  240. {
  241. return construct_<Type>()(a0 , a1);
  242. }
  243. }
  244. template<typename Object , typename A0 , typename A1>
  245. struct make<Object(A0 , A1)>
  246. : transform<make<Object(A0 , A1)> >
  247. {
  248. template<typename Expr, typename State, typename Data>
  249. struct impl : transform_impl<Expr, State, Data>
  250. {
  251. typedef typename detail::make_if_<Object, Expr, State, Data>::type result_type;
  252. BOOST_FORCEINLINE
  253. result_type operator ()(
  254. typename impl::expr_param e
  255. , typename impl::state_param s
  256. , typename impl::data_param d
  257. ) const
  258. {
  259. proto::detail::ignore_unused(e);
  260. proto::detail::ignore_unused(s);
  261. proto::detail::ignore_unused(d);
  262. return detail::construct<result_type>(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) ));
  263. }
  264. };
  265. };
  266. template<typename Object , typename A0 , typename A1>
  267. struct make<Object(A0 , A1...)>
  268. : transform<make<Object(A0 , A1...)> >
  269. {
  270. template<typename Expr, typename State, typename Data>
  271. struct impl
  272. : make<
  273. typename detail::expand_pattern<
  274. proto::arity_of<Expr>::value
  275. , A1
  276. , detail::expand_pattern_rest_1<
  277. Object
  278. , A0
  279. >
  280. >::type
  281. >::template impl<Expr, State, Data>
  282. {};
  283. };
  284. namespace detail
  285. {
  286. template<
  287. template<typename , typename , typename> class R
  288. , typename A0 , typename A1 , typename A2
  289. , typename Expr, typename State, typename Data
  290. >
  291. struct make_<
  292. R<A0 , A1 , A2>
  293. , Expr, State, Data
  294. BOOST_PROTO_TEMPLATE_ARITY_PARAM(3)
  295. >
  296. : nested_type_if<
  297. R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type>
  298. , (make_if_<A0, Expr, State, Data> ::applied || make_if_<A1, Expr, State, Data> ::applied || make_if_<A2, Expr, State, Data> ::applied || false)
  299. >
  300. {};
  301. template<
  302. template<typename , typename , typename> class R
  303. , typename A0 , typename A1 , typename A2
  304. , typename Expr, typename State, typename Data
  305. >
  306. struct make_<
  307. noinvoke<R<A0 , A1 , A2> >
  308. , Expr, State, Data
  309. BOOST_PROTO_TEMPLATE_ARITY_PARAM(1)
  310. >
  311. {
  312. typedef R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type> type;
  313. static bool const applied = true;
  314. };
  315. template<typename R , typename A0 , typename A1 , typename A2>
  316. struct is_applyable<R(A0 , A1 , A2)>
  317. : mpl::true_
  318. {};
  319. template<typename R , typename A0 , typename A1 , typename A2>
  320. struct is_applyable<R(*)(A0 , A1 , A2)>
  321. : mpl::true_
  322. {};
  323. template<typename T, typename A>
  324. struct construct_<proto::expr<T, A, 3>, true>
  325. {
  326. typedef proto::expr<T, A, 3> result_type;
  327. template<typename A0 , typename A1 , typename A2>
  328. BOOST_FORCEINLINE
  329. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2) const
  330. {
  331. return result_type::make(a0 , a1 , a2);
  332. }
  333. };
  334. template<typename T, typename A>
  335. struct construct_<proto::basic_expr<T, A, 3>, true>
  336. {
  337. typedef proto::basic_expr<T, A, 3> result_type;
  338. template<typename A0 , typename A1 , typename A2>
  339. BOOST_FORCEINLINE
  340. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2) const
  341. {
  342. return result_type::make(a0 , a1 , a2);
  343. }
  344. };
  345. template<typename Type , typename A0 , typename A1 , typename A2>
  346. BOOST_FORCEINLINE
  347. Type construct(A0 &a0 , A1 &a1 , A2 &a2)
  348. {
  349. return construct_<Type>()(a0 , a1 , a2);
  350. }
  351. }
  352. template<typename Object , typename A0 , typename A1 , typename A2>
  353. struct make<Object(A0 , A1 , A2)>
  354. : transform<make<Object(A0 , A1 , A2)> >
  355. {
  356. template<typename Expr, typename State, typename Data>
  357. struct impl : transform_impl<Expr, State, Data>
  358. {
  359. typedef typename detail::make_if_<Object, Expr, State, Data>::type result_type;
  360. BOOST_FORCEINLINE
  361. result_type operator ()(
  362. typename impl::expr_param e
  363. , typename impl::state_param s
  364. , typename impl::data_param d
  365. ) const
  366. {
  367. proto::detail::ignore_unused(e);
  368. proto::detail::ignore_unused(s);
  369. proto::detail::ignore_unused(d);
  370. return detail::construct<result_type>(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) ));
  371. }
  372. };
  373. };
  374. template<typename Object , typename A0 , typename A1 , typename A2>
  375. struct make<Object(A0 , A1 , A2...)>
  376. : transform<make<Object(A0 , A1 , A2...)> >
  377. {
  378. template<typename Expr, typename State, typename Data>
  379. struct impl
  380. : make<
  381. typename detail::expand_pattern<
  382. proto::arity_of<Expr>::value
  383. , A2
  384. , detail::expand_pattern_rest_2<
  385. Object
  386. , A0 , A1
  387. >
  388. >::type
  389. >::template impl<Expr, State, Data>
  390. {};
  391. };
  392. namespace detail
  393. {
  394. template<
  395. template<typename , typename , typename , typename> class R
  396. , typename A0 , typename A1 , typename A2 , typename A3
  397. , typename Expr, typename State, typename Data
  398. >
  399. struct make_<
  400. R<A0 , A1 , A2 , A3>
  401. , Expr, State, Data
  402. BOOST_PROTO_TEMPLATE_ARITY_PARAM(4)
  403. >
  404. : nested_type_if<
  405. R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type , typename make_if_<A3, Expr, State, Data> ::type>
  406. , (make_if_<A0, Expr, State, Data> ::applied || make_if_<A1, Expr, State, Data> ::applied || make_if_<A2, Expr, State, Data> ::applied || make_if_<A3, Expr, State, Data> ::applied || false)
  407. >
  408. {};
  409. template<
  410. template<typename , typename , typename , typename> class R
  411. , typename A0 , typename A1 , typename A2 , typename A3
  412. , typename Expr, typename State, typename Data
  413. >
  414. struct make_<
  415. noinvoke<R<A0 , A1 , A2 , A3> >
  416. , Expr, State, Data
  417. BOOST_PROTO_TEMPLATE_ARITY_PARAM(1)
  418. >
  419. {
  420. typedef R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type , typename make_if_<A3, Expr, State, Data> ::type> type;
  421. static bool const applied = true;
  422. };
  423. template<typename R , typename A0 , typename A1 , typename A2 , typename A3>
  424. struct is_applyable<R(A0 , A1 , A2 , A3)>
  425. : mpl::true_
  426. {};
  427. template<typename R , typename A0 , typename A1 , typename A2 , typename A3>
  428. struct is_applyable<R(*)(A0 , A1 , A2 , A3)>
  429. : mpl::true_
  430. {};
  431. template<typename T, typename A>
  432. struct construct_<proto::expr<T, A, 4>, true>
  433. {
  434. typedef proto::expr<T, A, 4> result_type;
  435. template<typename A0 , typename A1 , typename A2 , typename A3>
  436. BOOST_FORCEINLINE
  437. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3) const
  438. {
  439. return result_type::make(a0 , a1 , a2 , a3);
  440. }
  441. };
  442. template<typename T, typename A>
  443. struct construct_<proto::basic_expr<T, A, 4>, true>
  444. {
  445. typedef proto::basic_expr<T, A, 4> result_type;
  446. template<typename A0 , typename A1 , typename A2 , typename A3>
  447. BOOST_FORCEINLINE
  448. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3) const
  449. {
  450. return result_type::make(a0 , a1 , a2 , a3);
  451. }
  452. };
  453. template<typename Type , typename A0 , typename A1 , typename A2 , typename A3>
  454. BOOST_FORCEINLINE
  455. Type construct(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3)
  456. {
  457. return construct_<Type>()(a0 , a1 , a2 , a3);
  458. }
  459. }
  460. template<typename Object , typename A0 , typename A1 , typename A2 , typename A3>
  461. struct make<Object(A0 , A1 , A2 , A3)>
  462. : transform<make<Object(A0 , A1 , A2 , A3)> >
  463. {
  464. template<typename Expr, typename State, typename Data>
  465. struct impl : transform_impl<Expr, State, Data>
  466. {
  467. typedef typename detail::make_if_<Object, Expr, State, Data>::type result_type;
  468. BOOST_FORCEINLINE
  469. result_type operator ()(
  470. typename impl::expr_param e
  471. , typename impl::state_param s
  472. , typename impl::data_param d
  473. ) const
  474. {
  475. proto::detail::ignore_unused(e);
  476. proto::detail::ignore_unused(s);
  477. proto::detail::ignore_unused(d);
  478. return detail::construct<result_type>(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) ));
  479. }
  480. };
  481. };
  482. template<typename Object , typename A0 , typename A1 , typename A2 , typename A3>
  483. struct make<Object(A0 , A1 , A2 , A3...)>
  484. : transform<make<Object(A0 , A1 , A2 , A3...)> >
  485. {
  486. template<typename Expr, typename State, typename Data>
  487. struct impl
  488. : make<
  489. typename detail::expand_pattern<
  490. proto::arity_of<Expr>::value
  491. , A3
  492. , detail::expand_pattern_rest_3<
  493. Object
  494. , A0 , A1 , A2
  495. >
  496. >::type
  497. >::template impl<Expr, State, Data>
  498. {};
  499. };
  500. namespace detail
  501. {
  502. template<
  503. template<typename , typename , typename , typename , typename> class R
  504. , typename A0 , typename A1 , typename A2 , typename A3 , typename A4
  505. , typename Expr, typename State, typename Data
  506. >
  507. struct make_<
  508. R<A0 , A1 , A2 , A3 , A4>
  509. , Expr, State, Data
  510. BOOST_PROTO_TEMPLATE_ARITY_PARAM(5)
  511. >
  512. : nested_type_if<
  513. R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type , typename make_if_<A3, Expr, State, Data> ::type , typename make_if_<A4, Expr, State, Data> ::type>
  514. , (make_if_<A0, Expr, State, Data> ::applied || make_if_<A1, Expr, State, Data> ::applied || make_if_<A2, Expr, State, Data> ::applied || make_if_<A3, Expr, State, Data> ::applied || make_if_<A4, Expr, State, Data> ::applied || false)
  515. >
  516. {};
  517. template<
  518. template<typename , typename , typename , typename , typename> class R
  519. , typename A0 , typename A1 , typename A2 , typename A3 , typename A4
  520. , typename Expr, typename State, typename Data
  521. >
  522. struct make_<
  523. noinvoke<R<A0 , A1 , A2 , A3 , A4> >
  524. , Expr, State, Data
  525. BOOST_PROTO_TEMPLATE_ARITY_PARAM(1)
  526. >
  527. {
  528. typedef R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type , typename make_if_<A3, Expr, State, Data> ::type , typename make_if_<A4, Expr, State, Data> ::type> type;
  529. static bool const applied = true;
  530. };
  531. template<typename R , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
  532. struct is_applyable<R(A0 , A1 , A2 , A3 , A4)>
  533. : mpl::true_
  534. {};
  535. template<typename R , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
  536. struct is_applyable<R(*)(A0 , A1 , A2 , A3 , A4)>
  537. : mpl::true_
  538. {};
  539. template<typename T, typename A>
  540. struct construct_<proto::expr<T, A, 5>, true>
  541. {
  542. typedef proto::expr<T, A, 5> result_type;
  543. template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
  544. BOOST_FORCEINLINE
  545. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4) const
  546. {
  547. return result_type::make(a0 , a1 , a2 , a3 , a4);
  548. }
  549. };
  550. template<typename T, typename A>
  551. struct construct_<proto::basic_expr<T, A, 5>, true>
  552. {
  553. typedef proto::basic_expr<T, A, 5> result_type;
  554. template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
  555. BOOST_FORCEINLINE
  556. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4) const
  557. {
  558. return result_type::make(a0 , a1 , a2 , a3 , a4);
  559. }
  560. };
  561. template<typename Type , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
  562. BOOST_FORCEINLINE
  563. Type construct(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4)
  564. {
  565. return construct_<Type>()(a0 , a1 , a2 , a3 , a4);
  566. }
  567. }
  568. template<typename Object , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
  569. struct make<Object(A0 , A1 , A2 , A3 , A4)>
  570. : transform<make<Object(A0 , A1 , A2 , A3 , A4)> >
  571. {
  572. template<typename Expr, typename State, typename Data>
  573. struct impl : transform_impl<Expr, State, Data>
  574. {
  575. typedef typename detail::make_if_<Object, Expr, State, Data>::type result_type;
  576. BOOST_FORCEINLINE
  577. result_type operator ()(
  578. typename impl::expr_param e
  579. , typename impl::state_param s
  580. , typename impl::data_param d
  581. ) const
  582. {
  583. proto::detail::ignore_unused(e);
  584. proto::detail::ignore_unused(s);
  585. proto::detail::ignore_unused(d);
  586. return detail::construct<result_type>(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) ));
  587. }
  588. };
  589. };
  590. template<typename Object , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
  591. struct make<Object(A0 , A1 , A2 , A3 , A4...)>
  592. : transform<make<Object(A0 , A1 , A2 , A3 , A4...)> >
  593. {
  594. template<typename Expr, typename State, typename Data>
  595. struct impl
  596. : make<
  597. typename detail::expand_pattern<
  598. proto::arity_of<Expr>::value
  599. , A4
  600. , detail::expand_pattern_rest_4<
  601. Object
  602. , A0 , A1 , A2 , A3
  603. >
  604. >::type
  605. >::template impl<Expr, State, Data>
  606. {};
  607. };
  608. namespace detail
  609. {
  610. template<
  611. template<typename , typename , typename , typename , typename , typename> class R
  612. , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5
  613. , typename Expr, typename State, typename Data
  614. >
  615. struct make_<
  616. R<A0 , A1 , A2 , A3 , A4 , A5>
  617. , Expr, State, Data
  618. BOOST_PROTO_TEMPLATE_ARITY_PARAM(6)
  619. >
  620. : nested_type_if<
  621. R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type , typename make_if_<A3, Expr, State, Data> ::type , typename make_if_<A4, Expr, State, Data> ::type , typename make_if_<A5, Expr, State, Data> ::type>
  622. , (make_if_<A0, Expr, State, Data> ::applied || make_if_<A1, Expr, State, Data> ::applied || make_if_<A2, Expr, State, Data> ::applied || make_if_<A3, Expr, State, Data> ::applied || make_if_<A4, Expr, State, Data> ::applied || make_if_<A5, Expr, State, Data> ::applied || false)
  623. >
  624. {};
  625. template<
  626. template<typename , typename , typename , typename , typename , typename> class R
  627. , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5
  628. , typename Expr, typename State, typename Data
  629. >
  630. struct make_<
  631. noinvoke<R<A0 , A1 , A2 , A3 , A4 , A5> >
  632. , Expr, State, Data
  633. BOOST_PROTO_TEMPLATE_ARITY_PARAM(1)
  634. >
  635. {
  636. typedef R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type , typename make_if_<A3, Expr, State, Data> ::type , typename make_if_<A4, Expr, State, Data> ::type , typename make_if_<A5, Expr, State, Data> ::type> type;
  637. static bool const applied = true;
  638. };
  639. template<typename R , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
  640. struct is_applyable<R(A0 , A1 , A2 , A3 , A4 , A5)>
  641. : mpl::true_
  642. {};
  643. template<typename R , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
  644. struct is_applyable<R(*)(A0 , A1 , A2 , A3 , A4 , A5)>
  645. : mpl::true_
  646. {};
  647. template<typename T, typename A>
  648. struct construct_<proto::expr<T, A, 6>, true>
  649. {
  650. typedef proto::expr<T, A, 6> result_type;
  651. template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
  652. BOOST_FORCEINLINE
  653. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5) const
  654. {
  655. return result_type::make(a0 , a1 , a2 , a3 , a4 , a5);
  656. }
  657. };
  658. template<typename T, typename A>
  659. struct construct_<proto::basic_expr<T, A, 6>, true>
  660. {
  661. typedef proto::basic_expr<T, A, 6> result_type;
  662. template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
  663. BOOST_FORCEINLINE
  664. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5) const
  665. {
  666. return result_type::make(a0 , a1 , a2 , a3 , a4 , a5);
  667. }
  668. };
  669. template<typename Type , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
  670. BOOST_FORCEINLINE
  671. Type construct(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5)
  672. {
  673. return construct_<Type>()(a0 , a1 , a2 , a3 , a4 , a5);
  674. }
  675. }
  676. template<typename Object , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
  677. struct make<Object(A0 , A1 , A2 , A3 , A4 , A5)>
  678. : transform<make<Object(A0 , A1 , A2 , A3 , A4 , A5)> >
  679. {
  680. template<typename Expr, typename State, typename Data>
  681. struct impl : transform_impl<Expr, State, Data>
  682. {
  683. typedef typename detail::make_if_<Object, Expr, State, Data>::type result_type;
  684. BOOST_FORCEINLINE
  685. result_type operator ()(
  686. typename impl::expr_param e
  687. , typename impl::state_param s
  688. , typename impl::data_param d
  689. ) const
  690. {
  691. proto::detail::ignore_unused(e);
  692. proto::detail::ignore_unused(s);
  693. proto::detail::ignore_unused(d);
  694. return detail::construct<result_type>(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) ));
  695. }
  696. };
  697. };
  698. template<typename Object , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
  699. struct make<Object(A0 , A1 , A2 , A3 , A4 , A5...)>
  700. : transform<make<Object(A0 , A1 , A2 , A3 , A4 , A5...)> >
  701. {
  702. template<typename Expr, typename State, typename Data>
  703. struct impl
  704. : make<
  705. typename detail::expand_pattern<
  706. proto::arity_of<Expr>::value
  707. , A5
  708. , detail::expand_pattern_rest_5<
  709. Object
  710. , A0 , A1 , A2 , A3 , A4
  711. >
  712. >::type
  713. >::template impl<Expr, State, Data>
  714. {};
  715. };
  716. namespace detail
  717. {
  718. template<
  719. template<typename , typename , typename , typename , typename , typename , typename> class R
  720. , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6
  721. , typename Expr, typename State, typename Data
  722. >
  723. struct make_<
  724. R<A0 , A1 , A2 , A3 , A4 , A5 , A6>
  725. , Expr, State, Data
  726. BOOST_PROTO_TEMPLATE_ARITY_PARAM(7)
  727. >
  728. : nested_type_if<
  729. R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type , typename make_if_<A3, Expr, State, Data> ::type , typename make_if_<A4, Expr, State, Data> ::type , typename make_if_<A5, Expr, State, Data> ::type , typename make_if_<A6, Expr, State, Data> ::type>
  730. , (make_if_<A0, Expr, State, Data> ::applied || make_if_<A1, Expr, State, Data> ::applied || make_if_<A2, Expr, State, Data> ::applied || make_if_<A3, Expr, State, Data> ::applied || make_if_<A4, Expr, State, Data> ::applied || make_if_<A5, Expr, State, Data> ::applied || make_if_<A6, Expr, State, Data> ::applied || false)
  731. >
  732. {};
  733. template<
  734. template<typename , typename , typename , typename , typename , typename , typename> class R
  735. , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6
  736. , typename Expr, typename State, typename Data
  737. >
  738. struct make_<
  739. noinvoke<R<A0 , A1 , A2 , A3 , A4 , A5 , A6> >
  740. , Expr, State, Data
  741. BOOST_PROTO_TEMPLATE_ARITY_PARAM(1)
  742. >
  743. {
  744. typedef R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type , typename make_if_<A3, Expr, State, Data> ::type , typename make_if_<A4, Expr, State, Data> ::type , typename make_if_<A5, Expr, State, Data> ::type , typename make_if_<A6, Expr, State, Data> ::type> type;
  745. static bool const applied = true;
  746. };
  747. template<typename R , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
  748. struct is_applyable<R(A0 , A1 , A2 , A3 , A4 , A5 , A6)>
  749. : mpl::true_
  750. {};
  751. template<typename R , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
  752. struct is_applyable<R(*)(A0 , A1 , A2 , A3 , A4 , A5 , A6)>
  753. : mpl::true_
  754. {};
  755. template<typename T, typename A>
  756. struct construct_<proto::expr<T, A, 7>, true>
  757. {
  758. typedef proto::expr<T, A, 7> result_type;
  759. template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
  760. BOOST_FORCEINLINE
  761. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6) const
  762. {
  763. return result_type::make(a0 , a1 , a2 , a3 , a4 , a5 , a6);
  764. }
  765. };
  766. template<typename T, typename A>
  767. struct construct_<proto::basic_expr<T, A, 7>, true>
  768. {
  769. typedef proto::basic_expr<T, A, 7> result_type;
  770. template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
  771. BOOST_FORCEINLINE
  772. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6) const
  773. {
  774. return result_type::make(a0 , a1 , a2 , a3 , a4 , a5 , a6);
  775. }
  776. };
  777. template<typename Type , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
  778. BOOST_FORCEINLINE
  779. Type construct(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6)
  780. {
  781. return construct_<Type>()(a0 , a1 , a2 , a3 , a4 , a5 , a6);
  782. }
  783. }
  784. template<typename Object , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
  785. struct make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6)>
  786. : transform<make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6)> >
  787. {
  788. template<typename Expr, typename State, typename Data>
  789. struct impl : transform_impl<Expr, State, Data>
  790. {
  791. typedef typename detail::make_if_<Object, Expr, State, Data>::type result_type;
  792. BOOST_FORCEINLINE
  793. result_type operator ()(
  794. typename impl::expr_param e
  795. , typename impl::state_param s
  796. , typename impl::data_param d
  797. ) const
  798. {
  799. proto::detail::ignore_unused(e);
  800. proto::detail::ignore_unused(s);
  801. proto::detail::ignore_unused(d);
  802. return detail::construct<result_type>(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) ));
  803. }
  804. };
  805. };
  806. template<typename Object , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
  807. struct make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6...)>
  808. : transform<make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6...)> >
  809. {
  810. template<typename Expr, typename State, typename Data>
  811. struct impl
  812. : make<
  813. typename detail::expand_pattern<
  814. proto::arity_of<Expr>::value
  815. , A6
  816. , detail::expand_pattern_rest_6<
  817. Object
  818. , A0 , A1 , A2 , A3 , A4 , A5
  819. >
  820. >::type
  821. >::template impl<Expr, State, Data>
  822. {};
  823. };
  824. namespace detail
  825. {
  826. template<
  827. template<typename , typename , typename , typename , typename , typename , typename , typename> class R
  828. , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7
  829. , typename Expr, typename State, typename Data
  830. >
  831. struct make_<
  832. R<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>
  833. , Expr, State, Data
  834. BOOST_PROTO_TEMPLATE_ARITY_PARAM(8)
  835. >
  836. : nested_type_if<
  837. R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type , typename make_if_<A3, Expr, State, Data> ::type , typename make_if_<A4, Expr, State, Data> ::type , typename make_if_<A5, Expr, State, Data> ::type , typename make_if_<A6, Expr, State, Data> ::type , typename make_if_<A7, Expr, State, Data> ::type>
  838. , (make_if_<A0, Expr, State, Data> ::applied || make_if_<A1, Expr, State, Data> ::applied || make_if_<A2, Expr, State, Data> ::applied || make_if_<A3, Expr, State, Data> ::applied || make_if_<A4, Expr, State, Data> ::applied || make_if_<A5, Expr, State, Data> ::applied || make_if_<A6, Expr, State, Data> ::applied || make_if_<A7, Expr, State, Data> ::applied || false)
  839. >
  840. {};
  841. template<
  842. template<typename , typename , typename , typename , typename , typename , typename , typename> class R
  843. , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7
  844. , typename Expr, typename State, typename Data
  845. >
  846. struct make_<
  847. noinvoke<R<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7> >
  848. , Expr, State, Data
  849. BOOST_PROTO_TEMPLATE_ARITY_PARAM(1)
  850. >
  851. {
  852. typedef R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type , typename make_if_<A3, Expr, State, Data> ::type , typename make_if_<A4, Expr, State, Data> ::type , typename make_if_<A5, Expr, State, Data> ::type , typename make_if_<A6, Expr, State, Data> ::type , typename make_if_<A7, Expr, State, Data> ::type> type;
  853. static bool const applied = true;
  854. };
  855. template<typename R , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
  856. struct is_applyable<R(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)>
  857. : mpl::true_
  858. {};
  859. template<typename R , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
  860. struct is_applyable<R(*)(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)>
  861. : mpl::true_
  862. {};
  863. template<typename T, typename A>
  864. struct construct_<proto::expr<T, A, 8>, true>
  865. {
  866. typedef proto::expr<T, A, 8> result_type;
  867. template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
  868. BOOST_FORCEINLINE
  869. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6 , A7 &a7) const
  870. {
  871. return result_type::make(a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7);
  872. }
  873. };
  874. template<typename T, typename A>
  875. struct construct_<proto::basic_expr<T, A, 8>, true>
  876. {
  877. typedef proto::basic_expr<T, A, 8> result_type;
  878. template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
  879. BOOST_FORCEINLINE
  880. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6 , A7 &a7) const
  881. {
  882. return result_type::make(a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7);
  883. }
  884. };
  885. template<typename Type , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
  886. BOOST_FORCEINLINE
  887. Type construct(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6 , A7 &a7)
  888. {
  889. return construct_<Type>()(a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7);
  890. }
  891. }
  892. template<typename Object , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
  893. struct make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)>
  894. : transform<make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> >
  895. {
  896. template<typename Expr, typename State, typename Data>
  897. struct impl : transform_impl<Expr, State, Data>
  898. {
  899. typedef typename detail::make_if_<Object, Expr, State, Data>::type result_type;
  900. BOOST_FORCEINLINE
  901. result_type operator ()(
  902. typename impl::expr_param e
  903. , typename impl::state_param s
  904. , typename impl::data_param d
  905. ) const
  906. {
  907. proto::detail::ignore_unused(e);
  908. proto::detail::ignore_unused(s);
  909. proto::detail::ignore_unused(d);
  910. return detail::construct<result_type>(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) ));
  911. }
  912. };
  913. };
  914. template<typename Object , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
  915. struct make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7...)>
  916. : transform<make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7...)> >
  917. {
  918. template<typename Expr, typename State, typename Data>
  919. struct impl
  920. : make<
  921. typename detail::expand_pattern<
  922. proto::arity_of<Expr>::value
  923. , A7
  924. , detail::expand_pattern_rest_7<
  925. Object
  926. , A0 , A1 , A2 , A3 , A4 , A5 , A6
  927. >
  928. >::type
  929. >::template impl<Expr, State, Data>
  930. {};
  931. };
  932. namespace detail
  933. {
  934. template<
  935. template<typename , typename , typename , typename , typename , typename , typename , typename , typename> class R
  936. , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8
  937. , typename Expr, typename State, typename Data
  938. >
  939. struct make_<
  940. R<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>
  941. , Expr, State, Data
  942. BOOST_PROTO_TEMPLATE_ARITY_PARAM(9)
  943. >
  944. : nested_type_if<
  945. R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type , typename make_if_<A3, Expr, State, Data> ::type , typename make_if_<A4, Expr, State, Data> ::type , typename make_if_<A5, Expr, State, Data> ::type , typename make_if_<A6, Expr, State, Data> ::type , typename make_if_<A7, Expr, State, Data> ::type , typename make_if_<A8, Expr, State, Data> ::type>
  946. , (make_if_<A0, Expr, State, Data> ::applied || make_if_<A1, Expr, State, Data> ::applied || make_if_<A2, Expr, State, Data> ::applied || make_if_<A3, Expr, State, Data> ::applied || make_if_<A4, Expr, State, Data> ::applied || make_if_<A5, Expr, State, Data> ::applied || make_if_<A6, Expr, State, Data> ::applied || make_if_<A7, Expr, State, Data> ::applied || make_if_<A8, Expr, State, Data> ::applied || false)
  947. >
  948. {};
  949. template<
  950. template<typename , typename , typename , typename , typename , typename , typename , typename , typename> class R
  951. , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8
  952. , typename Expr, typename State, typename Data
  953. >
  954. struct make_<
  955. noinvoke<R<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8> >
  956. , Expr, State, Data
  957. BOOST_PROTO_TEMPLATE_ARITY_PARAM(1)
  958. >
  959. {
  960. typedef R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type , typename make_if_<A3, Expr, State, Data> ::type , typename make_if_<A4, Expr, State, Data> ::type , typename make_if_<A5, Expr, State, Data> ::type , typename make_if_<A6, Expr, State, Data> ::type , typename make_if_<A7, Expr, State, Data> ::type , typename make_if_<A8, Expr, State, Data> ::type> type;
  961. static bool const applied = true;
  962. };
  963. template<typename R , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
  964. struct is_applyable<R(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)>
  965. : mpl::true_
  966. {};
  967. template<typename R , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
  968. struct is_applyable<R(*)(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)>
  969. : mpl::true_
  970. {};
  971. template<typename T, typename A>
  972. struct construct_<proto::expr<T, A, 9>, true>
  973. {
  974. typedef proto::expr<T, A, 9> result_type;
  975. template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
  976. BOOST_FORCEINLINE
  977. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6 , A7 &a7 , A8 &a8) const
  978. {
  979. return result_type::make(a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8);
  980. }
  981. };
  982. template<typename T, typename A>
  983. struct construct_<proto::basic_expr<T, A, 9>, true>
  984. {
  985. typedef proto::basic_expr<T, A, 9> result_type;
  986. template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
  987. BOOST_FORCEINLINE
  988. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6 , A7 &a7 , A8 &a8) const
  989. {
  990. return result_type::make(a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8);
  991. }
  992. };
  993. template<typename Type , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
  994. BOOST_FORCEINLINE
  995. Type construct(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6 , A7 &a7 , A8 &a8)
  996. {
  997. return construct_<Type>()(a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8);
  998. }
  999. }
  1000. template<typename Object , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
  1001. struct make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)>
  1002. : transform<make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> >
  1003. {
  1004. template<typename Expr, typename State, typename Data>
  1005. struct impl : transform_impl<Expr, State, Data>
  1006. {
  1007. typedef typename detail::make_if_<Object, Expr, State, Data>::type result_type;
  1008. BOOST_FORCEINLINE
  1009. result_type operator ()(
  1010. typename impl::expr_param e
  1011. , typename impl::state_param s
  1012. , typename impl::data_param d
  1013. ) const
  1014. {
  1015. proto::detail::ignore_unused(e);
  1016. proto::detail::ignore_unused(s);
  1017. proto::detail::ignore_unused(d);
  1018. return detail::construct<result_type>(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) ));
  1019. }
  1020. };
  1021. };
  1022. template<typename Object , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
  1023. struct make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8...)>
  1024. : transform<make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8...)> >
  1025. {
  1026. template<typename Expr, typename State, typename Data>
  1027. struct impl
  1028. : make<
  1029. typename detail::expand_pattern<
  1030. proto::arity_of<Expr>::value
  1031. , A8
  1032. , detail::expand_pattern_rest_8<
  1033. Object
  1034. , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7
  1035. >
  1036. >::type
  1037. >::template impl<Expr, State, Data>
  1038. {};
  1039. };
  1040. namespace detail
  1041. {
  1042. template<
  1043. template<typename , typename , typename , typename , typename , typename , typename , typename , typename , typename> class R
  1044. , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9
  1045. , typename Expr, typename State, typename Data
  1046. >
  1047. struct make_<
  1048. R<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9>
  1049. , Expr, State, Data
  1050. BOOST_PROTO_TEMPLATE_ARITY_PARAM(10)
  1051. >
  1052. : nested_type_if<
  1053. R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type , typename make_if_<A3, Expr, State, Data> ::type , typename make_if_<A4, Expr, State, Data> ::type , typename make_if_<A5, Expr, State, Data> ::type , typename make_if_<A6, Expr, State, Data> ::type , typename make_if_<A7, Expr, State, Data> ::type , typename make_if_<A8, Expr, State, Data> ::type , typename make_if_<A9, Expr, State, Data> ::type>
  1054. , (make_if_<A0, Expr, State, Data> ::applied || make_if_<A1, Expr, State, Data> ::applied || make_if_<A2, Expr, State, Data> ::applied || make_if_<A3, Expr, State, Data> ::applied || make_if_<A4, Expr, State, Data> ::applied || make_if_<A5, Expr, State, Data> ::applied || make_if_<A6, Expr, State, Data> ::applied || make_if_<A7, Expr, State, Data> ::applied || make_if_<A8, Expr, State, Data> ::applied || make_if_<A9, Expr, State, Data> ::applied || false)
  1055. >
  1056. {};
  1057. template<
  1058. template<typename , typename , typename , typename , typename , typename , typename , typename , typename , typename> class R
  1059. , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9
  1060. , typename Expr, typename State, typename Data
  1061. >
  1062. struct make_<
  1063. noinvoke<R<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9> >
  1064. , Expr, State, Data
  1065. BOOST_PROTO_TEMPLATE_ARITY_PARAM(1)
  1066. >
  1067. {
  1068. typedef R<typename make_if_<A0, Expr, State, Data> ::type , typename make_if_<A1, Expr, State, Data> ::type , typename make_if_<A2, Expr, State, Data> ::type , typename make_if_<A3, Expr, State, Data> ::type , typename make_if_<A4, Expr, State, Data> ::type , typename make_if_<A5, Expr, State, Data> ::type , typename make_if_<A6, Expr, State, Data> ::type , typename make_if_<A7, Expr, State, Data> ::type , typename make_if_<A8, Expr, State, Data> ::type , typename make_if_<A9, Expr, State, Data> ::type> type;
  1069. static bool const applied = true;
  1070. };
  1071. template<typename R , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
  1072. struct is_applyable<R(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)>
  1073. : mpl::true_
  1074. {};
  1075. template<typename R , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
  1076. struct is_applyable<R(*)(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)>
  1077. : mpl::true_
  1078. {};
  1079. template<typename T, typename A>
  1080. struct construct_<proto::expr<T, A, 10>, true>
  1081. {
  1082. typedef proto::expr<T, A, 10> result_type;
  1083. template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
  1084. BOOST_FORCEINLINE
  1085. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6 , A7 &a7 , A8 &a8 , A9 &a9) const
  1086. {
  1087. return result_type::make(a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9);
  1088. }
  1089. };
  1090. template<typename T, typename A>
  1091. struct construct_<proto::basic_expr<T, A, 10>, true>
  1092. {
  1093. typedef proto::basic_expr<T, A, 10> result_type;
  1094. template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
  1095. BOOST_FORCEINLINE
  1096. result_type operator ()(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6 , A7 &a7 , A8 &a8 , A9 &a9) const
  1097. {
  1098. return result_type::make(a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9);
  1099. }
  1100. };
  1101. template<typename Type , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
  1102. BOOST_FORCEINLINE
  1103. Type construct(A0 &a0 , A1 &a1 , A2 &a2 , A3 &a3 , A4 &a4 , A5 &a5 , A6 &a6 , A7 &a7 , A8 &a8 , A9 &a9)
  1104. {
  1105. return construct_<Type>()(a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9);
  1106. }
  1107. }
  1108. template<typename Object , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
  1109. struct make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)>
  1110. : transform<make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)> >
  1111. {
  1112. template<typename Expr, typename State, typename Data>
  1113. struct impl : transform_impl<Expr, State, Data>
  1114. {
  1115. typedef typename detail::make_if_<Object, Expr, State, Data>::type result_type;
  1116. BOOST_FORCEINLINE
  1117. result_type operator ()(
  1118. typename impl::expr_param e
  1119. , typename impl::state_param s
  1120. , typename impl::data_param d
  1121. ) const
  1122. {
  1123. proto::detail::ignore_unused(e);
  1124. proto::detail::ignore_unused(s);
  1125. proto::detail::ignore_unused(d);
  1126. return detail::construct<result_type>(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) ));
  1127. }
  1128. };
  1129. };
  1130. template<typename Object , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
  1131. struct make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9...)>
  1132. : transform<make<Object(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9...)> >
  1133. {
  1134. template<typename Expr, typename State, typename Data>
  1135. struct impl
  1136. : make<
  1137. typename detail::expand_pattern<
  1138. proto::arity_of<Expr>::value
  1139. , A9
  1140. , detail::expand_pattern_rest_9<
  1141. Object
  1142. , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8
  1143. >
  1144. >::type
  1145. >::template impl<Expr, State, Data>
  1146. {};
  1147. };