]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/spirit/home/classic/phoenix/casts.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / spirit / home / classic / phoenix / casts.hpp
1 /*=============================================================================
2 Phoenix V1.2.1
3 Copyright (c) 2001-2003 Joel de Guzman
4 Copyright (c) 2001-2003 Hartmut Kaiser
5
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
10 #ifndef PHOENIX_CASTS_HPP
11 #define PHOENIX_CASTS_HPP
12
13 ///////////////////////////////////////////////////////////////////////////////
14 #include <boost/spirit/home/classic/phoenix/actor.hpp>
15 #include <boost/spirit/home/classic/phoenix/composite.hpp>
16 #include <boost/static_assert.hpp>
17
18 ///////////////////////////////////////////////////////////////////////////////
19 namespace phoenix {
20
21 ///////////////////////////////////////////////////////////////////////////////
22 //
23 // Phoenix predefined maximum construct_ limit. This limit defines the maximum
24 // number of parameters supported for calles to the set of construct_ template
25 // functions (lazy object construction, see below). This number defaults to 3.
26 // The actual maximum is rounded up in multiples of 3. Thus, if this value
27 // is 4, the actual limit is 6. The ultimate maximum limit in this
28 // implementation is 15.
29 // PHOENIX_CONSTRUCT_LIMIT should NOT be greater than PHOENIX_LIMIT!
30
31 #if !defined(PHOENIX_CONSTRUCT_LIMIT)
32 #define PHOENIX_CONSTRUCT_LIMIT PHOENIX_LIMIT
33 #endif
34
35 // ensure PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT
36 BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT);
37
38 // ensure PHOENIX_CONSTRUCT_LIMIT <= 15
39 BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= 15);
40
41 ///////////////////////////////////////////////////////////////////////////////
42 //
43 // Lazy C++ casts
44 //
45 // The set of lazy C++ cast template classes and functions provide a way
46 // of lazily casting certain type to another during parsing.
47 // The lazy C++ templates are (syntactically) used very much like
48 // the well known C++ casts:
49 //
50 // A *a = static_cast_<A *>(...actor returning a convertible type...);
51 //
52 // where the given parameter should be an actor, which eval() function
53 // returns a convertible type.
54 //
55 ///////////////////////////////////////////////////////////////////////////////
56 template <typename T, typename A>
57 struct static_cast_l {
58
59 template <typename TupleT>
60 struct result { typedef T type; };
61
62 static_cast_l(A const& a_)
63 : a(a_) {}
64
65 template <typename TupleT>
66 T
67 eval(TupleT const& args) const
68 {
69 return static_cast<T>(a.eval(args));
70 }
71
72 A a;
73 };
74
75 //////////////////////////////////
76 template <typename T, typename BaseAT>
77 inline actor<static_cast_l<T, BaseAT> >
78 static_cast_(actor<BaseAT> const& a)
79 {
80 typedef static_cast_l<T, BaseAT> cast_t;
81 return actor<cast_t>(cast_t(a));
82 }
83
84 //////////////////////////////////
85 template <typename T, typename A>
86 struct dynamic_cast_l {
87
88 template <typename TupleT>
89 struct result { typedef T type; };
90
91 dynamic_cast_l(A const& a_)
92 : a(a_) {}
93
94 template <typename TupleT>
95 T
96 eval(TupleT const& args) const
97 {
98 return dynamic_cast<T>(a.eval(args));
99 }
100
101 A a;
102 };
103
104 //////////////////////////////////
105 template <typename T, typename BaseAT>
106 inline actor<dynamic_cast_l<T, BaseAT> >
107 dynamic_cast_(actor<BaseAT> const& a)
108 {
109 typedef dynamic_cast_l<T, BaseAT> cast_t;
110 return actor<cast_t>(cast_t(a));
111 }
112
113 //////////////////////////////////
114 template <typename T, typename A>
115 struct reinterpret_cast_l {
116
117 template <typename TupleT>
118 struct result { typedef T type; };
119
120 reinterpret_cast_l(A const& a_)
121 : a(a_) {}
122
123 template <typename TupleT>
124 T
125 eval(TupleT const& args) const
126 {
127 return reinterpret_cast<T>(a.eval(args));
128 }
129
130 A a;
131 };
132
133 //////////////////////////////////
134 template <typename T, typename BaseAT>
135 inline actor<reinterpret_cast_l<T, BaseAT> >
136 reinterpret_cast_(actor<BaseAT> const& a)
137 {
138 typedef reinterpret_cast_l<T, BaseAT> cast_t;
139 return actor<cast_t>(cast_t(a));
140 }
141
142 //////////////////////////////////
143 template <typename T, typename A>
144 struct const_cast_l {
145
146 template <typename TupleT>
147 struct result { typedef T type; };
148
149 const_cast_l(A const& a_)
150 : a(a_) {}
151
152 template <typename TupleT>
153 T
154 eval(TupleT const& args) const
155 {
156 return const_cast<T>(a.eval(args));
157 }
158
159 A a;
160 };
161
162 //////////////////////////////////
163 template <typename T, typename BaseAT>
164 inline actor<const_cast_l<T, BaseAT> >
165 const_cast_(actor<BaseAT> const& a)
166 {
167 typedef const_cast_l<T, BaseAT> cast_t;
168 return actor<cast_t>(cast_t(a));
169 }
170
171 ///////////////////////////////////////////////////////////////////////////////
172 //
173 // construct_
174 //
175 // Lazy object construction
176 //
177 // The set of construct_<> template classes and functions provide a way
178 // of lazily constructing certain object from a arbitrary set of
179 // actors during parsing.
180 // The construct_ templates are (syntactically) used very much like
181 // the well known C++ casts:
182 //
183 // A a = construct_<A>(...arbitrary list of actors...);
184 //
185 // where the given parameters are submitted as parameters to the
186 // contructor of the object of type A. (This certainly implies, that
187 // type A has a constructor with a fitting set of parameter types
188 // defined.)
189 //
190 // The maximum number of needed parameters is controlled through the
191 // preprocessor constant PHOENIX_CONSTRUCT_LIMIT. Note though, that this
192 // limit should not be greater than PHOENIX_LIMIT.
193 //
194 ///////////////////////////////////////////////////////////////////////////////
195 template <typename T>
196 struct construct_l_0 {
197 typedef T result_type;
198
199 T operator()() const {
200 return T();
201 }
202 };
203
204
205 template <typename T>
206 struct construct_l {
207
208 template <
209 typename A
210 , typename B
211 , typename C
212
213 #if PHOENIX_CONSTRUCT_LIMIT > 3
214 , typename D
215 , typename E
216 , typename F
217
218 #if PHOENIX_CONSTRUCT_LIMIT > 6
219 , typename G
220 , typename H
221 , typename I
222
223 #if PHOENIX_CONSTRUCT_LIMIT > 9
224 , typename J
225 , typename K
226 , typename L
227
228 #if PHOENIX_CONSTRUCT_LIMIT > 12
229 , typename M
230 , typename N
231 , typename O
232 #endif
233 #endif
234 #endif
235 #endif
236 >
237 struct result { typedef T type; };
238
239 T operator()() const
240 {
241 return T();
242 }
243
244 template <typename A>
245 T operator()(A const& a) const
246 {
247 T t(a);
248 return t;
249 }
250
251 template <typename A, typename B>
252 T operator()(A const& a, B const& b) const
253 {
254 T t(a, b);
255 return t;
256 }
257
258 template <typename A, typename B, typename C>
259 T operator()(A const& a, B const& b, C const& c) const
260 {
261 T t(a, b, c);
262 return t;
263 }
264
265 #if PHOENIX_CONSTRUCT_LIMIT > 3
266 template <
267 typename A, typename B, typename C, typename D
268 >
269 T operator()(
270 A const& a, B const& b, C const& c, D const& d) const
271 {
272 T t(a, b, c, d);
273 return t;
274 }
275
276 template <
277 typename A, typename B, typename C, typename D, typename E
278 >
279 T operator()(
280 A const& a, B const& b, C const& c, D const& d, E const& e) const
281 {
282 T t(a, b, c, d, e);
283 return t;
284 }
285
286 template <
287 typename A, typename B, typename C, typename D, typename E,
288 typename F
289 >
290 T operator()(
291 A const& a, B const& b, C const& c, D const& d, E const& e,
292 F const& f) const
293 {
294 T t(a, b, c, d, e, f);
295 return t;
296 }
297
298 #if PHOENIX_CONSTRUCT_LIMIT > 6
299 template <
300 typename A, typename B, typename C, typename D, typename E,
301 typename F, typename G
302 >
303 T operator()(
304 A const& a, B const& b, C const& c, D const& d, E const& e,
305 F const& f, G const& g) const
306 {
307 T t(a, b, c, d, e, f, g);
308 return t;
309 }
310
311 template <
312 typename A, typename B, typename C, typename D, typename E,
313 typename F, typename G, typename H
314 >
315 T operator()(
316 A const& a, B const& b, C const& c, D const& d, E const& e,
317 F const& f, G const& g, H const& h) const
318 {
319 T t(a, b, c, d, e, f, g, h);
320 return t;
321 }
322
323 template <
324 typename A, typename B, typename C, typename D, typename E,
325 typename F, typename G, typename H, typename I
326 >
327 T operator()(
328 A const& a, B const& b, C const& c, D const& d, E const& e,
329 F const& f, G const& g, H const& h, I const& i) const
330 {
331 T t(a, b, c, d, e, f, g, h, i);
332 return t;
333 }
334
335 #if PHOENIX_CONSTRUCT_LIMIT > 9
336 template <
337 typename A, typename B, typename C, typename D, typename E,
338 typename F, typename G, typename H, typename I, typename J
339 >
340 T operator()(
341 A const& a, B const& b, C const& c, D const& d, E const& e,
342 F const& f, G const& g, H const& h, I const& i, J const& j) const
343 {
344 T t(a, b, c, d, e, f, g, h, i, j);
345 return t;
346 }
347
348 template <
349 typename A, typename B, typename C, typename D, typename E,
350 typename F, typename G, typename H, typename I, typename J,
351 typename K
352 >
353 T operator()(
354 A const& a, B const& b, C const& c, D const& d, E const& e,
355 F const& f, G const& g, H const& h, I const& i, J const& j,
356 K const& k) const
357 {
358 T t(a, b, c, d, e, f, g, h, i, j, k);
359 return t;
360 }
361
362 template <
363 typename A, typename B, typename C, typename D, typename E,
364 typename F, typename G, typename H, typename I, typename J,
365 typename K, typename L
366 >
367 T operator()(
368 A const& a, B const& b, C const& c, D const& d, E const& e,
369 F const& f, G const& g, H const& h, I const& i, J const& j,
370 K const& k, L const& l) const
371 {
372 T t(a, b, c, d, e, f, g, h, i, j, k, l);
373 return t;
374 }
375
376 #if PHOENIX_CONSTRUCT_LIMIT > 12
377 template <
378 typename A, typename B, typename C, typename D, typename E,
379 typename F, typename G, typename H, typename I, typename J,
380 typename K, typename L, typename M
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, I const& i, J const& j,
385 K const& k, L const& l, M const& m) const
386 {
387 T t(a, b, c, d, e, f, g, h, i, j, k, l, m);
388 return t;
389 }
390
391 template <
392 typename A, typename B, typename C, typename D, typename E,
393 typename F, typename G, typename H, typename I, typename J,
394 typename K, typename L, typename M, typename N
395 >
396 T operator()(
397 A const& a, B const& b, C const& c, D const& d, E const& e,
398 F const& f, G const& g, H const& h, I const& i, J const& j,
399 K const& k, L const& l, M const& m, N const& n) const
400 {
401 T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
402 return t;
403 }
404
405 template <
406 typename A, typename B, typename C, typename D, typename E,
407 typename F, typename G, typename H, typename I, typename J,
408 typename K, typename L, typename M, typename N, typename O
409 >
410 T operator()(
411 A const& a, B const& b, C const& c, D const& d, E const& e,
412 F const& f, G const& g, H const& h, I const& i, J const& j,
413 K const& k, L const& l, M const& m, N const& n, O const& o) const
414 {
415 T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
416 return t;
417 }
418
419 #endif
420 #endif
421 #endif
422 #endif
423 };
424
425
426 template <typename T>
427 struct construct_1 {
428
429 template <
430 typename A
431 >
432 struct result { typedef T type; };
433
434 template <typename A>
435 T operator()(A const& a) const
436 {
437 T t(a);
438 return t;
439 }
440
441 };
442
443 template <typename T>
444 struct construct_2 {
445
446 template <
447 typename A
448 , typename B
449 >
450 struct result { typedef T type; };
451
452 template <typename A, typename B>
453 T operator()(A const& a, B const& b) const
454 {
455 T t(a, b);
456 return t;
457 }
458
459 };
460
461 template <typename T>
462 struct construct_3 {
463
464 template <
465 typename A
466 , typename B
467 , typename C
468 >
469 struct result { typedef T type; };
470
471 template <typename A, typename B, typename C>
472 T operator()(A const& a, B const& b, C const& c) const
473 {
474 T t(a, b, c);
475 return t;
476 }
477 };
478
479 #if PHOENIX_CONSTRUCT_LIMIT > 3
480 template <typename T>
481 struct construct_4 {
482
483 template <
484 typename A
485 , typename B
486 , typename C
487 , typename D
488 >
489 struct result { typedef T type; };
490
491 template <
492 typename A, typename B, typename C, typename D
493 >
494 T operator()(
495 A const& a, B const& b, C const& c, D const& d) const
496 {
497 T t(a, b, c, d);
498 return t;
499 }
500 };
501
502
503 template <typename T>
504 struct construct_5 {
505
506 template <
507 typename A
508 , typename B
509 , typename C
510 , typename D
511 , typename E
512 >
513 struct result { typedef T type; };
514
515 template <
516 typename A, typename B, typename C, typename D, typename E
517 >
518 T operator()(
519 A const& a, B const& b, C const& c, D const& d, E const& e) const
520 {
521 T t(a, b, c, d, e);
522 return t;
523 }
524 };
525
526
527 template <typename T>
528 struct construct_6 {
529
530 template <
531 typename A
532 , typename B
533 , typename C
534 , typename D
535 , typename E
536 , typename F
537 >
538 struct result { typedef T type; };
539
540 template <
541 typename A, typename B, typename C, typename D, typename E,
542 typename F
543 >
544 T operator()(
545 A const& a, B const& b, C const& c, D const& d, E const& e,
546 F const& f) const
547 {
548 T t(a, b, c, d, e, f);
549 return t;
550 }
551 };
552 #endif
553
554
555 #if PHOENIX_CONSTRUCT_LIMIT > 6
556 template <typename T>
557 struct construct_7 {
558
559 template <
560 typename A
561 , typename B
562 , typename C
563 , typename D
564 , typename E
565 , typename F
566 , typename G
567 >
568 struct result { typedef T type; };
569
570 template <
571 typename A, typename B, typename C, typename D, typename E,
572 typename F, typename G
573 >
574 T operator()(
575 A const& a, B const& b, C const& c, D const& d, E const& e,
576 F const& f, G const& g) const
577 {
578 T t(a, b, c, d, e, f, g);
579 return t;
580 }
581 };
582
583 template <typename T>
584 struct construct_8 {
585
586 template <
587 typename A
588 , typename B
589 , typename C
590 , typename D
591 , typename E
592 , typename F
593 , typename G
594 , typename H
595 >
596 struct result { typedef T type; };
597
598 template <
599 typename A, typename B, typename C, typename D, typename E,
600 typename F, typename G, typename H
601 >
602 T operator()(
603 A const& a, B const& b, C const& c, D const& d, E const& e,
604 F const& f, G const& g, H const& h) const
605 {
606 T t(a, b, c, d, e, f, g, h);
607 return t;
608 }
609 };
610
611 template <typename T>
612 struct construct_9 {
613
614 template <
615 typename A
616 , typename B
617 , typename C
618 , typename D
619 , typename E
620 , typename F
621 , typename G
622 , typename H
623 , typename I
624 >
625 struct result { typedef T type; };
626
627 template <
628 typename A, typename B, typename C, typename D, typename E,
629 typename F, typename G, typename H, typename I
630 >
631 T operator()(
632 A const& a, B const& b, C const& c, D const& d, E const& e,
633 F const& f, G const& g, H const& h, I const& i) const
634 {
635 T t(a, b, c, d, e, f, g, h, i);
636 return t;
637 }
638 };
639 #endif
640
641
642 #if PHOENIX_CONSTRUCT_LIMIT > 9
643 template <typename T>
644 struct construct_10 {
645
646 template <
647 typename A
648 , typename B
649 , typename C
650 , typename D
651 , typename E
652 , typename F
653 , typename G
654 , typename H
655 , typename I
656 , typename J
657 >
658 struct result { typedef T type; };
659
660 template <
661 typename A, typename B, typename C, typename D, typename E,
662 typename F, typename G, typename H, typename I, typename J
663 >
664 T operator()(
665 A const& a, B const& b, C const& c, D const& d, E const& e,
666 F const& f, G const& g, H const& h, I const& i, J const& j) const
667 {
668 T t(a, b, c, d, e, f, g, h, i, j);
669 return t;
670 }
671 };
672
673 template <typename T>
674 struct construct_11 {
675
676 template <
677 typename A
678 , typename B
679 , typename C
680 , typename D
681 , typename E
682 , typename F
683 , typename G
684 , typename H
685 , typename I
686 , typename J
687 , typename K
688 >
689 struct result { typedef T type; };
690
691 template <
692 typename A, typename B, typename C, typename D, typename E,
693 typename F, typename G, typename H, typename I, typename J,
694 typename K
695 >
696 T operator()(
697 A const& a, B const& b, C const& c, D const& d, E const& e,
698 F const& f, G const& g, H const& h, I const& i, J const& j,
699 K const& k) const
700 {
701 T t(a, b, c, d, e, f, g, h, i, j, k);
702 return t;
703 }
704 };
705
706 template <typename T>
707 struct construct_12 {
708
709 template <
710 typename A
711 , typename B
712 , typename C
713 , typename D
714 , typename E
715 , typename F
716 , typename G
717 , typename H
718 , typename I
719 , typename J
720 , typename K
721 , typename L
722 >
723 struct result { typedef T type; };
724
725 template <
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
729 >
730 T operator()(
731 A const& a, B const& b, C const& c, D const& d, E const& e,
732 F const& f, G const& g, H const& h, I const& i, J const& j,
733 K const& k, L const& l) const
734 {
735 T t(a, b, c, d, f, e, g, h, i, j, k, l);
736 return t;
737 }
738 };
739 #endif
740
741 #if PHOENIX_CONSTRUCT_LIMIT > 12
742 template <typename T>
743 struct construct_13 {
744
745 template <
746 typename A
747 , typename B
748 , typename C
749 , typename D
750 , typename E
751 , typename F
752 , typename G
753 , typename H
754 , typename I
755 , typename J
756 , typename K
757 , typename L
758 , typename M
759 >
760 struct result { typedef T type; };
761
762 template <
763 typename A, typename B, typename C, typename D, typename E,
764 typename F, typename G, typename H, typename I, typename J,
765 typename K, typename L, typename M
766 >
767 T operator()(
768 A const& a, B const& b, C const& c, D const& d, E const& e,
769 F const& f, G const& g, H const& h, I const& i, J const& j,
770 K const& k, L const& l, M const& m) const
771 {
772 T t(a, b, c, d, e, f, g, h, i, j, k, l, m);
773 return t;
774 }
775 };
776
777 template <typename T>
778 struct construct_14 {
779
780 template <
781 typename A
782 , typename B
783 , typename C
784 , typename D
785 , typename E
786 , typename F
787 , typename G
788 , typename H
789 , typename I
790 , typename J
791 , typename K
792 , typename L
793 , typename M
794 , typename N
795 >
796 struct result { typedef T type; };
797
798 template <
799 typename A, typename B, typename C, typename D, typename E,
800 typename F, typename G, typename H, typename I, typename J,
801 typename K, typename L, typename M, typename N
802 >
803 T operator()(
804 A const& a, B const& b, C const& c, D const& d, E const& e,
805 F const& f, G const& g, H const& h, I const& i, J const& j,
806 K const& k, L const& l, M const& m, N const& n) const
807 {
808 T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
809 return t;
810 }
811 };
812
813 template <typename T>
814 struct construct_15 {
815
816 template <
817 typename A
818 , typename B
819 , typename C
820 , typename D
821 , typename E
822 , typename F
823 , typename G
824 , typename H
825 , typename I
826 , typename J
827 , typename K
828 , typename L
829 , typename M
830 , typename N
831 , typename O
832 >
833 struct result { typedef T type; };
834
835 template <
836 typename A, typename B, typename C, typename D, typename E,
837 typename F, typename G, typename H, typename I, typename J,
838 typename K, typename L, typename M, typename N, typename O
839 >
840 T operator()(
841 A const& a, B const& b, C const& c, D const& d, E const& e,
842 F const& f, G const& g, H const& h, I const& i, J const& j,
843 K const& k, L const& l, M const& m, N const& n, O const& o) const
844 {
845 T t(a, b, c, d, f, e, g, h, i, j, k, l, m, n, o);
846 return t;
847 }
848 };
849 #endif
850
851
852 #if defined(__BORLANDC__) || (defined(__MWERKS__) && (__MWERKS__ <= 0x3002))
853
854 ///////////////////////////////////////////////////////////////////////////////
855 //
856 // The following specializations are needed because Borland and CodeWarrior
857 // does not accept default template arguments in nested template classes in
858 // classes (i.e construct_l::result)
859 //
860 ///////////////////////////////////////////////////////////////////////////////
861 template <typename T, typename TupleT>
862 struct composite0_result<construct_l_0<T>, TupleT> {
863
864 typedef T type;
865 };
866
867 //////////////////////////////////
868 template <typename T, typename TupleT,
869 typename A>
870 struct composite1_result<construct_l<T>, TupleT, A> {
871
872 typedef T type;
873 };
874
875 //////////////////////////////////
876 template <typename T, typename TupleT,
877 typename A, typename B>
878 struct composite2_result<construct_l<T>, TupleT, A, B> {
879
880 typedef T type;
881 };
882
883 //////////////////////////////////
884 template <typename T, typename TupleT,
885 typename A, typename B, typename C>
886 struct composite3_result<construct_l<T>, TupleT, A, B, C> {
887
888 typedef T type;
889 };
890
891 #if PHOENIX_LIMIT > 3
892 //////////////////////////////////
893 template <typename T, typename TupleT,
894 typename A, typename B, typename C, typename D>
895 struct composite4_result<construct_l<T>, TupleT,
896 A, B, C, D> {
897
898 typedef T type;
899 };
900
901 //////////////////////////////////
902 template <typename T, typename TupleT,
903 typename A, typename B, typename C, typename D, typename E>
904 struct composite5_result<construct_l<T>, TupleT,
905 A, B, C, D, E> {
906
907 typedef T type;
908 };
909
910 //////////////////////////////////
911 template <typename T, typename TupleT,
912 typename A, typename B, typename C, typename D, typename E,
913 typename F>
914 struct composite6_result<construct_l<T>, TupleT,
915 A, B, C, D, E, F> {
916
917 typedef T type;
918 };
919
920 #if PHOENIX_LIMIT > 6
921 //////////////////////////////////
922 template <typename T, typename TupleT,
923 typename A, typename B, typename C, typename D, typename E,
924 typename F, typename G>
925 struct composite7_result<construct_l<T>, TupleT,
926 A, B, C, D, E, F, G> {
927
928 typedef T type;
929 };
930
931 //////////////////////////////////
932 template <typename T, typename TupleT,
933 typename A, typename B, typename C, typename D, typename E,
934 typename F, typename G, typename H>
935 struct composite8_result<construct_l<T>, TupleT,
936 A, B, C, D, E, F, G, H> {
937
938 typedef T type;
939 };
940
941 //////////////////////////////////
942 template <typename T, typename TupleT,
943 typename A, typename B, typename C, typename D, typename E,
944 typename F, typename G, typename H, typename I>
945 struct composite9_result<construct_l<T>, TupleT,
946 A, B, C, D, E, F, G, H, I> {
947
948 typedef T type;
949 };
950
951 #if PHOENIX_LIMIT > 9
952 //////////////////////////////////
953 template <typename T, typename TupleT,
954 typename A, typename B, typename C, typename D, typename E,
955 typename F, typename G, typename H, typename I, typename J>
956 struct composite10_result<construct_l<T>, TupleT,
957 A, B, C, D, E, F, G, H, I, J> {
958
959 typedef T type;
960 };
961
962 //////////////////////////////////
963 template <typename T, typename TupleT,
964 typename A, typename B, typename C, typename D, typename E,
965 typename F, typename G, typename H, typename I, typename J,
966 typename K>
967 struct composite11_result<construct_l<T>, TupleT,
968 A, B, C, D, E, F, G, H, I, J, K> {
969
970 typedef T type;
971 };
972
973 //////////////////////////////////
974 template <typename T, typename TupleT,
975 typename A, typename B, typename C, typename D, typename E,
976 typename F, typename G, typename H, typename I, typename J,
977 typename K, typename L>
978 struct composite12_result<construct_l<T>, TupleT,
979 A, B, C, D, E, F, G, H, I, J, K, L> {
980
981 typedef T type;
982 };
983
984 #if PHOENIX_LIMIT > 12
985 //////////////////////////////////
986 template <typename T, typename TupleT,
987 typename A, typename B, typename C, typename D, typename E,
988 typename F, typename G, typename H, typename I, typename J,
989 typename K, typename L, typename M>
990 struct composite13_result<construct_l<T>, TupleT,
991 A, B, C, D, E, F, G, H, I, J, K, L, M> {
992
993 typedef T type;
994 };
995
996 //////////////////////////////////
997 template <typename T, typename TupleT,
998 typename A, typename B, typename C, typename D, typename E,
999 typename F, typename G, typename H, typename I, typename J,
1000 typename K, typename L, typename M, typename N>
1001 struct composite14_result<construct_l<T>, TupleT,
1002 A, B, C, D, E, F, G, H, I, J, K, L, M, N> {
1003
1004 typedef T type;
1005 };
1006
1007 //////////////////////////////////
1008 template <typename T, typename TupleT,
1009 typename A, typename B, typename C, typename D, typename E,
1010 typename F, typename G, typename H, typename I, typename J,
1011 typename K, typename L, typename M, typename N, typename O>
1012 struct composite15_result<construct_l<T>, TupleT,
1013 A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> {
1014
1015 typedef T type;
1016 };
1017
1018 #endif
1019 #endif
1020 #endif
1021 #endif
1022 #endif
1023
1024 //////////////////////////////////
1025 template <typename T>
1026 inline typename impl::make_composite<construct_l_0<T> >::type
1027 construct_()
1028 {
1029 typedef impl::make_composite<construct_l_0<T> > make_composite_t;
1030 typedef typename make_composite_t::type type_t;
1031 typedef typename make_composite_t::composite_type composite_type_t;
1032
1033 return type_t(composite_type_t(construct_l_0<T>()));
1034 }
1035
1036 //////////////////////////////////
1037 template <typename T, typename A>
1038 inline typename impl::make_composite<construct_1<T>, A>::type
1039 construct_(A const& a)
1040 {
1041 typedef impl::make_composite<construct_1<T>, A> make_composite_t;
1042 typedef typename make_composite_t::type type_t;
1043 typedef typename make_composite_t::composite_type composite_type_t;
1044
1045 return type_t(composite_type_t(construct_1<T>(),
1046 as_actor<A>::convert(a)
1047 ));
1048 }
1049
1050 //////////////////////////////////
1051 template <typename T, typename A, typename B>
1052 inline typename impl::make_composite<construct_2<T>, A, B>::type
1053 construct_(A const& a, B const& b)
1054 {
1055 typedef impl::make_composite<construct_2<T>, A, B> make_composite_t;
1056 typedef typename make_composite_t::type type_t;
1057 typedef typename make_composite_t::composite_type composite_type_t;
1058
1059 return type_t(composite_type_t(construct_2<T>(),
1060 as_actor<A>::convert(a),
1061 as_actor<B>::convert(b)
1062 ));
1063 }
1064
1065 //////////////////////////////////
1066 template <typename T, typename A, typename B, typename C>
1067 inline typename impl::make_composite<construct_3<T>, A, B, C>::type
1068 construct_(A const& a, B const& b, C const& c)
1069 {
1070 typedef impl::make_composite<construct_3<T>, A, B, C> make_composite_t;
1071 typedef typename make_composite_t::type type_t;
1072 typedef typename make_composite_t::composite_type composite_type_t;
1073
1074 return type_t(composite_type_t(construct_3<T>(),
1075 as_actor<A>::convert(a),
1076 as_actor<B>::convert(b),
1077 as_actor<C>::convert(c)
1078 ));
1079 }
1080
1081 #if PHOENIX_CONSTRUCT_LIMIT > 3
1082 //////////////////////////////////
1083 template <
1084 typename T, typename A, typename B, typename C, typename D
1085 >
1086 inline typename impl::make_composite<construct_4<T>, A, B, C, D>::type
1087 construct_(
1088 A const& a, B const& b, C const& c, D const& d)
1089 {
1090 typedef
1091 impl::make_composite<construct_4<T>, A, B, C, D>
1092 make_composite_t;
1093 typedef typename make_composite_t::type type_t;
1094 typedef typename make_composite_t::composite_type composite_type_t;
1095
1096 return type_t(composite_type_t(construct_4<T>(),
1097 as_actor<A>::convert(a),
1098 as_actor<B>::convert(b),
1099 as_actor<C>::convert(c),
1100 as_actor<D>::convert(d)
1101 ));
1102 }
1103
1104 //////////////////////////////////
1105 template <
1106 typename T, typename A, typename B, typename C, typename D, typename E
1107 >
1108 inline typename impl::make_composite<construct_5<T>, A, B, C, D, E>::type
1109 construct_(
1110 A const& a, B const& b, C const& c, D const& d, E const& e)
1111 {
1112 typedef
1113 impl::make_composite<construct_5<T>, A, B, C, D, E>
1114 make_composite_t;
1115 typedef typename make_composite_t::type type_t;
1116 typedef typename make_composite_t::composite_type composite_type_t;
1117
1118 return type_t(composite_type_t(construct_5<T>(),
1119 as_actor<A>::convert(a),
1120 as_actor<B>::convert(b),
1121 as_actor<C>::convert(c),
1122 as_actor<D>::convert(d),
1123 as_actor<E>::convert(e)
1124 ));
1125 }
1126
1127 //////////////////////////////////
1128 template <
1129 typename T, typename A, typename B, typename C, typename D, typename E,
1130 typename F
1131 >
1132 inline typename impl::make_composite<construct_6<T>, A, B, C, D, E, F>::type
1133 construct_(
1134 A const& a, B const& b, C const& c, D const& d, E const& e,
1135 F const& f)
1136 {
1137 typedef
1138 impl::make_composite<construct_6<T>, A, B, C, D, E, F>
1139 make_composite_t;
1140 typedef typename make_composite_t::type type_t;
1141 typedef typename make_composite_t::composite_type composite_type_t;
1142
1143 return type_t(composite_type_t(construct_6<T>(),
1144 as_actor<A>::convert(a),
1145 as_actor<B>::convert(b),
1146 as_actor<C>::convert(c),
1147 as_actor<D>::convert(d),
1148 as_actor<E>::convert(e),
1149 as_actor<F>::convert(f)
1150 ));
1151 }
1152
1153 #if PHOENIX_CONSTRUCT_LIMIT > 6
1154 //////////////////////////////////
1155 template <
1156 typename T, typename A, typename B, typename C, typename D, typename E,
1157 typename F, typename G
1158 >
1159 inline typename impl::make_composite<construct_7<T>, A, B, C, D, E, F, G>::type
1160 construct_(
1161 A const& a, B const& b, C const& c, D const& d, E const& e,
1162 F const& f, G const& g)
1163 {
1164 typedef
1165 impl::make_composite<construct_7<T>, A, B, C, D, E, F, G>
1166 make_composite_t;
1167 typedef typename make_composite_t::type type_t;
1168 typedef typename make_composite_t::composite_type composite_type_t;
1169
1170 return type_t(composite_type_t(construct_7<T>(),
1171 as_actor<A>::convert(a),
1172 as_actor<B>::convert(b),
1173 as_actor<C>::convert(c),
1174 as_actor<D>::convert(d),
1175 as_actor<E>::convert(e),
1176 as_actor<F>::convert(f),
1177 as_actor<G>::convert(g)
1178 ));
1179 }
1180
1181 //////////////////////////////////
1182 template <
1183 typename T, typename A, typename B, typename C, typename D, typename E,
1184 typename F, typename G, typename H
1185 >
1186 inline typename impl::make_composite<construct_8<T>, A, B, C, D, E, F, G, H>::type
1187 construct_(
1188 A const& a, B const& b, C const& c, D const& d, E const& e,
1189 F const& f, G const& g, H const& h)
1190 {
1191 typedef
1192 impl::make_composite<construct_8<T>, A, B, C, D, E, F, G, H>
1193 make_composite_t;
1194 typedef typename make_composite_t::type type_t;
1195 typedef typename make_composite_t::composite_type composite_type_t;
1196
1197 return type_t(composite_type_t(construct_8<T>(),
1198 as_actor<A>::convert(a),
1199 as_actor<B>::convert(b),
1200 as_actor<C>::convert(c),
1201 as_actor<D>::convert(d),
1202 as_actor<E>::convert(e),
1203 as_actor<F>::convert(f),
1204 as_actor<G>::convert(g),
1205 as_actor<H>::convert(h)
1206 ));
1207 }
1208
1209 //////////////////////////////////
1210 template <
1211 typename T, typename A, typename B, typename C, typename D, typename E,
1212 typename F, typename G, typename H, typename I
1213 >
1214 inline typename impl::make_composite<construct_9<T>, A, B, C, D, E, F, G, H, I>::type
1215 construct_(
1216 A const& a, B const& b, C const& c, D const& d, E const& e,
1217 F const& f, G const& g, H const& h, I const& i)
1218 {
1219 typedef
1220 impl::make_composite<construct_9<T>, A, B, C, D, E, F, G, H, I>
1221 make_composite_t;
1222 typedef typename make_composite_t::type type_t;
1223 typedef typename make_composite_t::composite_type composite_type_t;
1224
1225 return type_t(composite_type_t(construct_9<T>(),
1226 as_actor<A>::convert(a),
1227 as_actor<B>::convert(b),
1228 as_actor<C>::convert(c),
1229 as_actor<D>::convert(d),
1230 as_actor<E>::convert(e),
1231 as_actor<F>::convert(f),
1232 as_actor<G>::convert(g),
1233 as_actor<H>::convert(h),
1234 as_actor<I>::convert(i)
1235 ));
1236 }
1237
1238 #if PHOENIX_CONSTRUCT_LIMIT > 9
1239 //////////////////////////////////
1240 template <
1241 typename T, typename A, typename B, typename C, typename D, typename E,
1242 typename F, typename G, typename H, typename I, typename J
1243 >
1244 inline typename impl::make_composite<
1245 construct_10<T>, A, B, C, D, E, F, G, H, I, J>::type
1246 construct_(
1247 A const& a, B const& b, C const& c, D const& d, E const& e,
1248 F const& f, G const& g, H const& h, I const& i, J const& j)
1249 {
1250 typedef
1251 impl::make_composite<
1252 construct_10<T>, A, B, C, D, E, F, G, H, I, J
1253 >
1254 make_composite_t;
1255 typedef typename make_composite_t::type type_t;
1256 typedef typename make_composite_t::composite_type composite_type_t;
1257
1258 return type_t(composite_type_t(construct_10<T>(),
1259 as_actor<A>::convert(a),
1260 as_actor<B>::convert(b),
1261 as_actor<C>::convert(c),
1262 as_actor<D>::convert(d),
1263 as_actor<E>::convert(e),
1264 as_actor<F>::convert(f),
1265 as_actor<G>::convert(g),
1266 as_actor<H>::convert(h),
1267 as_actor<I>::convert(i),
1268 as_actor<J>::convert(j)
1269 ));
1270 }
1271
1272 //////////////////////////////////
1273 template <
1274 typename T, typename A, typename B, typename C, typename D, typename E,
1275 typename F, typename G, typename H, typename I, typename J, typename K
1276 >
1277 inline typename impl::make_composite<
1278 construct_11<T>, A, B, C, D, E, F, G, H, I, J, K>::type
1279 construct_(
1280 A const& a, B const& b, C const& c, D const& d, E const& e,
1281 F const& f, G const& g, H const& h, I const& i, J const& j,
1282 K const& k)
1283 {
1284 typedef
1285 impl::make_composite<
1286 construct_11<T>, A, B, C, D, E, F, G, H, I, J, K
1287 >
1288 make_composite_t;
1289 typedef typename make_composite_t::type type_t;
1290 typedef typename make_composite_t::composite_type composite_type_t;
1291
1292 return type_t(composite_type_t(construct_11<T>(),
1293 as_actor<A>::convert(a),
1294 as_actor<B>::convert(b),
1295 as_actor<C>::convert(c),
1296 as_actor<D>::convert(d),
1297 as_actor<E>::convert(e),
1298 as_actor<F>::convert(f),
1299 as_actor<G>::convert(g),
1300 as_actor<H>::convert(h),
1301 as_actor<I>::convert(i),
1302 as_actor<J>::convert(j),
1303 as_actor<K>::convert(k)
1304 ));
1305 }
1306
1307 //////////////////////////////////
1308 template <
1309 typename T, typename A, typename B, typename C, typename D, typename E,
1310 typename F, typename G, typename H, typename I, typename J, typename K,
1311 typename L
1312 >
1313 inline typename impl::make_composite<
1314 construct_12<T>, A, B, C, D, E, F, G, H, I, J, K, L>::type
1315 construct_(
1316 A const& a, B const& b, C const& c, D const& d, E const& e,
1317 F const& f, G const& g, H const& h, I const& i, J const& j,
1318 K const& k, L const& l)
1319 {
1320 typedef
1321 impl::make_composite<
1322 construct_12<T>, A, B, C, D, E, F, G, H, I, J, K, L
1323 >
1324 make_composite_t;
1325 typedef typename make_composite_t::type type_t;
1326 typedef typename make_composite_t::composite_type composite_type_t;
1327
1328 return type_t(composite_type_t(construct_12<T>(),
1329 as_actor<A>::convert(a),
1330 as_actor<B>::convert(b),
1331 as_actor<C>::convert(c),
1332 as_actor<D>::convert(d),
1333 as_actor<E>::convert(e),
1334 as_actor<F>::convert(f),
1335 as_actor<G>::convert(g),
1336 as_actor<H>::convert(h),
1337 as_actor<I>::convert(i),
1338 as_actor<J>::convert(j),
1339 as_actor<K>::convert(k),
1340 as_actor<L>::convert(l)
1341 ));
1342 }
1343
1344 #if PHOENIX_CONSTRUCT_LIMIT > 12
1345 //////////////////////////////////
1346 template <
1347 typename T, typename A, typename B, typename C, typename D, typename E,
1348 typename F, typename G, typename H, typename I, typename J, typename K,
1349 typename L, typename M
1350 >
1351 inline typename impl::make_composite<
1352 construct_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
1353 construct_(
1354 A const& a, B const& b, C const& c, D const& d, E const& e,
1355 F const& f, G const& g, H const& h, I const& i, J const& j,
1356 K const& k, L const& l, M const& m)
1357 {
1358 typedef
1359 impl::make_composite<
1360 construct_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M
1361 >
1362 make_composite_t;
1363 typedef typename make_composite_t::type type_t;
1364 typedef typename make_composite_t::composite_type composite_type_t;
1365
1366 return type_t(composite_type_t(construct_13<T>(),
1367 as_actor<A>::convert(a),
1368 as_actor<B>::convert(b),
1369 as_actor<C>::convert(c),
1370 as_actor<D>::convert(d),
1371 as_actor<E>::convert(e),
1372 as_actor<F>::convert(f),
1373 as_actor<G>::convert(g),
1374 as_actor<H>::convert(h),
1375 as_actor<I>::convert(i),
1376 as_actor<J>::convert(j),
1377 as_actor<K>::convert(k),
1378 as_actor<L>::convert(l),
1379 as_actor<M>::convert(m)
1380 ));
1381 }
1382
1383 //////////////////////////////////
1384 template <
1385 typename T, typename A, typename B, typename C, typename D, typename E,
1386 typename F, typename G, typename H, typename I, typename J, typename K,
1387 typename L, typename M, typename N
1388 >
1389 inline typename impl::make_composite<
1390 construct_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
1391 construct_(
1392 A const& a, B const& b, C const& c, D const& d, E const& e,
1393 F const& f, G const& g, H const& h, I const& i, J const& j,
1394 K const& k, L const& l, M const& m, N const& n)
1395 {
1396 typedef
1397 impl::make_composite<
1398 construct_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N
1399 >
1400 make_composite_t;
1401 typedef typename make_composite_t::type type_t;
1402 typedef typename make_composite_t::composite_type composite_type_t;
1403
1404 return type_t(composite_type_t(construct_14<T>(),
1405 as_actor<A>::convert(a),
1406 as_actor<B>::convert(b),
1407 as_actor<C>::convert(c),
1408 as_actor<D>::convert(d),
1409 as_actor<E>::convert(e),
1410 as_actor<F>::convert(f),
1411 as_actor<G>::convert(g),
1412 as_actor<H>::convert(h),
1413 as_actor<I>::convert(i),
1414 as_actor<J>::convert(j),
1415 as_actor<K>::convert(k),
1416 as_actor<L>::convert(l),
1417 as_actor<M>::convert(m),
1418 as_actor<N>::convert(n)
1419 ));
1420 }
1421
1422 //////////////////////////////////
1423 template <
1424 typename T, typename A, typename B, typename C, typename D, typename E,
1425 typename F, typename G, typename H, typename I, typename J, typename K,
1426 typename L, typename M, typename N, typename O
1427 >
1428 inline typename impl::make_composite<
1429 construct_15<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, O>::type
1430 construct_(
1431 A const& a, B const& b, C const& c, D const& d, E const& e,
1432 F const& f, G const& g, H const& h, I const& i, J const& j,
1433 K const& k, L const& l, M const& m, N const& n, O const& o)
1434 {
1435 typedef
1436 impl::make_composite<
1437 construct_15<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
1438 >
1439 make_composite_t;
1440 typedef typename make_composite_t::type type_t;
1441 typedef typename make_composite_t::composite_type composite_type_t;
1442
1443 return type_t(composite_type_t(construct_15<T>(),
1444 as_actor<A>::convert(a),
1445 as_actor<B>::convert(b),
1446 as_actor<C>::convert(c),
1447 as_actor<D>::convert(d),
1448 as_actor<E>::convert(e),
1449 as_actor<F>::convert(f),
1450 as_actor<G>::convert(g),
1451 as_actor<H>::convert(h),
1452 as_actor<I>::convert(i),
1453 as_actor<J>::convert(j),
1454 as_actor<K>::convert(k),
1455 as_actor<L>::convert(l),
1456 as_actor<M>::convert(m),
1457 as_actor<N>::convert(n),
1458 as_actor<O>::convert(o)
1459 ));
1460 }
1461
1462 #endif
1463 #endif
1464 #endif
1465 #endif
1466
1467 ///////////////////////////////////////////////////////////////////////////////
1468 } // namespace phoenix
1469
1470 #endif // PHOENIX_CASTS_HPP