new.hpp 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315
  1. /*=============================================================================
  2. Phoenix V1.2.1
  3. Copyright (c) 2001-2003 Joel de Guzman
  4. Copyright (c) 2001-2003 Hartmut Kaiser
  5. Copyright (c) 2003 Vaclav Vesely
  6. Distributed under the Boost Software License, Version 1.0. (See accompanying
  7. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  8. ==============================================================================*/
  9. #ifndef PHOENIX_NEW_HPP
  10. #define PHOENIX_NEW_HPP
  11. ///////////////////////////////////////////////////////////////////////////////
  12. #include <boost/spirit/home/classic/phoenix/actor.hpp>
  13. #include <boost/spirit/home/classic/phoenix/composite.hpp>
  14. #include <boost/static_assert.hpp>
  15. ///////////////////////////////////////////////////////////////////////////////
  16. namespace phoenix {
  17. ///////////////////////////////////////////////////////////////////////////////
  18. //
  19. // Phoenix predefined maximum new_ limit. This limit defines the maximum
  20. // number of parameters supported for calles to the set of new_ template
  21. // functions (lazy object construction, see below). This number defaults to 3.
  22. // The actual maximum is rounded up in multiples of 3. Thus, if this value
  23. // is 4, the actual limit is 6. The ultimate maximum limit in this
  24. // implementation is 15.
  25. // PHOENIX_CONSTRUCT_LIMIT should NOT be greater than PHOENIX_LIMIT!
  26. #if !defined(PHOENIX_CONSTRUCT_LIMIT)
  27. #define PHOENIX_CONSTRUCT_LIMIT PHOENIX_LIMIT
  28. #endif
  29. // ensure PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT
  30. BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT);
  31. // ensure PHOENIX_CONSTRUCT_LIMIT <= 15
  32. BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= 15);
  33. ///////////////////////////////////////////////////////////////////////////////
  34. //
  35. // new_
  36. //
  37. // Lazy object construction
  38. //
  39. // The set of new_<> template classes and functions provide a way
  40. // of lazily constructing certain object from a arbitrary set of
  41. // actors during parsing.
  42. // The new_ templates are (syntactically) used very much like
  43. // the well known C++ casts:
  44. //
  45. // A *a = new_<A>(...arbitrary list of actors...);
  46. //
  47. // where the given parameters are submitted as parameters to the
  48. // contructor of the object of type A. (This certainly implies, that
  49. // type A has a constructor with a fitting set of parameter types
  50. // defined.)
  51. //
  52. // The maximum number of needed parameters is controlled through the
  53. // preprocessor constant PHOENIX_CONSTRUCT_LIMIT. Note though, that this
  54. // limit should not be greater than PHOENIX_LIMIT.
  55. //
  56. ///////////////////////////////////////////////////////////////////////////////
  57. template <typename T>
  58. struct new_l_0
  59. {
  60. typedef T* result_type;
  61. T* operator()() const
  62. {
  63. return new T();
  64. }
  65. };
  66. template <typename T>
  67. struct new_l {
  68. template <
  69. typename A
  70. , typename B
  71. , typename C
  72. #if PHOENIX_CONSTRUCT_LIMIT > 3
  73. , typename D
  74. , typename E
  75. , typename F
  76. #if PHOENIX_CONSTRUCT_LIMIT > 6
  77. , typename G
  78. , typename H
  79. , typename I
  80. #if PHOENIX_CONSTRUCT_LIMIT > 9
  81. , typename J
  82. , typename K
  83. , typename L
  84. #if PHOENIX_CONSTRUCT_LIMIT > 12
  85. , typename M
  86. , typename N
  87. , typename O
  88. #endif
  89. #endif
  90. #endif
  91. #endif
  92. >
  93. struct result { typedef T* type; };
  94. T* operator()() const {
  95. return new T();
  96. }
  97. template <typename A>
  98. T* operator()(A const& a) const {
  99. return new T(a);
  100. }
  101. template <typename A, typename B>
  102. T* operator()(A const& a, B const& b) const {
  103. return new T(a, b);
  104. }
  105. template <typename A, typename B, typename C>
  106. T* operator()(A const& a, B const& b, C const& c) const {
  107. return new T(a, b, c);
  108. }
  109. #if PHOENIX_CONSTRUCT_LIMIT > 3
  110. template <
  111. typename A, typename B, typename C, typename D
  112. >
  113. T* operator()(
  114. A const& a, B const& b, C const& c, D const& d) const
  115. {
  116. return new T(a, b, c, d);
  117. }
  118. template <
  119. typename A, typename B, typename C, typename D, typename E
  120. >
  121. T* operator()(
  122. A const& a, B const& b, C const& c, D const& d, E const& e) const
  123. {
  124. return new T(a, b, c, d, e);
  125. }
  126. template <
  127. typename A, typename B, typename C, typename D, typename E,
  128. typename F
  129. >
  130. T* operator()(
  131. A const& a, B const& b, C const& c, D const& d, E const& e,
  132. F const& f) const
  133. {
  134. return new T(a, b, c, d, e, f);
  135. }
  136. #if PHOENIX_CONSTRUCT_LIMIT > 6
  137. template <
  138. typename A, typename B, typename C, typename D, typename E,
  139. typename F, typename G
  140. >
  141. T* operator()(
  142. A const& a, B const& b, C const& c, D const& d, E const& e,
  143. F const& f, G const& g) const
  144. {
  145. return new T(a, b, c, d, e, f, g);
  146. }
  147. template <
  148. typename A, typename B, typename C, typename D, typename E,
  149. typename F, typename G, typename H
  150. >
  151. T* operator()(
  152. A const& a, B const& b, C const& c, D const& d, E const& e,
  153. F const& f, G const& g, H const& h) const
  154. {
  155. return new T(a, b, c, d, e, f, g, h);
  156. }
  157. template <
  158. typename A, typename B, typename C, typename D, typename E,
  159. typename F, typename G, typename H, typename I
  160. >
  161. T* operator()(
  162. A const& a, B const& b, C const& c, D const& d, E const& e,
  163. F const& f, G const& g, H const& h, I const& i) const
  164. {
  165. return new T(a, b, c, d, e, f, g, h, i);
  166. }
  167. #if PHOENIX_CONSTRUCT_LIMIT > 9
  168. template <
  169. typename A, typename B, typename C, typename D, typename E,
  170. typename F, typename G, typename H, typename I, typename J
  171. >
  172. T* operator()(
  173. A const& a, B const& b, C const& c, D const& d, E const& e,
  174. F const& f, G const& g, H const& h, I const& i, J const& j) const
  175. {
  176. return new T(a, b, c, d, e, f, g, h, i, j);
  177. }
  178. template <
  179. typename A, typename B, typename C, typename D, typename E,
  180. typename F, typename G, typename H, typename I, typename J,
  181. typename K
  182. >
  183. T* operator()(
  184. A const& a, B const& b, C const& c, D const& d, E const& e,
  185. F const& f, G const& g, H const& h, I const& i, J const& j,
  186. K const& k) const
  187. {
  188. return new T(a, b, c, d, e, f, g, h, i, j, k);
  189. }
  190. template <
  191. typename A, typename B, typename C, typename D, typename E,
  192. typename F, typename G, typename H, typename I, typename J,
  193. typename K, typename L
  194. >
  195. T* operator()(
  196. A const& a, B const& b, C const& c, D const& d, E const& e,
  197. F const& f, G const& g, H const& h, I const& i, J const& j,
  198. K const& k, L const& l) const
  199. {
  200. return new T(a, b, c, d, e, f, g, h, i, j, k, l);
  201. }
  202. #if PHOENIX_CONSTRUCT_LIMIT > 12
  203. template <
  204. typename A, typename B, typename C, typename D, typename E,
  205. typename F, typename G, typename H, typename I, typename J,
  206. typename K, typename L, typename M
  207. >
  208. T* operator()(
  209. A const& a, B const& b, C const& c, D const& d, E const& e,
  210. F const& f, G const& g, H const& h, I const& i, J const& j,
  211. K const& k, L const& l, M const& m) const
  212. {
  213. return new T(a, b, c, d, e, f, g, h, i, j, k, l, m);
  214. }
  215. template <
  216. typename A, typename B, typename C, typename D, typename E,
  217. typename F, typename G, typename H, typename I, typename J,
  218. typename K, typename L, typename M, typename N
  219. >
  220. T* operator()(
  221. A const& a, B const& b, C const& c, D const& d, E const& e,
  222. F const& f, G const& g, H const& h, I const& i, J const& j,
  223. K const& k, L const& l, M const& m, N const& n) const
  224. {
  225. return new T(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
  226. }
  227. template <
  228. typename A, typename B, typename C, typename D, typename E,
  229. typename F, typename G, typename H, typename I, typename J,
  230. typename K, typename L, typename M, typename N, typename O
  231. >
  232. T* operator()(
  233. A const& a, B const& b, C const& c, D const& d, E const& e,
  234. F const& f, G const& g, H const& h, I const& i, J const& j,
  235. K const& k, L const& l, M const& m, N const& n, O const& o) const
  236. {
  237. return new T(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
  238. }
  239. #endif
  240. #endif
  241. #endif
  242. #endif
  243. };
  244. template <typename T>
  245. struct new_1 {
  246. template <
  247. typename A
  248. >
  249. struct result { typedef T* type; };
  250. template <typename A>
  251. T* operator()(A const& a) const {
  252. return new T(a);
  253. }
  254. };
  255. template <typename T>
  256. struct new_2 {
  257. template <
  258. typename A
  259. , typename B
  260. >
  261. struct result { typedef T* type; };
  262. template <typename A, typename B>
  263. T* operator()(A const& a, B const& b) const {
  264. return new T(a, b);
  265. }
  266. };
  267. template <typename T>
  268. struct new_3 {
  269. template <
  270. typename A
  271. , typename B
  272. , typename C
  273. >
  274. struct result { typedef T* type; };
  275. template <typename A, typename B, typename C>
  276. T* operator()(A const& a, B const& b, C const& c) const {
  277. return new T(a, b, c);
  278. }
  279. };
  280. #if PHOENIX_CONSTRUCT_LIMIT > 3
  281. template <typename T>
  282. struct new_4 {
  283. template <
  284. typename A
  285. , typename B
  286. , typename C
  287. , typename D
  288. >
  289. struct result { typedef T* type; };
  290. template <
  291. typename A, typename B, typename C, typename D
  292. >
  293. T* operator()(
  294. A const& a, B const& b, C const& c, D const& d) const
  295. {
  296. return new T(a, b, c, d);
  297. }
  298. };
  299. template <typename T>
  300. struct new_5 {
  301. template <
  302. typename A
  303. , typename B
  304. , typename C
  305. , typename D
  306. , typename E
  307. >
  308. struct result { typedef T* type; };
  309. template <
  310. typename A, typename B, typename C, typename D, typename E
  311. >
  312. T* operator()(
  313. A const& a, B const& b, C const& c, D const& d, E const& e) const
  314. {
  315. return new T(a, b, c, d, e);
  316. }
  317. };
  318. template <typename T>
  319. struct new_6 {
  320. template <
  321. typename A
  322. , typename B
  323. , typename C
  324. , typename D
  325. , typename E
  326. , typename F
  327. >
  328. struct result { typedef T* type; };
  329. template <
  330. typename A, typename B, typename C, typename D, typename E,
  331. typename F
  332. >
  333. T* operator()(
  334. A const& a, B const& b, C const& c, D const& d, E const& e,
  335. F const& f) const
  336. {
  337. return new T(a, b, c, d, e, f);
  338. }
  339. };
  340. #endif
  341. #if PHOENIX_CONSTRUCT_LIMIT > 6
  342. template <typename T>
  343. struct new_7 {
  344. template <
  345. typename A
  346. , typename B
  347. , typename C
  348. , typename D
  349. , typename E
  350. , typename F
  351. , typename G
  352. >
  353. struct result { typedef T* type; };
  354. template <
  355. typename A, typename B, typename C, typename D, typename E,
  356. typename F, typename G
  357. >
  358. T* operator()(
  359. A const& a, B const& b, C const& c, D const& d, E const& e,
  360. F const& f, G const& g) const
  361. {
  362. return new T(a, b, c, d, e, f, g);
  363. }
  364. };
  365. template <typename T>
  366. struct new_8 {
  367. template <
  368. typename A
  369. , typename B
  370. , typename C
  371. , typename D
  372. , typename E
  373. , typename F
  374. , typename G
  375. , typename H
  376. >
  377. struct result { typedef T* type; };
  378. template <
  379. typename A, typename B, typename C, typename D, typename E,
  380. typename F, typename G, typename H
  381. >
  382. T* operator()(
  383. A const& a, B const& b, C const& c, D const& d, E const& e,
  384. F const& f, G const& g, H const& h) const
  385. {
  386. return new T(a, b, c, d, e, f, g, h);
  387. }
  388. };
  389. template <typename T>
  390. struct new_9 {
  391. template <
  392. typename A
  393. , typename B
  394. , typename C
  395. , typename D
  396. , typename E
  397. , typename F
  398. , typename G
  399. , typename H
  400. , typename I
  401. >
  402. struct result { typedef T* type; };
  403. template <
  404. typename A, typename B, typename C, typename D, typename E,
  405. typename F, typename G, typename H, typename I
  406. >
  407. T* operator()(
  408. A const& a, B const& b, C const& c, D const& d, E const& e,
  409. F const& f, G const& g, H const& h, I const& i) const
  410. {
  411. return new T(a, b, c, d, e, f, g, h, i);
  412. }
  413. };
  414. #endif
  415. #if PHOENIX_CONSTRUCT_LIMIT > 9
  416. template <typename T>
  417. struct new_10 {
  418. template <
  419. typename A
  420. , typename B
  421. , typename C
  422. , typename D
  423. , typename E
  424. , typename F
  425. , typename G
  426. , typename H
  427. , typename I
  428. , typename J
  429. >
  430. struct result { typedef T* type; };
  431. template <
  432. typename A, typename B, typename C, typename D, typename E,
  433. typename F, typename G, typename H, typename I, typename J
  434. >
  435. T* operator()(
  436. A const& a, B const& b, C const& c, D const& d, E const& e,
  437. F const& f, G const& g, H const& h, I const& i, J const& j) const
  438. {
  439. return new T(a, b, c, d, e, f, g, h, i, j);
  440. }
  441. };
  442. template <typename T>
  443. struct new_11 {
  444. template <
  445. typename A
  446. , typename B
  447. , typename C
  448. , typename D
  449. , typename E
  450. , typename F
  451. , typename G
  452. , typename H
  453. , typename I
  454. , typename J
  455. , typename K
  456. >
  457. struct result { typedef T* type; };
  458. template <
  459. typename A, typename B, typename C, typename D, typename E,
  460. typename F, typename G, typename H, typename I, typename J,
  461. typename K
  462. >
  463. T* operator()(
  464. A const& a, B const& b, C const& c, D const& d, E const& e,
  465. F const& f, G const& g, H const& h, I const& i, J const& j,
  466. K const& k) const
  467. {
  468. return new T(a, b, c, d, e, f, g, h, i, j, k);
  469. }
  470. };
  471. template <typename T>
  472. struct new_12 {
  473. template <
  474. typename A
  475. , typename B
  476. , typename C
  477. , typename D
  478. , typename E
  479. , typename F
  480. , typename G
  481. , typename H
  482. , typename I
  483. , typename J
  484. , typename K
  485. , typename L
  486. >
  487. struct result { typedef T* type; };
  488. template <
  489. typename A, typename B, typename C, typename D, typename E,
  490. typename F, typename G, typename H, typename I, typename J,
  491. typename K, typename L
  492. >
  493. T* operator()(
  494. A const& a, B const& b, C const& c, D const& d, E const& e,
  495. F const& f, G const& g, H const& h, I const& i, J const& j,
  496. K const& k, L const& l) const
  497. {
  498. return new T(a, b, c, d, f, e, g, h, i, j, k, l);
  499. }
  500. };
  501. #endif
  502. #if PHOENIX_CONSTRUCT_LIMIT > 12
  503. template <typename T>
  504. struct new_13 {
  505. template <
  506. typename A
  507. , typename B
  508. , typename C
  509. , typename D
  510. , typename E
  511. , typename F
  512. , typename G
  513. , typename H
  514. , typename I
  515. , typename J
  516. , typename K
  517. , typename L
  518. , typename M
  519. >
  520. struct result { typedef T* type; };
  521. template <
  522. typename A, typename B, typename C, typename D, typename E,
  523. typename F, typename G, typename H, typename I, typename J,
  524. typename K, typename L, typename M
  525. >
  526. T* operator()(
  527. A const& a, B const& b, C const& c, D const& d, E const& e,
  528. F const& f, G const& g, H const& h, I const& i, J const& j,
  529. K const& k, L const& l, M const& m) const
  530. {
  531. return new T(a, b, c, d, e, f, g, h, i, j, k, l, m);
  532. }
  533. };
  534. template <typename T>
  535. struct new_14 {
  536. template <
  537. typename A
  538. , typename B
  539. , typename C
  540. , typename D
  541. , typename E
  542. , typename F
  543. , typename G
  544. , typename H
  545. , typename I
  546. , typename J
  547. , typename K
  548. , typename L
  549. , typename M
  550. , typename N
  551. >
  552. struct result { typedef T* type; };
  553. template <
  554. typename A, typename B, typename C, typename D, typename E,
  555. typename F, typename G, typename H, typename I, typename J,
  556. typename K, typename L, typename M, typename N
  557. >
  558. T* operator()(
  559. A const& a, B const& b, C const& c, D const& d, E const& e,
  560. F const& f, G const& g, H const& h, I const& i, J const& j,
  561. K const& k, L const& l, M const& m, N const& n) const
  562. {
  563. return new T(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
  564. }
  565. };
  566. template <typename T>
  567. struct new_15 {
  568. template <
  569. typename A
  570. , typename B
  571. , typename C
  572. , typename D
  573. , typename E
  574. , typename F
  575. , typename G
  576. , typename H
  577. , typename I
  578. , typename J
  579. , typename K
  580. , typename L
  581. , typename M
  582. , typename N
  583. , typename O
  584. >
  585. struct result { typedef T* type; };
  586. template <
  587. typename A, typename B, typename C, typename D, typename E,
  588. typename F, typename G, typename H, typename I, typename J,
  589. typename K, typename L, typename M, typename N, typename O
  590. >
  591. T* operator()(
  592. A const& a, B const& b, C const& c, D const& d, E const& e,
  593. F const& f, G const& g, H const& h, I const& i, J const& j,
  594. K const& k, L const& l, M const& m, N const& n, O const& o) const
  595. {
  596. return new T(a, b, c, d, f, e, g, h, i, j, k, l, m, n, o);
  597. }
  598. };
  599. #endif
  600. #if defined(__BORLANDC__) || (defined(__MWERKS__) && (__MWERKS__ <= 0x3002))
  601. ///////////////////////////////////////////////////////////////////////////////
  602. //
  603. // The following specializations are needed because Borland and CodeWarrior
  604. // does not accept default template arguments in nested template classes in
  605. // classes (i.e new_l::result)
  606. //
  607. ///////////////////////////////////////////////////////////////////////////////
  608. template <typename T, typename TupleT>
  609. struct composite0_result<new_l_0<T>, TupleT> {
  610. typedef T* type;
  611. };
  612. //////////////////////////////////
  613. template <typename T, typename TupleT,
  614. typename A>
  615. struct composite1_result<new_l<T>, TupleT, A> {
  616. typedef T* type;
  617. };
  618. //////////////////////////////////
  619. template <typename T, typename TupleT,
  620. typename A, typename B>
  621. struct composite2_result<new_l<T>, TupleT, A, B> {
  622. typedef T* type;
  623. };
  624. //////////////////////////////////
  625. template <typename T, typename TupleT,
  626. typename A, typename B, typename C>
  627. struct composite3_result<new_l<T>, TupleT, A, B, C> {
  628. typedef T* type;
  629. };
  630. #if PHOENIX_LIMIT > 3
  631. //////////////////////////////////
  632. template <typename T, typename TupleT,
  633. typename A, typename B, typename C, typename D>
  634. struct composite4_result<new_l<T>, TupleT,
  635. A, B, C, D> {
  636. typedef T* type;
  637. };
  638. //////////////////////////////////
  639. template <typename T, typename TupleT,
  640. typename A, typename B, typename C, typename D, typename E>
  641. struct composite5_result<new_l<T>, TupleT,
  642. A, B, C, D, E> {
  643. typedef T* type;
  644. };
  645. //////////////////////////////////
  646. template <typename T, typename TupleT,
  647. typename A, typename B, typename C, typename D, typename E,
  648. typename F>
  649. struct composite6_result<new_l<T>, TupleT,
  650. A, B, C, D, E, F> {
  651. typedef T* type;
  652. };
  653. #if PHOENIX_LIMIT > 6
  654. //////////////////////////////////
  655. template <typename T, typename TupleT,
  656. typename A, typename B, typename C, typename D, typename E,
  657. typename F, typename G>
  658. struct composite7_result<new_l<T>, TupleT,
  659. A, B, C, D, E, F, G> {
  660. typedef T* type;
  661. };
  662. //////////////////////////////////
  663. template <typename T, typename TupleT,
  664. typename A, typename B, typename C, typename D, typename E,
  665. typename F, typename G, typename H>
  666. struct composite8_result<new_l<T>, TupleT,
  667. A, B, C, D, E, F, G, H> {
  668. typedef T* type;
  669. };
  670. //////////////////////////////////
  671. template <typename T, typename TupleT,
  672. typename A, typename B, typename C, typename D, typename E,
  673. typename F, typename G, typename H, typename I>
  674. struct composite9_result<new_l<T>, TupleT,
  675. A, B, C, D, E, F, G, H, I> {
  676. typedef T* type;
  677. };
  678. #if PHOENIX_LIMIT > 9
  679. //////////////////////////////////
  680. template <typename T, typename TupleT,
  681. typename A, typename B, typename C, typename D, typename E,
  682. typename F, typename G, typename H, typename I, typename J>
  683. struct composite10_result<new_l<T>, TupleT,
  684. A, B, C, D, E, F, G, H, I, J> {
  685. typedef T* type;
  686. };
  687. //////////////////////////////////
  688. template <typename T, typename TupleT,
  689. typename A, typename B, typename C, typename D, typename E,
  690. typename F, typename G, typename H, typename I, typename J,
  691. typename K>
  692. struct composite11_result<new_l<T>, TupleT,
  693. A, B, C, D, E, F, G, H, I, J, K> {
  694. typedef T* type;
  695. };
  696. //////////////////////////////////
  697. template <typename T, typename TupleT,
  698. typename A, typename B, typename C, typename D, typename E,
  699. typename F, typename G, typename H, typename I, typename J,
  700. typename K, typename L>
  701. struct composite12_result<new_l<T>, TupleT,
  702. A, B, C, D, E, F, G, H, I, J, K, L> {
  703. typedef T* type;
  704. };
  705. #if PHOENIX_LIMIT > 12
  706. //////////////////////////////////
  707. template <typename T, typename TupleT,
  708. typename A, typename B, typename C, typename D, typename E,
  709. typename F, typename G, typename H, typename I, typename J,
  710. typename K, typename L, typename M>
  711. struct composite13_result<new_l<T>, TupleT,
  712. A, B, C, D, E, F, G, H, I, J, K, L, M> {
  713. typedef T* type;
  714. };
  715. //////////////////////////////////
  716. template <typename T, typename TupleT,
  717. typename A, typename B, typename C, typename D, typename E,
  718. typename F, typename G, typename H, typename I, typename J,
  719. typename K, typename L, typename M, typename N>
  720. struct composite14_result<new_l<T>, TupleT,
  721. A, B, C, D, E, F, G, H, I, J, K, L, M, N> {
  722. typedef T* type;
  723. };
  724. //////////////////////////////////
  725. template <typename T, typename TupleT,
  726. typename A, typename B, typename C, typename D, typename E,
  727. typename F, typename G, typename H, typename I, typename J,
  728. typename K, typename L, typename M, typename N, typename O>
  729. struct composite15_result<new_l<T>, TupleT,
  730. A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> {
  731. typedef T* type;
  732. };
  733. #endif
  734. #endif
  735. #endif
  736. #endif
  737. #endif
  738. //////////////////////////////////
  739. template <typename T>
  740. inline typename impl::make_composite<new_l_0<T> >::type
  741. new_()
  742. {
  743. typedef impl::make_composite<new_l_0<T> > make_composite_t;
  744. typedef typename make_composite_t::type type_t;
  745. typedef typename make_composite_t::composite_type composite_type_t;
  746. return type_t(composite_type_t(new_l_0<T>()));
  747. }
  748. //////////////////////////////////
  749. template <typename T, typename A>
  750. inline typename impl::make_composite<new_1<T>, A>::type
  751. new_(A const& a)
  752. {
  753. typedef impl::make_composite<new_1<T>, A> make_composite_t;
  754. typedef typename make_composite_t::type type_t;
  755. typedef typename make_composite_t::composite_type composite_type_t;
  756. return type_t(composite_type_t(new_1<T>(),
  757. as_actor<A>::convert(a)
  758. ));
  759. }
  760. //////////////////////////////////
  761. template <typename T, typename A, typename B>
  762. inline typename impl::make_composite<new_2<T>, A, B>::type
  763. new_(A const& a, B const& b)
  764. {
  765. typedef impl::make_composite<new_2<T>, A, B> make_composite_t;
  766. typedef typename make_composite_t::type type_t;
  767. typedef typename make_composite_t::composite_type composite_type_t;
  768. return type_t(composite_type_t(new_2<T>(),
  769. as_actor<A>::convert(a),
  770. as_actor<B>::convert(b)
  771. ));
  772. }
  773. //////////////////////////////////
  774. template <typename T, typename A, typename B, typename C>
  775. inline typename impl::make_composite<new_3<T>, A, B, C>::type
  776. new_(A const& a, B const& b, C const& c)
  777. {
  778. typedef impl::make_composite<new_3<T>, A, B, C> make_composite_t;
  779. typedef typename make_composite_t::type type_t;
  780. typedef typename make_composite_t::composite_type composite_type_t;
  781. return type_t(composite_type_t(new_3<T>(),
  782. as_actor<A>::convert(a),
  783. as_actor<B>::convert(b),
  784. as_actor<C>::convert(c)
  785. ));
  786. }
  787. #if PHOENIX_CONSTRUCT_LIMIT > 3
  788. //////////////////////////////////
  789. template <
  790. typename T, typename A, typename B, typename C, typename D
  791. >
  792. inline typename impl::make_composite<new_4<T>, A, B, C, D>::type
  793. new_(
  794. A const& a, B const& b, C const& c, D const& d)
  795. {
  796. typedef
  797. impl::make_composite<new_4<T>, A, B, C, D>
  798. make_composite_t;
  799. typedef typename make_composite_t::type type_t;
  800. typedef typename make_composite_t::composite_type composite_type_t;
  801. return type_t(composite_type_t(new_4<T>(),
  802. as_actor<A>::convert(a),
  803. as_actor<B>::convert(b),
  804. as_actor<C>::convert(c),
  805. as_actor<D>::convert(d)
  806. ));
  807. }
  808. //////////////////////////////////
  809. template <
  810. typename T, typename A, typename B, typename C, typename D, typename E
  811. >
  812. inline typename impl::make_composite<new_5<T>, A, B, C, D, E>::type
  813. new_(
  814. A const& a, B const& b, C const& c, D const& d, E const& e)
  815. {
  816. typedef
  817. impl::make_composite<new_5<T>, A, B, C, D, E>
  818. make_composite_t;
  819. typedef typename make_composite_t::type type_t;
  820. typedef typename make_composite_t::composite_type composite_type_t;
  821. return type_t(composite_type_t(new_5<T>(),
  822. as_actor<A>::convert(a),
  823. as_actor<B>::convert(b),
  824. as_actor<C>::convert(c),
  825. as_actor<D>::convert(d),
  826. as_actor<E>::convert(e)
  827. ));
  828. }
  829. //////////////////////////////////
  830. template <
  831. typename T, typename A, typename B, typename C, typename D, typename E,
  832. typename F
  833. >
  834. inline typename impl::make_composite<new_6<T>, A, B, C, D, E, F>::type
  835. new_(
  836. A const& a, B const& b, C const& c, D const& d, E const& e,
  837. F const& f)
  838. {
  839. typedef
  840. impl::make_composite<new_6<T>, A, B, C, D, E, F>
  841. make_composite_t;
  842. typedef typename make_composite_t::type type_t;
  843. typedef typename make_composite_t::composite_type composite_type_t;
  844. return type_t(composite_type_t(new_6<T>(),
  845. as_actor<A>::convert(a),
  846. as_actor<B>::convert(b),
  847. as_actor<C>::convert(c),
  848. as_actor<D>::convert(d),
  849. as_actor<E>::convert(e),
  850. as_actor<F>::convert(f)
  851. ));
  852. }
  853. #if PHOENIX_CONSTRUCT_LIMIT > 6
  854. //////////////////////////////////
  855. template <
  856. typename T, typename A, typename B, typename C, typename D, typename E,
  857. typename F, typename G
  858. >
  859. inline typename impl::make_composite<new_7<T>, A, B, C, D, E, F, G>::type
  860. new_(
  861. A const& a, B const& b, C const& c, D const& d, E const& e,
  862. F const& f, G const& g)
  863. {
  864. typedef
  865. impl::make_composite<new_7<T>, A, B, C, D, E, F, G>
  866. make_composite_t;
  867. typedef typename make_composite_t::type type_t;
  868. typedef typename make_composite_t::composite_type composite_type_t;
  869. return type_t(composite_type_t(new_7<T>(),
  870. as_actor<A>::convert(a),
  871. as_actor<B>::convert(b),
  872. as_actor<C>::convert(c),
  873. as_actor<D>::convert(d),
  874. as_actor<E>::convert(e),
  875. as_actor<F>::convert(f),
  876. as_actor<G>::convert(g)
  877. ));
  878. }
  879. //////////////////////////////////
  880. template <
  881. typename T, typename A, typename B, typename C, typename D, typename E,
  882. typename F, typename G, typename H
  883. >
  884. inline typename impl::make_composite<new_8<T>, A, B, C, D, E, F, G, H>::type
  885. new_(
  886. A const& a, B const& b, C const& c, D const& d, E const& e,
  887. F const& f, G const& g, H const& h)
  888. {
  889. typedef
  890. impl::make_composite<new_8<T>, A, B, C, D, E, F, G, H>
  891. make_composite_t;
  892. typedef typename make_composite_t::type type_t;
  893. typedef typename make_composite_t::composite_type composite_type_t;
  894. return type_t(composite_type_t(new_8<T>(),
  895. as_actor<A>::convert(a),
  896. as_actor<B>::convert(b),
  897. as_actor<C>::convert(c),
  898. as_actor<D>::convert(d),
  899. as_actor<E>::convert(e),
  900. as_actor<F>::convert(f),
  901. as_actor<G>::convert(g),
  902. as_actor<H>::convert(h)
  903. ));
  904. }
  905. //////////////////////////////////
  906. template <
  907. typename T, typename A, typename B, typename C, typename D, typename E,
  908. typename F, typename G, typename H, typename I
  909. >
  910. inline typename impl::make_composite<new_9<T>, A, B, C, D, E, F, G, H, I>::type
  911. new_(
  912. A const& a, B const& b, C const& c, D const& d, E const& e,
  913. F const& f, G const& g, H const& h, I const& i)
  914. {
  915. typedef
  916. impl::make_composite<new_9<T>, A, B, C, D, E, F, G, H, I>
  917. make_composite_t;
  918. typedef typename make_composite_t::type type_t;
  919. typedef typename make_composite_t::composite_type composite_type_t;
  920. return type_t(composite_type_t(new_9<T>(),
  921. as_actor<A>::convert(a),
  922. as_actor<B>::convert(b),
  923. as_actor<C>::convert(c),
  924. as_actor<D>::convert(d),
  925. as_actor<E>::convert(e),
  926. as_actor<F>::convert(f),
  927. as_actor<G>::convert(g),
  928. as_actor<H>::convert(h),
  929. as_actor<I>::convert(i)
  930. ));
  931. }
  932. #if PHOENIX_CONSTRUCT_LIMIT > 9
  933. //////////////////////////////////
  934. template <
  935. typename T, typename A, typename B, typename C, typename D, typename E,
  936. typename F, typename G, typename H, typename I, typename J
  937. >
  938. inline typename impl::make_composite<
  939. new_10<T>, A, B, C, D, E, F, G, H, I, J>::type
  940. new_(
  941. A const& a, B const& b, C const& c, D const& d, E const& e,
  942. F const& f, G const& g, H const& h, I const& i, J const& j)
  943. {
  944. typedef
  945. impl::make_composite<
  946. new_10<T>, A, B, C, D, E, F, G, H, I, J
  947. >
  948. make_composite_t;
  949. typedef typename make_composite_t::type type_t;
  950. typedef typename make_composite_t::composite_type composite_type_t;
  951. return type_t(composite_type_t(new_10<T>(),
  952. as_actor<A>::convert(a),
  953. as_actor<B>::convert(b),
  954. as_actor<C>::convert(c),
  955. as_actor<D>::convert(d),
  956. as_actor<E>::convert(e),
  957. as_actor<F>::convert(f),
  958. as_actor<G>::convert(g),
  959. as_actor<H>::convert(h),
  960. as_actor<I>::convert(i),
  961. as_actor<J>::convert(j)
  962. ));
  963. }
  964. //////////////////////////////////
  965. template <
  966. typename T, typename A, typename B, typename C, typename D, typename E,
  967. typename F, typename G, typename H, typename I, typename J, typename K
  968. >
  969. inline typename impl::make_composite<
  970. new_11<T>, A, B, C, D, E, F, G, H, I, J, K>::type
  971. new_(
  972. A const& a, B const& b, C const& c, D const& d, E const& e,
  973. F const& f, G const& g, H const& h, I const& i, J const& j,
  974. K const& k)
  975. {
  976. typedef
  977. impl::make_composite<
  978. new_11<T>, A, B, C, D, E, F, G, H, I, J, K
  979. >
  980. make_composite_t;
  981. typedef typename make_composite_t::type type_t;
  982. typedef typename make_composite_t::composite_type composite_type_t;
  983. return type_t(composite_type_t(new_11<T>(),
  984. as_actor<A>::convert(a),
  985. as_actor<B>::convert(b),
  986. as_actor<C>::convert(c),
  987. as_actor<D>::convert(d),
  988. as_actor<E>::convert(e),
  989. as_actor<F>::convert(f),
  990. as_actor<G>::convert(g),
  991. as_actor<H>::convert(h),
  992. as_actor<I>::convert(i),
  993. as_actor<J>::convert(j),
  994. as_actor<K>::convert(k)
  995. ));
  996. }
  997. //////////////////////////////////
  998. template <
  999. typename T, typename A, typename B, typename C, typename D, typename E,
  1000. typename F, typename G, typename H, typename I, typename J, typename K,
  1001. typename L
  1002. >
  1003. inline typename impl::make_composite<
  1004. new_12<T>, A, B, C, D, E, F, G, H, I, J, K, L>::type
  1005. new_(
  1006. A const& a, B const& b, C const& c, D const& d, E const& e,
  1007. F const& f, G const& g, H const& h, I const& i, J const& j,
  1008. K const& k, L const& l)
  1009. {
  1010. typedef
  1011. impl::make_composite<
  1012. new_12<T>, A, B, C, D, E, F, G, H, I, J, K, L
  1013. >
  1014. make_composite_t;
  1015. typedef typename make_composite_t::type type_t;
  1016. typedef typename make_composite_t::composite_type composite_type_t;
  1017. return type_t(composite_type_t(new_12<T>(),
  1018. as_actor<A>::convert(a),
  1019. as_actor<B>::convert(b),
  1020. as_actor<C>::convert(c),
  1021. as_actor<D>::convert(d),
  1022. as_actor<E>::convert(e),
  1023. as_actor<F>::convert(f),
  1024. as_actor<G>::convert(g),
  1025. as_actor<H>::convert(h),
  1026. as_actor<I>::convert(i),
  1027. as_actor<J>::convert(j),
  1028. as_actor<K>::convert(k),
  1029. as_actor<L>::convert(l)
  1030. ));
  1031. }
  1032. #if PHOENIX_CONSTRUCT_LIMIT > 12
  1033. //////////////////////////////////
  1034. template <
  1035. typename T, typename A, typename B, typename C, typename D, typename E,
  1036. typename F, typename G, typename H, typename I, typename J, typename K,
  1037. typename L, typename M
  1038. >
  1039. inline typename impl::make_composite<
  1040. new_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
  1041. new_(
  1042. A const& a, B const& b, C const& c, D const& d, E const& e,
  1043. F const& f, G const& g, H const& h, I const& i, J const& j,
  1044. K const& k, L const& l, M const& m)
  1045. {
  1046. typedef
  1047. impl::make_composite<
  1048. new_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M
  1049. >
  1050. make_composite_t;
  1051. typedef typename make_composite_t::type type_t;
  1052. typedef typename make_composite_t::composite_type composite_type_t;
  1053. return type_t(composite_type_t(new_13<T>(),
  1054. as_actor<A>::convert(a),
  1055. as_actor<B>::convert(b),
  1056. as_actor<C>::convert(c),
  1057. as_actor<D>::convert(d),
  1058. as_actor<E>::convert(e),
  1059. as_actor<F>::convert(f),
  1060. as_actor<G>::convert(g),
  1061. as_actor<H>::convert(h),
  1062. as_actor<I>::convert(i),
  1063. as_actor<J>::convert(j),
  1064. as_actor<K>::convert(k),
  1065. as_actor<L>::convert(l),
  1066. as_actor<M>::convert(m)
  1067. ));
  1068. }
  1069. //////////////////////////////////
  1070. template <
  1071. typename T, typename A, typename B, typename C, typename D, typename E,
  1072. typename F, typename G, typename H, typename I, typename J, typename K,
  1073. typename L, typename M, typename N
  1074. >
  1075. inline typename impl::make_composite<
  1076. new_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
  1077. new_(
  1078. A const& a, B const& b, C const& c, D const& d, E const& e,
  1079. F const& f, G const& g, H const& h, I const& i, J const& j,
  1080. K const& k, L const& l, M const& m, N const& n)
  1081. {
  1082. typedef
  1083. impl::make_composite<
  1084. new_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N
  1085. >
  1086. make_composite_t;
  1087. typedef typename make_composite_t::type type_t;
  1088. typedef typename make_composite_t::composite_type composite_type_t;
  1089. return type_t(composite_type_t(new_14<T>(),
  1090. as_actor<A>::convert(a),
  1091. as_actor<B>::convert(b),
  1092. as_actor<C>::convert(c),
  1093. as_actor<D>::convert(d),
  1094. as_actor<E>::convert(e),
  1095. as_actor<F>::convert(f),
  1096. as_actor<G>::convert(g),
  1097. as_actor<H>::convert(h),
  1098. as_actor<I>::convert(i),
  1099. as_actor<J>::convert(j),
  1100. as_actor<K>::convert(k),
  1101. as_actor<L>::convert(l),
  1102. as_actor<M>::convert(m),
  1103. as_actor<N>::convert(n)
  1104. ));
  1105. }
  1106. //////////////////////////////////
  1107. template <
  1108. typename T, typename A, typename B, typename C, typename D, typename E,
  1109. typename F, typename G, typename H, typename I, typename J, typename K,
  1110. typename L, typename M, typename N, typename O
  1111. >
  1112. inline typename impl::make_composite<
  1113. new_15<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, O>::type
  1114. new_(
  1115. A const& a, B const& b, C const& c, D const& d, E const& e,
  1116. F const& f, G const& g, H const& h, I const& i, J const& j,
  1117. K const& k, L const& l, M const& m, N const& n, O const& o)
  1118. {
  1119. typedef
  1120. impl::make_composite<
  1121. new_15<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
  1122. >
  1123. make_composite_t;
  1124. typedef typename make_composite_t::type type_t;
  1125. typedef typename make_composite_t::composite_type composite_type_t;
  1126. return type_t(composite_type_t(new_15<T>(),
  1127. as_actor<A>::convert(a),
  1128. as_actor<B>::convert(b),
  1129. as_actor<C>::convert(c),
  1130. as_actor<D>::convert(d),
  1131. as_actor<E>::convert(e),
  1132. as_actor<F>::convert(f),
  1133. as_actor<G>::convert(g),
  1134. as_actor<H>::convert(h),
  1135. as_actor<I>::convert(i),
  1136. as_actor<J>::convert(j),
  1137. as_actor<K>::convert(k),
  1138. as_actor<L>::convert(l),
  1139. as_actor<M>::convert(m),
  1140. as_actor<N>::convert(n),
  1141. as_actor<O>::convert(o)
  1142. ));
  1143. }
  1144. #endif
  1145. #endif
  1146. #endif
  1147. #endif
  1148. ///////////////////////////////////////////////////////////////////////////////
  1149. } // namespace phoenix
  1150. #endif // PHOENIX_NEW_HPP