1 /*=============================================================================
3 Copyright (c) 2001-2003 Joel de Guzman
4 Copyright (c) 2001-2003 Hartmut Kaiser
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 ==============================================================================*/
10 #ifndef PHOENIX_CASTS_HPP
11 #define PHOENIX_CASTS_HPP
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>
18 ///////////////////////////////////////////////////////////////////////////////
21 ///////////////////////////////////////////////////////////////////////////////
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!
31 #if !defined(PHOENIX_CONSTRUCT_LIMIT)
32 #define PHOENIX_CONSTRUCT_LIMIT PHOENIX_LIMIT
35 // ensure PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT
36 BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT);
38 // ensure PHOENIX_CONSTRUCT_LIMIT <= 15
39 BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= 15);
41 ///////////////////////////////////////////////////////////////////////////////
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:
50 // A *a = static_cast_<A *>(...actor returning a convertible type...);
52 // where the given parameter should be an actor, which eval() function
53 // returns a convertible type.
55 ///////////////////////////////////////////////////////////////////////////////
56 template <typename T, typename A>
57 struct static_cast_l {
59 template <typename TupleT>
60 struct result { typedef T type; };
62 static_cast_l(A const& a_)
65 template <typename TupleT>
67 eval(TupleT const& args) const
69 return static_cast<T>(a.eval(args));
75 //////////////////////////////////
76 template <typename T, typename BaseAT>
77 inline actor<static_cast_l<T, BaseAT> >
78 static_cast_(actor<BaseAT> const& a)
80 typedef static_cast_l<T, BaseAT> cast_t;
81 return actor<cast_t>(cast_t(a));
84 //////////////////////////////////
85 template <typename T, typename A>
86 struct dynamic_cast_l {
88 template <typename TupleT>
89 struct result { typedef T type; };
91 dynamic_cast_l(A const& a_)
94 template <typename TupleT>
96 eval(TupleT const& args) const
98 return dynamic_cast<T>(a.eval(args));
104 //////////////////////////////////
105 template <typename T, typename BaseAT>
106 inline actor<dynamic_cast_l<T, BaseAT> >
107 dynamic_cast_(actor<BaseAT> const& a)
109 typedef dynamic_cast_l<T, BaseAT> cast_t;
110 return actor<cast_t>(cast_t(a));
113 //////////////////////////////////
114 template <typename T, typename A>
115 struct reinterpret_cast_l {
117 template <typename TupleT>
118 struct result { typedef T type; };
120 reinterpret_cast_l(A const& a_)
123 template <typename TupleT>
125 eval(TupleT const& args) const
127 return reinterpret_cast<T>(a.eval(args));
133 //////////////////////////////////
134 template <typename T, typename BaseAT>
135 inline actor<reinterpret_cast_l<T, BaseAT> >
136 reinterpret_cast_(actor<BaseAT> const& a)
138 typedef reinterpret_cast_l<T, BaseAT> cast_t;
139 return actor<cast_t>(cast_t(a));
142 //////////////////////////////////
143 template <typename T, typename A>
144 struct const_cast_l {
146 template <typename TupleT>
147 struct result { typedef T type; };
149 const_cast_l(A const& a_)
152 template <typename TupleT>
154 eval(TupleT const& args) const
156 return const_cast<T>(a.eval(args));
162 //////////////////////////////////
163 template <typename T, typename BaseAT>
164 inline actor<const_cast_l<T, BaseAT> >
165 const_cast_(actor<BaseAT> const& a)
167 typedef const_cast_l<T, BaseAT> cast_t;
168 return actor<cast_t>(cast_t(a));
171 ///////////////////////////////////////////////////////////////////////////////
175 // Lazy object construction
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:
183 // A a = construct_<A>(...arbitrary list of actors...);
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
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.
194 ///////////////////////////////////////////////////////////////////////////////
195 template <typename T>
196 struct construct_l_0 {
197 typedef T result_type;
199 T operator()() const {
205 template <typename T>
213 #if PHOENIX_CONSTRUCT_LIMIT > 3
218 #if PHOENIX_CONSTRUCT_LIMIT > 6
223 #if PHOENIX_CONSTRUCT_LIMIT > 9
228 #if PHOENIX_CONSTRUCT_LIMIT > 12
237 struct result { typedef T type; };
244 template <typename A>
245 T operator()(A const& a) const
251 template <typename A, typename B>
252 T operator()(A const& a, B const& b) const
258 template <typename A, typename B, typename C>
259 T operator()(A const& a, B const& b, C const& c) const
265 #if PHOENIX_CONSTRUCT_LIMIT > 3
267 typename A, typename B, typename C, typename D
270 A const& a, B const& b, C const& c, D const& d) const
277 typename A, typename B, typename C, typename D, typename E
280 A const& a, B const& b, C const& c, D const& d, E const& e) const
287 typename A, typename B, typename C, typename D, typename E,
291 A const& a, B const& b, C const& c, D const& d, E const& e,
294 T t(a, b, c, d, e, f);
298 #if PHOENIX_CONSTRUCT_LIMIT > 6
300 typename A, typename B, typename C, typename D, typename E,
301 typename F, typename G
304 A const& a, B const& b, C const& c, D const& d, E const& e,
305 F const& f, G const& g) const
307 T t(a, b, c, d, e, f, g);
312 typename A, typename B, typename C, typename D, typename E,
313 typename F, typename G, typename H
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
319 T t(a, b, c, d, e, f, g, h);
324 typename A, typename B, typename C, typename D, typename E,
325 typename F, typename G, typename H, typename I
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
331 T t(a, b, c, d, e, f, g, h, i);
335 #if PHOENIX_CONSTRUCT_LIMIT > 9
337 typename A, typename B, typename C, typename D, typename E,
338 typename F, typename G, typename H, typename I, typename J
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
344 T t(a, b, c, d, e, f, g, h, i, j);
349 typename A, typename B, typename C, typename D, typename E,
350 typename F, typename G, typename H, typename I, typename J,
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,
358 T t(a, b, c, d, e, f, g, h, i, j, k);
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
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
372 T t(a, b, c, d, e, f, g, h, i, j, k, l);
376 #if PHOENIX_CONSTRUCT_LIMIT > 12
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
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
387 T t(a, b, c, d, e, f, g, h, i, j, k, l, m);
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
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
401 T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
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
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
415 T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o);
426 template <typename T>
432 struct result { typedef T type; };
434 template <typename A>
435 T operator()(A const& a) const
443 template <typename T>
450 struct result { typedef T type; };
452 template <typename A, typename B>
453 T operator()(A const& a, B const& b) const
461 template <typename T>
469 struct result { typedef T type; };
471 template <typename A, typename B, typename C>
472 T operator()(A const& a, B const& b, C const& c) const
479 #if PHOENIX_CONSTRUCT_LIMIT > 3
480 template <typename T>
489 struct result { typedef T type; };
492 typename A, typename B, typename C, typename D
495 A const& a, B const& b, C const& c, D const& d) const
503 template <typename T>
513 struct result { typedef T type; };
516 typename A, typename B, typename C, typename D, typename E
519 A const& a, B const& b, C const& c, D const& d, E const& e) const
527 template <typename T>
538 struct result { typedef T type; };
541 typename A, typename B, typename C, typename D, typename E,
545 A const& a, B const& b, C const& c, D const& d, E const& e,
548 T t(a, b, c, d, e, f);
555 #if PHOENIX_CONSTRUCT_LIMIT > 6
556 template <typename T>
568 struct result { typedef T type; };
571 typename A, typename B, typename C, typename D, typename E,
572 typename F, typename G
575 A const& a, B const& b, C const& c, D const& d, E const& e,
576 F const& f, G const& g) const
578 T t(a, b, c, d, e, f, g);
583 template <typename T>
596 struct result { typedef T type; };
599 typename A, typename B, typename C, typename D, typename E,
600 typename F, typename G, typename H
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
606 T t(a, b, c, d, e, f, g, h);
611 template <typename T>
625 struct result { typedef T type; };
628 typename A, typename B, typename C, typename D, typename E,
629 typename F, typename G, typename H, typename I
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
635 T t(a, b, c, d, e, f, g, h, i);
642 #if PHOENIX_CONSTRUCT_LIMIT > 9
643 template <typename T>
644 struct construct_10 {
658 struct result { typedef T type; };
661 typename A, typename B, typename C, typename D, typename E,
662 typename F, typename G, typename H, typename I, typename J
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
668 T t(a, b, c, d, e, f, g, h, i, j);
673 template <typename T>
674 struct construct_11 {
689 struct result { typedef T type; };
692 typename A, typename B, typename C, typename D, typename E,
693 typename F, typename G, typename H, typename I, typename J,
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,
701 T t(a, b, c, d, e, f, g, h, i, j, k);
706 template <typename T>
707 struct construct_12 {
723 struct result { typedef T type; };
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
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
735 T t(a, b, c, d, f, e, g, h, i, j, k, l);
741 #if PHOENIX_CONSTRUCT_LIMIT > 12
742 template <typename T>
743 struct construct_13 {
760 struct result { typedef T type; };
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
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
772 T t(a, b, c, d, e, f, g, h, i, j, k, l, m);
777 template <typename T>
778 struct construct_14 {
796 struct result { typedef T type; };
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
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
808 T t(a, b, c, d, e, f, g, h, i, j, k, l, m, n);
813 template <typename T>
814 struct construct_15 {
833 struct result { typedef T type; };
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
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
845 T t(a, b, c, d, f, e, g, h, i, j, k, l, m, n, o);
852 #if defined(__BORLANDC__) || (defined(__MWERKS__) && (__MWERKS__ <= 0x3002))
854 ///////////////////////////////////////////////////////////////////////////////
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)
860 ///////////////////////////////////////////////////////////////////////////////
861 template <typename T, typename TupleT>
862 struct composite0_result<construct_l_0<T>, TupleT> {
867 //////////////////////////////////
868 template <typename T, typename TupleT,
870 struct composite1_result<construct_l<T>, TupleT, A> {
875 //////////////////////////////////
876 template <typename T, typename TupleT,
877 typename A, typename B>
878 struct composite2_result<construct_l<T>, TupleT, A, B> {
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> {
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,
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,
910 //////////////////////////////////
911 template <typename T, typename TupleT,
912 typename A, typename B, typename C, typename D, typename E,
914 struct composite6_result<construct_l<T>, TupleT,
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> {
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> {
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> {
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> {
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,
967 struct composite11_result<construct_l<T>, TupleT,
968 A, B, C, D, E, F, G, H, I, J, K> {
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> {
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> {
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> {
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> {
1024 //////////////////////////////////
1025 template <typename T>
1026 inline typename impl::make_composite<construct_l_0<T> >::type
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;
1033 return type_t(composite_type_t(construct_l_0<T>()));
1036 //////////////////////////////////
1037 template <typename T, typename A>
1038 inline typename impl::make_composite<construct_1<T>, A>::type
1039 construct_(A const& a)
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;
1045 return type_t(composite_type_t(construct_1<T>(),
1046 as_actor<A>::convert(a)
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)
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;
1059 return type_t(composite_type_t(construct_2<T>(),
1060 as_actor<A>::convert(a),
1061 as_actor<B>::convert(b)
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)
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;
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)
1081 #if PHOENIX_CONSTRUCT_LIMIT > 3
1082 //////////////////////////////////
1084 typename T, typename A, typename B, typename C, typename D
1086 inline typename impl::make_composite<construct_4<T>, A, B, C, D>::type
1088 A const& a, B const& b, C const& c, D const& d)
1091 impl::make_composite<construct_4<T>, A, B, C, D>
1093 typedef typename make_composite_t::type type_t;
1094 typedef typename make_composite_t::composite_type composite_type_t;
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)
1104 //////////////////////////////////
1106 typename T, typename A, typename B, typename C, typename D, typename E
1108 inline typename impl::make_composite<construct_5<T>, A, B, C, D, E>::type
1110 A const& a, B const& b, C const& c, D const& d, E const& e)
1113 impl::make_composite<construct_5<T>, A, B, C, D, E>
1115 typedef typename make_composite_t::type type_t;
1116 typedef typename make_composite_t::composite_type composite_type_t;
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)
1127 //////////////////////////////////
1129 typename T, typename A, typename B, typename C, typename D, typename E,
1132 inline typename impl::make_composite<construct_6<T>, A, B, C, D, E, F>::type
1134 A const& a, B const& b, C const& c, D const& d, E const& e,
1138 impl::make_composite<construct_6<T>, A, B, C, D, E, F>
1140 typedef typename make_composite_t::type type_t;
1141 typedef typename make_composite_t::composite_type composite_type_t;
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)
1153 #if PHOENIX_CONSTRUCT_LIMIT > 6
1154 //////////////////////////////////
1156 typename T, typename A, typename B, typename C, typename D, typename E,
1157 typename F, typename G
1159 inline typename impl::make_composite<construct_7<T>, A, B, C, D, E, F, G>::type
1161 A const& a, B const& b, C const& c, D const& d, E const& e,
1162 F const& f, G const& g)
1165 impl::make_composite<construct_7<T>, A, B, C, D, E, F, G>
1167 typedef typename make_composite_t::type type_t;
1168 typedef typename make_composite_t::composite_type composite_type_t;
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)
1181 //////////////////////////////////
1183 typename T, typename A, typename B, typename C, typename D, typename E,
1184 typename F, typename G, typename H
1186 inline typename impl::make_composite<construct_8<T>, A, B, C, D, E, F, G, H>::type
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)
1192 impl::make_composite<construct_8<T>, A, B, C, D, E, F, G, H>
1194 typedef typename make_composite_t::type type_t;
1195 typedef typename make_composite_t::composite_type composite_type_t;
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)
1209 //////////////////////////////////
1211 typename T, typename A, typename B, typename C, typename D, typename E,
1212 typename F, typename G, typename H, typename I
1214 inline typename impl::make_composite<construct_9<T>, A, B, C, D, E, F, G, H, I>::type
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)
1220 impl::make_composite<construct_9<T>, A, B, C, D, E, F, G, H, I>
1222 typedef typename make_composite_t::type type_t;
1223 typedef typename make_composite_t::composite_type composite_type_t;
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)
1238 #if PHOENIX_CONSTRUCT_LIMIT > 9
1239 //////////////////////////////////
1241 typename T, typename A, typename B, typename C, typename D, typename E,
1242 typename F, typename G, typename H, typename I, typename J
1244 inline typename impl::make_composite<
1245 construct_10<T>, A, B, C, D, E, F, G, H, I, J>::type
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)
1251 impl::make_composite<
1252 construct_10<T>, A, B, C, D, E, F, G, H, I, J
1255 typedef typename make_composite_t::type type_t;
1256 typedef typename make_composite_t::composite_type composite_type_t;
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)
1272 //////////////////////////////////
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
1277 inline typename impl::make_composite<
1278 construct_11<T>, A, B, C, D, E, F, G, H, I, J, K>::type
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,
1285 impl::make_composite<
1286 construct_11<T>, A, B, C, D, E, F, G, H, I, J, K
1289 typedef typename make_composite_t::type type_t;
1290 typedef typename make_composite_t::composite_type composite_type_t;
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)
1307 //////////////////////////////////
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,
1313 inline typename impl::make_composite<
1314 construct_12<T>, A, B, C, D, E, F, G, H, I, J, K, L>::type
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)
1321 impl::make_composite<
1322 construct_12<T>, A, B, C, D, E, F, G, H, I, J, K, L
1325 typedef typename make_composite_t::type type_t;
1326 typedef typename make_composite_t::composite_type composite_type_t;
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)
1344 #if PHOENIX_CONSTRUCT_LIMIT > 12
1345 //////////////////////////////////
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
1351 inline typename impl::make_composite<
1352 construct_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
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)
1359 impl::make_composite<
1360 construct_13<T>, A, B, C, D, E, F, G, H, I, J, K, L, M
1363 typedef typename make_composite_t::type type_t;
1364 typedef typename make_composite_t::composite_type composite_type_t;
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)
1383 //////////////////////////////////
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
1389 inline typename impl::make_composite<
1390 construct_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M>::type
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)
1397 impl::make_composite<
1398 construct_14<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N
1401 typedef typename make_composite_t::type type_t;
1402 typedef typename make_composite_t::composite_type composite_type_t;
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)
1422 //////////////////////////////////
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
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
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)
1436 impl::make_composite<
1437 construct_15<T>, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
1440 typedef typename make_composite_t::type type_t;
1441 typedef typename make_composite_t::composite_type composite_type_t;
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)
1467 ///////////////////////////////////////////////////////////////////////////////
1468 } // namespace phoenix
1470 #endif // PHOENIX_CASTS_HPP