make.hpp 59 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320
  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. };