Update contrib.
1 /*=============================================================================
3 Copyright (c) 2001-2003 Joel de Guzman
4 Copyright (c) 2001-2003 Hartmut Kaiser
6 Use, modification and distribution is subject to the Boost Software
7 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8 http://www.boost.org/LICENSE_1_0.txt)
9 ==============================================================================*/
11 #ifndef PHOENIX_CASTS_HPP
12 #define PHOENIX_CASTS_HPP
14 ///////////////////////////////////////////////////////////////////////////////
15 #include <boost/spirit/phoenix/actor.hpp>
16 #include <boost/spirit/phoenix/composite.hpp>
17 #include <boost/static_assert.hpp>
19 ///////////////////////////////////////////////////////////////////////////////
22 ///////////////////////////////////////////////////////////////////////////////
24 // Phoenix predefined maximum construct_ limit. This limit defines the maximum
25 // number of parameters supported for calles to the set of construct_ template
26 // functions (lazy object construction, see below). This number defaults to 3.
27 // The actual maximum is rounded up in multiples of 3. Thus, if this value
28 // is 4, the actual limit is 6. The ultimate maximum limit in this
29 // implementation is 15.
30 // PHOENIX_CONSTRUCT_LIMIT should NOT be greater than PHOENIX_LIMIT!
32 #if !defined(PHOENIX_CONSTRUCT_LIMIT)
33 #define PHOENIX_CONSTRUCT_LIMIT PHOENIX_LIMIT
36 // ensure PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT
37 BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT);
39 // ensure PHOENIX_CONSTRUCT_LIMIT <= 15
40 BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= 15);
42 ///////////////////////////////////////////////////////////////////////////////
46 // The set of lazy C++ cast template classes and functions provide a way
47 // of lazily casting certain type to another during parsing.
48 // The lazy C++ templates are (syntactically) used very much like
49 // the well known C++ casts:
51 // A *a = static_cast_<A *>(...actor returning a convertible type...);
53 // where the given parameter should be an actor, which eval() function
54 // returns a convertible type.
56 ///////////////////////////////////////////////////////////////////////////////
57 template <typename T, typename A>
58 struct static_cast_l {
60 template <typename TupleT>
61 struct result { typedef T type; };
63 static_cast_l(A const& a_)
66 template <typename TupleT>
68 eval(TupleT const& args) const
70 return static_cast<T>(a.eval(args));
76 //////////////////////////////////
77 template <typename T, typename BaseAT>
78 inline actor<static_cast_l<T, BaseAT> >
79 static_cast_(actor<BaseAT> const& a)
81 typedef static_cast_l<T, BaseAT> cast_t;
82 return actor<cast_t>(cast_t(a));
85 //////////////////////////////////
86 template <typename T, typename A>
87 struct dynamic_cast_l {
89 template <typename TupleT>
90 struct result { typedef T type; };
92 dynamic_cast_l(A const& a_)
95 template <typename TupleT>
97 eval(TupleT const& args) const
99 return dynamic_cast<T>(a.eval(args));
105 //////////////////////////////////
106 template <typename T, typename BaseAT>
107 inline actor<dynamic_cast_l<T, BaseAT> >
108 dynamic_cast_(actor<BaseAT> const& a)
110 typedef dynamic_cast_l<T, BaseAT> cast_t;
111 return actor<cast_t>(cast_t(a));
114 //////////////////////////////////
115 template <typename T, typename A>
116 struct reinterpret_cast_l {
118 template <typename TupleT>
119 struct result { typedef T type; };
121 reinterpret_cast_l(A const& a_)
124 template <typename TupleT>
126 eval(TupleT const& args) const
128 return reinterpret_cast<T>(a.eval(args));
134 //////////////////////////////////
135 template <typename T, typename BaseAT>
136 inline actor<reinterpret_cast_l<T, BaseAT> >
137 reinterpret_cast_(actor<BaseAT> const& a)
139 typedef reinterpret_cast_l<T, BaseAT> cast_t;
140 return actor<cast_t>(cast_t(a));
143 //////////////////////////////////
144 template <typename T, typename A>
145 struct const_cast_l {
147 template <typename TupleT>
148 struct result { typedef T type; };
150 const_cast_l(A const& a_)
153 template <typename TupleT>
155 eval(TupleT const& args) const
157 return const_cast<T>(a.eval(args));
163 //////////////////////////////////
164 template <typename T, typename BaseAT>
165 inline actor<const_cast_l<T, BaseAT> >
166 const_cast_(actor<BaseAT> const& a)
168 typedef const_cast_l<T, BaseAT> cast_t;
169 return actor<cast_t>(cast_t(a));
172 ///////////////////////////////////////////////////////////////////////////////
176 // Lazy object construction
178 // The set of construct_<> template classes and functions provide a way
179 // of lazily constructing certain object from a arbitrary set of
180 // actors during parsing.
181 // The construct_ templates are (syntactically) used very much like
182 // the well known C++ casts:
184 // A a = construct_<A>(...arbitrary list of actors...);
186 // where the given parameters are submitted as parameters to the
187 // contructor of the object of type A. (This certainly implies, that
188 // type A has a constructor with a fitting set of parameter types
191 // The maximum number of needed parameters is controlled through the
192 // preprocessor constant PHOENIX_CONSTRUCT_LIMIT. Note though, that this
193 // limit should not be greater than PHOENIX_LIMIT.
195 ///////////////////////////////////////////////////////////////////////////////
196 template <typename T>
197 struct construct_l_0 {
198 typedef T result_type;
200 T operator()() const {
206 template <typename T>
214 #if PHOENIX_CONSTRUCT_LIMIT > 3
219 #if PHOENIX_CONSTRUCT_LIMIT > 6
224 #if PHOENIX_CONSTRUCT_LIMIT > 9
229 #if PHOENIX_CONSTRUCT_LIMIT > 12
238 struct result { typedef T type; };
245 template <typename A>
246 T operator()(A const& a) const
252 template <typename A, typename B>
253 T operator()(A const& a, B const& b) const
259 template <typename A, typename B, typename C>
260 T operator()(A const& a, B const& b, C const& c) const
266 #if PHOENIX_CONSTRUCT_LIMIT > 3
268 typename A, typename B, typename C, typename D
271 A const& a, B const& b, C const& c, D const& d) const
278 typename A, typename B, typename C, typename D, typename E
281 A const& a, B const& b, C const& c, D const& d, E const& e) const
288 typename A, typename B, typename C, typename D, typename E,
292 A const& a, B const& b, C const& c, D const& d, E const& e,
295 T t(a, b, c, d, e, f);
299 #if PHOENIX_CONSTRUCT_LIMIT > 6
301 typename A, typename B, typename C, typename D, typename E,
302 typename F, typename G
305 A const& a, B const& b, C const& c, D const& d, E const& e,
306 F const& f, G const& g) const
308 T t(a, b, c, d, e, f, g);
313 typename A, typename B, typename C, typename D, typename E,
314 typename F, typename G, typename H
317 A const& a, B const& b, C const& c, D const& d, E const& e,
318 F const& f, G const& g, H const& h) const
320 T t(a, b, c, d, e, f, g, h);
325 typename A, typename B, typename C, typename D, typename E,
326 typename F, typename G, typename H, typename I
329 A const& a, B const& b, C const& c, D const& d, E const& e,
330 F const& f, G const& g, H const& h, I const& i) const
332 T t(a, b, c, d, e, f, g, h, i);
336 #if PHOENIX_CONSTRUCT_LIMIT > 9
338 typename A, typename B, typename C, typename D, typename E,
339 typename F, typename G, typename H, typename I, typename J
342 A const& a, B const& b, C const& c, D const& d, E const& e,
343 F const& f, G const& g, H const& h, I const& i, J const& j) const
345 T t(a, b, c, d, e, f, g, h, i, j);
350 typename A, typename B, typename C, typename D, typename E,
351 typename F, typename G, typename H, typename I, typename J,
355 A const& a, B const& b, C const& c, D const& d, E const& e,
356 F const& f, G const& g, H const& h, I const& i, J const& j,
359 T t(a, b, c, d, e, f, g, h, i, j, k);
364 typename A, typename B, typename C, typename D, typename E,
365 typename F, typename G, typename H, typename I, typename J,
366 typename K, typename L
369 A const& a, B const& b, C const& c, D const& d, E const& e,
370 F const& f, G const& g, H const& h, I const& i, J const& j,
371 K const& k, L const& l) const
373 T t(a, b, c, d, e, f, g, h, i, j, k, l);
377 #if PHOENIX_CONSTRUCT_LIMIT > 12
379 typename A, typename B, typename C, typename D, typename E,
380 typename F, typename G, typename H, typename I, typename J,
381 typename K, typename L, typename M
384 A const& a, B const& b, C const& c, D const& d, E const& e,
385 F const& f, G const& g, H const& h, I const& i, J const& j,
386 K const& k, L const& l, M const& m) const
388 T t(a, b, c, d, e, f, g, h, i, j, k, l, m);
393 typename A, typename B, typename C, typename D, typename E,
394 typename F, typename G, typename H, typename I, typename J,
395 typename K, typename L, typename M, typename N
398 A const& a, B const& b, C const& c, D const& d, E const& e,
399 F const& f, G const& g, H const& h, I const& i, J const& j,
400 K const& k, L const& l, M const& m, N const& n) const
402 T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
407 typename A, typename B, typename C, typename D, typename E,
408 typename F, typename G, typename H, typename I, typename J,
409 typename K, typename L, typename M, typename N, typename O
412 A const& a, B const& b, C const& c, D const& d, E const& e,
413 F const& f, G const& g, H const& h, I const& i, J const& j,
414 K const& k, L const& l, M const& m, N const& n, O const& o) const
416 T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
427 template <typename T>
433 struct result { typedef T type; };
435 template <typename A>
436 T operator()(A const& a) const
444 template <typename T>
451 struct result { typedef T type; };
453 template <typename A, typename B>
454 T operator()(A const& a, B const& b) const
462 template <typename T>
470 struct result { typedef T type; };
472 template <typename A, typename B, typename C>
473 T operator()(A const& a, B const& b, C const& c) const
480 #if PHOENIX_CONSTRUCT_LIMIT > 3
481 template <typename T>
490 struct result { typedef T type; };
493 typename A, typename B, typename C, typename D
496 A const& a, B const& b, C const& c, D const& d) const
504 template <typename T>
514 struct result { typedef T type; };
517 typename A, typename B, typename C, typename D, typename E
520 A const& a, B const& b, C const& c, D const& d, E const& e) const
528 template <typename T>
539 struct result { typedef T type; };
542 typename A, typename B, typename C, typename D, typename E,
546 A const& a, B const& b, C const& c, D const& d, E const& e,
549 T t(a, b, c, d, e, f);
556 #if PHOENIX_CONSTRUCT_LIMIT > 6
557 template <typename T>
569 struct result { typedef T type; };
572 typename A, typename B, typename C, typename D, typename E,
573 typename F, typename G
576 A const& a, B const& b, C const& c, D const& d, E const& e,
577 F const& f, G const& g) const
579 T t(a, b, c, d, e, f, g);
584 template <typename T>
597 struct result { typedef T type; };
600 typename A, typename B, typename C, typename D, typename E,
601 typename F, typename G, typename H
604 A const& a, B const& b, C const& c, D const& d, E const& e,
605 F const& f, G const& g, H const& h) const
607 T t(a, b, c, d, e, f, g, h);
612 template <typename T>
626 struct result { typedef T type; };
629 typename A, typename B, typename C, typename D, typename E,
630 typename F, typename G, typename H, typename I
633 A const& a, B const& b, C const& c, D const& d, E const& e,
634 F const& f, G const& g, H const& h, I const& i) const
636 T t(a, b, c, d, e, f, g, h, i);
643 #if PHOENIX_CONSTRUCT_LIMIT > 9
644 template <typename T>
645 struct construct_10 {
659 struct result { typedef T type; };
662 typename A, typename B, typename C, typename D, typename E,
663 typename F, typename G, typename H, typename I, typename J
666 A const& a, B const& b, C const& c, D const& d, E const& e,
667 F const& f, G const& g, H const& h, I const& i, J const& j) const
669 T t(a, b, c, d, e, f, g, h, i, j);
674 template <typename T>
675 struct construct_11 {
690 struct result { typedef T type; };
693 typename A, typename B, typename C, typename D, typename E,
694 typename F, typename G, typename H, typename I, typename J,
698 A const& a, B const& b, C const& c, D const& d, E const& e,
699 F const& f, G const& g, H const& h, I const& i, J const& j,
702 T t(a, b, c, d, e, f, g, h, i, j, k);
707 template <typename T>
708 struct construct_12 {
724 struct result { typedef T type; };
727 typename A, typename B, typename C, typename D, typename E,
728 typename F, typename G, typename H, typename I, typename J,
729 typename K, typename L
732 A const& a, B const& b, C const& c, D const& d, E const& e,
733 F const& f, G const& g, H const& h, I const& i, J const& j,
734 K const& k, L const& l) const
736 T t(a, b, c, d, f, e, g, h, i, j, k, l);
742 #if PHOENIX_CONSTRUCT_LIMIT > 12
743 template <typename T>
744 struct construct_13 {
761 struct result { typedef T type; };
764 typename A, typename B, typename C, typename D, typename E,
765 typename F, typename G, typename H, typename I, typename J,
766 typename K, typename L, typename M
769 A const& a, B const& b, C const& c, D const& d, E const& e,
770 F const& f, G const& g, H const& h, I const& i, J const& j,
771 K const& k, L const& l, M const& m) const
773 T t(a, b, c, d, e, f, g, h, i, j, k, l, m);
778 template <typename T>
779 struct construct_14 {
797 struct result { typedef T type; };
800 typename A, typename B, typename C, typename D, typename E,
801 typename F, typename G, typename H, typename I, typename J,
802 typename K, typename L, typename M, typename N
805 A const& a, B const& b, C const& c, D const& d, E const& e,
806 F const& f, G const& g, H const& h, I const& i, J const& j,
807 K const& k, L const& l, M const& m, N const& n) const
809 T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
814 template <typename T>
815 struct construct_15 {
834 struct result { typedef T type; };
837 typename A, typename B, typename C, typename D, typename E,
838 typename F, typename G, typename H, typename I, typename J,
839 typename K, typename L, typename M, typename N, typename O
842 A const& a, B const& b, C const& c, D const& d, E const& e,
843 F const& f, G const& g, H const& h, I const& i, J const& j,
844 K const& k, L const& l, M const& m, N const& n, O const& o) const
846 T t(a, b, c, d, f, e, g, h, i, j, k, l, m, n, o);
853 #if defined(__BORLANDC__) || (defined(__MWERKS__) && (__MWERKS__ <= 0x3002))
855 ///////////////////////////////////////////////////////////////////////////////
857 // The following specializations are needed because Borland and CodeWarrior
858 // does not accept default template arguments in nested template classes in
859 // classes (i.e construct_l::result)
861 ///////////////////////////////////////////////////////////////////////////////
862 template <typename T, typename TupleT>
863 struct composite0_result<construct_l_0<T>, TupleT> {
868 //////////////////////////////////
869 template <typename T, typename TupleT,
871 struct composite1_result<construct_l<T>, TupleT, A> {
876 //////////////////////////////////
877 template <typename T, typename TupleT,
878 typename A, typename B>
879 struct composite2_result<construct_l<T>, TupleT, A, B> {
884 //////////////////////////////////
885 template <typename T, typename TupleT,
886 typename A, typename B, typename C>
887 struct composite3_result<construct_l<T>, TupleT, A, B, C> {
892 #if PHOENIX_LIMIT > 3
893 //////////////////////////////////
894 template <typename T, typename TupleT,
895 typename A, typename B, typename C, typename D>
896 struct composite4_result<construct_l<T>, TupleT,
902 //////////////////////////////////
903 template <typename T, typename TupleT,
904 typename A, typename B, typename C, typename D, typename E>
905 struct composite5_result<construct_l<T>, TupleT,
911 //////////////////////////////////
912 template <typename T, typename TupleT,
913 typename A, typename B, typename C, typename D, typename E,
915 struct composite6_result<construct_l<T>, TupleT,
921 #if PHOENIX_LIMIT > 6
922 //////////////////////////////////
923 template <typename T, typename TupleT,
924 typename A, typename B, typename C, typename D, typename E,
925 typename F, typename G>
926 struct composite7_result<construct_l<T>, TupleT,
927 A, B, C, D, E, F, G> {
932 //////////////////////////////////
933 template <typename T, typename TupleT,
934 typename A, typename B, typename C, typename D, typename E,
935 typename F, typename G, typename H>
936 struct composite8_result<construct_l<T>, TupleT,
937 A, B, C, D, E, F, G, H> {
942 //////////////////////////////////
943 template <typename T, typename TupleT,
944 typename A, typename B, typename C, typename D, typename E,
945 typename F, typename G, typename H, typename I>
946 struct composite9_result<construct_l<T>, TupleT,
947 A, B, C, D, E, F, G, H, I> {
952 #if PHOENIX_LIMIT > 9
953 //////////////////////////////////
954 template <typename T, typename TupleT,
955 typename A, typename B, typename C, typename D, typename E,
956 typename F, typename G, typename H, typename I, typename J>
957 struct composite10_result<construct_l<T>, TupleT,
958 A, B, C, D, E, F, G, H, I, J> {
963 //////////////////////////////////
964 template <typename T, typename TupleT,
965 typename A, typename B, typename C, typename D, typename E,
966 typename F, typename G, typename H, typename I, typename J,
968 struct composite11_result<construct_l<T>, TupleT,
969 A, B, C, D, E, F, G, H, I, J, K> {
974 //////////////////////////////////
975 template <typename T, typename TupleT,
976 typename A, typename B, typename C, typename D, typename E,
977 typename F, typename G, typename H, typename I, typename J,
978 typename K, typename L>
979 struct composite12_result<construct_l<T>, TupleT,
980 A, B, C, D, E, F, G, H, I, J, K, L> {
985 #if PHOENIX_LIMIT > 12
986 //////////////////////////////////
987 template <typename T, typename TupleT,
988 typename A, typename B, typename C, typename D, typename E,
989 typename F, typename G, typename H, typename I, typename J,
990 typename K, typename L, typename M>
991 struct composite13_result<construct_l<T>, TupleT,
992 A, B, C, D, E, F, G, H, I, J, K, L, M> {
997 //////////////////////////////////
998 template <typename T, typename TupleT,
999 typename A, typename B, typename C, typename D, typename E,
1000 typename F, typename G, typename H, typename I, typename J,
1001 typename K, typename L, typename M, typename N>
1002 struct composite14_result<construct_l<T>, TupleT,
1003 A, B, C, D, E, F, G, H, I, J, K, L, M, N> {
1008 //////////////////////////////////
1009 template <typename T, typename TupleT,
1010 typename A, typename B, typename C, typename D, typename E,
1011 typename F, typename G, typename H, typename I, typename J,
1012 typename K, typename L, typename M, typename N, typename O>
1013 struct composite15_result<construct_l<T>, TupleT,
1014 A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> {
1025 //////////////////////////////////
1026 template <typename T>
1027 inline typename impl::make_composite<construct_l_0<T> >::type
1030 typedef impl::make_composite<construct_l_0<T> > make_composite_t;
1031 typedef typename make_composite_t::type type_t;
1032 typedef typename make_composite_t::composite_type composite_type_t;
1034 return type_t(composite_type_t(construct_l_0<T>()));
1037 //////////////////////////////////
1038 template <typename T, typename A>
1039 inline typename impl::make_composite<construct_1<T>, A>::type
1040 construct_(A const& a)
1042 typedef impl::make_composite<construct_1<T>, A> make_composite_t;
1043 typedef typename make_composite_t::type type_t;
1044 typedef typename make_composite_t::composite_type composite_type_t;
1046 return type_t(composite_type_t(construct_1<T>(),
1047 as_actor<A>::convert(a)
1051 //////////////////////////////////
1052 template <typename T, typename A, typename B>
1053 inline typename impl::make_composite<construct_2<T>, A, B>::type
1054 construct_(A const& a, B const& b)
1056 typedef impl::make_composite<construct_2<T>, A, B> make_composite_t;
1057 typedef typename make_composite_t::type type_t;
1058 typedef typename make_composite_t::composite_type composite_type_t;
1060 return type_t(composite_type_t(construct_2<T>(),
1061 as_actor<A>::convert(a),
1062 as_actor<B>::convert(b)
1066 //////////////////////////////////
1067 template <typename T, typename A, typename B, typename C>
1068 inline typename impl::make_composite<construct_3<T>, A, B, C>::type
1069 construct_(A const& a, B const& b, C const& c)
1071 typedef impl::make_composite<construct_3<T>, A, B, C> make_composite_t;
1072 typedef typename make_composite_t::type type_t;
1073 typedef typename make_composite_t::composite_type composite_type_t;
1075 return type_t(composite_type_t(construct_3<T>(),
1076 as_actor<A>::convert(a),
1077 as_actor<B>::convert(b),
1078 as_actor<C>::convert(c)
1082 #if PHOENIX_CONSTRUCT_LIMIT > 3
1083 //////////////////////////////////
1085 typename T, typename A, typename B, typename C, typename D
1087 inline typename impl::make_composite<construct_4<T>, A, B, C, D>::type
1089 A const& a, B const& b, C const& c, D const& d)
1092 impl::make_composite<construct_4<T>, A, B, C, D>
1094 typedef typename make_composite_t::type type_t;
1095 typedef typename make_composite_t::composite_type composite_type_t;
1097 return type_t(composite_type_t(construct_4<T>(),
1098 as_actor<A>::convert(a),
1099 as_actor<B>::convert(b),
1100 as_actor<C>::convert(c),
1101 as_actor<D>::convert(d)
1105 //////////////////////////////////
1107 typename T, typename A, typename B, typename C, typename D, typename E
1109 inline typename impl::make_composite<construct_5<T>, A, B, C, D, E>::type
1111 A const& a, B const& b, C const& c, D const& d, E const& e)
1114 impl::make_composite<construct_5<T>, A, B, C, D, E>
1116 typedef typename make_composite_t::type type_t;
1117 typedef typename make_composite_t::composite_type composite_type_t;
1119 return type_t(composite_type_t(construct_5<T>(),
1120 as_actor<A>::convert(a),
1121 as_actor<B>::convert(b),
1122 as_actor<C>::convert(c),
1123 as_actor<D>::convert(d),
1124 as_actor<E>::convert(e)
1128 //////////////////////////////////
1130 typename T, typename A, typename B, typename C, typename D, typename E,
1133 inline typename impl::make_composite<construct_6<T>, A, B, C, D, E, F>::type
1135 A const& a, B const& b, C const& c, D const& d, E const& e,
1139 impl::make_composite<construct_6<T>, A, B, C, D, E, F>
1141 typedef typename make_composite_t::type type_t;
1142 typedef typename make_composite_t::composite_type composite_type_t;
1144 return type_t(composite_type_t(construct_6<T>(),
1145 as_actor<A>::convert(a),
1146 as_actor<B>::convert(b),
1147 as_actor<C>::convert(c),
1148 as_actor<D>::convert(d),
1149 as_actor<E>::convert(e),
1150 as_actor<F>::convert(f)
1154 #if PHOENIX_CONSTRUCT_LIMIT > 6
1155 //////////////////////////////////
1157 typename T, typename A, typename B, typename C, typename D, typename E,
1158 typename F, typename G
1160 inline typename impl::make_composite<construct_7<T>, A, B, C, D, E, F, G>::type
1162 A const& a, B const& b, C const& c, D const& d, E const& e,
1163 F const& f, G const& g)
1166 impl::make_composite<construct_7<T>, A, B, C, D, E, F, G>
1168 typedef typename make_composite_t::type type_t;
1169 typedef typename make_composite_t::composite_type composite_type_t;
1171 return type_t(composite_type_t(construct_7<T>(),
1172 as_actor<A>::convert(a),
1173 as_actor<B>::convert(b),
1174 as_actor<C>::convert(c),
1175 as_actor<D>::convert(d),
1176 as_actor<E>::convert(e),
1177 as_actor<F>::convert(f),
1178 as_actor<G>::convert(g)
1182 //////////////////////////////////
1184 typename T, typename A, typename B, typename C, typename D, typename E,
1185 typename F, typename G, typename H
1187 inline typename impl::make_composite<construct_8<T>, A, B, C, D, E, F, G, H>::type
1189 A const& a, B const& b, C const& c, D const& d, E const& e,
1190 F const& f, G const& g, H const& h)
1193 impl::make_composite<construct_8<T>, A, B, C, D, E, F, G, H>
1195 typedef typename make_composite_t::type type_t;
1196 typedef typename make_composite_t::composite_type composite_type_t;
1198 return type_t(composite_type_t(construct_8<T>(),
1199 as_actor<A>::convert(a),
1200 as_actor<B>::convert(b),
1201 as_actor<C>::convert(c),
1202 as_actor<D>::convert(d),
1203 as_actor<E>::convert(e),
1204 as_actor<F>::convert(f),
1205 as_actor<G>::convert(g),
1206 as_actor<H>::convert(h)
1210 //////////////////////////////////
1212 typename T, typename A, typename B, typename C, typename D, typename E,
1213 typename F, typename G, typename H, typename I
1215 inline typename impl::make_composite<construct_9<T>, A, B, C, D, E, F, G, H, I>::type
1217 A const& a, B const& b, C const& c, D const& d, E const& e,
1218 F const& f, G const& g, H const& h, I const& i)
1221 impl::make_composite<construct_9<T>, A, B, C, D, E, F, G, H, I>
1223 typedef typename make_composite_t::type type_t;
1224 typedef typename make_composite_t::composite_type composite_type_t;
1226 return type_t(composite_type_t(construct_9<T>(),
1227 as_actor<A>::convert(a),
1228 as_actor<B>::convert(b),
1229 as_actor<C>::convert(c),
1230 as_actor<D>::convert(d),
1231 as_actor<E>::convert(e),
1232 as_actor<F>::convert(f),
1233 as_actor<G>::convert(g),
1234 as_actor<H>::convert(h),
1235 as_actor<I>::convert(i)
1239 #if PHOENIX_CONSTRUCT_LIMIT > 9
1240 //////////////////////////////////
1242 typename T, typename A, typename B, typename C, typename D, typename E,
1243 typename F, typename G, typename H, typename I, typename J
1245 inline typename impl::make_composite<
1246 construct_10<T>, A, B, C, D, E, F, G, H, I, J>::type
1248 A const& a, B const& b, C const& c, D const& d, E const& e,
1249 F const& f, G const& g, H const& h, I const& i, J const& j)
1252 impl::make_composite<
1253 construct_10<T>, A, B, C, D, E, F, G, H, I, J
1256 typedef typename make_composite_t::type type_t;
1257 typedef typename make_composite_t::composite_type composite_type_t;
1259 return type_t(composite_type_t(construct_10<T>(),
1260 as_actor<A>::convert(a),
1261 as_actor<B>::convert(b),
1262 as_actor<C>::convert(c),
1263 as_actor<D>::convert(d),
1264 as_actor<E>::convert(e),
1265 as_actor<F>::convert(f),
1266 as_actor<G>::convert(g),
1267 as_actor<H>::convert(h),
1268 as_actor<I>::convert(i),
1269 as_actor<J>::convert(j)
1273 //////////////////////////////////
1275 typename T, typename A, typename B, typename C, typename D, typename E,
1276 typename F, typename G, typename H, typename I, typename J, typename K
1278 inline typename impl::make_composite<
1279 construct_11<T>, A, B, C, D, E, F, G, H, I, J, K>::type
1281 A const& a, B const& b, C const& c, D const& d, E const& e,
1282 F const& f, G const& g, H const& h, I const& i, J const& j,
1286 impl::make_composite<
1287 construct_11<T>, A, B, C, D, E, F, G, H, I, J, K
1290 typedef typename make_composite_t::type type_t;
1291 typedef typename make_composite_t::composite_type composite_type_t;
1293 return type_t(composite_type_t(construct_11<T>(),
1294 as_actor<A>::convert(a),
1295 as_actor<B>::convert(b),
1296 as_actor<C>::convert(c),
1297 as_actor<D>::convert(d),
1298 as_actor<E>::convert(e),
1299 as_actor<F>::convert(f),
1300 as_actor<G>::convert(g),
1301 as_actor<H>::convert(h),
1302 as_actor<I>::convert(i),
1303 as_actor<J>::convert(j),
1304 as_actor<K>::convert(k)
1308 //////////////////////////////////
1310 typename T, typename A, typename B, typename C, typename D, typename E,
1311 typename F, typename G, typename H, typename I, typename J, typename K,
1314 inline typename impl::make_composite<
1315 construct_12<T>, A, B, C, D, E, F, G, H, I, J, K, L>::type
1317 A const& a, B const& b, C const& c, D const& d, E const& e,
1318 F const& f, G const& g, H const& h, I const& i, J const& j,
1319 K const& k, L const& l)
1322 impl::make_composite<
1323 construct_12<T>, A, B, C, D, E, F, G, H, I, J, K, L
1326 typedef typename make_composite_t::type type_t;
1327 typedef typename make_composite_t::composite_type composite_type_t;
1329 return type_t(composite_type_t(construct_12<T>(),
1330 as_actor<A>::convert(a),
1331 as_actor<B>::convert(b),
1332 as_actor<C>::convert(c),
1333 as_actor<D>::convert(d),
1334 as_actor<E>::convert(e),
1335 as_actor<F>::convert(f),
1336 as_actor<G>::convert(g),
1337 as_actor<H>::convert(h),
1338 as_actor<I>::convert(i),
1339 as_actor<J>::convert(j),
1340 as_actor<K>::convert(k),
1341 as_actor<L>::convert(l)
1345 #if PHOENIX_CONSTRUCT_LIMIT > 12
1346 //////////////////////////////////
1348 typename T, typename A, typename B, typename C, typename D, typename E,
1349 typename F, typename G, typename H, typename I, typename J, typename K,
1350 typename L, typename M
1352 inline typename impl::make_composite<
1353 construct_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
1355 A const& a, B const& b, C const& c, D const& d, E const& e,
1356 F const& f, G const& g, H const& h, I const& i, J const& j,
1357 K const& k, L const& l, M const& m)
1360 impl::make_composite<
1361 construct_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M
1364 typedef typename make_composite_t::type type_t;
1365 typedef typename make_composite_t::composite_type composite_type_t;
1367 return type_t(composite_type_t(construct_13<T>(),
1368 as_actor<A>::convert(a),
1369 as_actor<B>::convert(b),
1370 as_actor<C>::convert(c),
1371 as_actor<D>::convert(d),
1372 as_actor<E>::convert(e),
1373 as_actor<F>::convert(f),
1374 as_actor<G>::convert(g),
1375 as_actor<H>::convert(h),
1376 as_actor<I>::convert(i),
1377 as_actor<J>::convert(j),
1378 as_actor<K>::convert(k),
1379 as_actor<L>::convert(l),
1380 as_actor<M>::convert(m)
1384 //////////////////////////////////
1386 typename T, typename A, typename B, typename C, typename D, typename E,
1387 typename F, typename G, typename H, typename I, typename J, typename K,
1388 typename L, typename M, typename N
1390 inline typename impl::make_composite<
1391 construct_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
1393 A const& a, B const& b, C const& c, D const& d, E const& e,
1394 F const& f, G const& g, H const& h, I const& i, J const& j,
1395 K const& k, L const& l, M const& m, N const& n)
1398 impl::make_composite<
1399 construct_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N
1402 typedef typename make_composite_t::type type_t;
1403 typedef typename make_composite_t::composite_type composite_type_t;
1405 return type_t(composite_type_t(construct_14<T>(),
1406 as_actor<A>::convert(a),
1407 as_actor<B>::convert(b),
1408 as_actor<C>::convert(c),
1409 as_actor<D>::convert(d),
1410 as_actor<E>::convert(e),
1411 as_actor<F>::convert(f),
1412 as_actor<G>::convert(g),
1413 as_actor<H>::convert(h),
1414 as_actor<I>::convert(i),
1415 as_actor<J>::convert(j),
1416 as_actor<K>::convert(k),
1417 as_actor<L>::convert(l),
1418 as_actor<M>::convert(m),
1419 as_actor<N>::convert(n)
1423 //////////////////////////////////
1425 typename T, typename A, typename B, typename C, typename D, typename E,
1426 typename F, typename G, typename H, typename I, typename J, typename K,
1427 typename L, typename M, typename N, typename O
1429 inline typename impl::make_composite<
1430 construct_15<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, O>::type
1432 A const& a, B const& b, C const& c, D const& d, E const& e,
1433 F const& f, G const& g, H const& h, I const& i, J const& j,
1434 K const& k, L const& l, M const& m, N const& n, O const& o)
1437 impl::make_composite<
1438 construct_15<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
1441 typedef typename make_composite_t::type type_t;
1442 typedef typename make_composite_t::composite_type composite_type_t;
1444 return type_t(composite_type_t(construct_15<T>(),
1445 as_actor<A>::convert(a),
1446 as_actor<B>::convert(b),
1447 as_actor<C>::convert(c),
1448 as_actor<D>::convert(d),
1449 as_actor<E>::convert(e),
1450 as_actor<F>::convert(f),
1451 as_actor<G>::convert(g),
1452 as_actor<H>::convert(h),
1453 as_actor<I>::convert(i),
1454 as_actor<J>::convert(j),
1455 as_actor<K>::convert(k),
1456 as_actor<L>::convert(l),
1457 as_actor<M>::convert(m),
1458 as_actor<N>::convert(n),
1459 as_actor<O>::convert(o)
1468 ///////////////////////////////////////////////////////////////////////////////
1469 } // namespace phoenix
1471 #endif // PHOENIX_CASTS_HPP