Chris@16: /*============================================================================= Chris@16: Phoenix V1.2.1 Chris@16: Copyright (c) 2001-2003 Joel de Guzman Chris@16: Copyright (c) 2001-2003 Hartmut Kaiser Chris@16: Copyright (c) 2003 Vaclav Vesely Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: Chris@16: #ifndef PHOENIX_NEW_HPP Chris@16: #define PHOENIX_NEW_HPP Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: namespace phoenix { Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // Phoenix predefined maximum new_ limit. This limit defines the maximum Chris@16: // number of parameters supported for calles to the set of new_ template Chris@16: // functions (lazy object construction, see below). This number defaults to 3. Chris@16: // The actual maximum is rounded up in multiples of 3. Thus, if this value Chris@16: // is 4, the actual limit is 6. The ultimate maximum limit in this Chris@16: // implementation is 15. Chris@16: // PHOENIX_CONSTRUCT_LIMIT should NOT be greater than PHOENIX_LIMIT! Chris@16: Chris@16: #if !defined(PHOENIX_CONSTRUCT_LIMIT) Chris@16: #define PHOENIX_CONSTRUCT_LIMIT PHOENIX_LIMIT Chris@16: #endif Chris@16: Chris@16: // ensure PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT Chris@16: BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= PHOENIX_LIMIT); Chris@16: Chris@16: // ensure PHOENIX_CONSTRUCT_LIMIT <= 15 Chris@16: BOOST_STATIC_ASSERT(PHOENIX_CONSTRUCT_LIMIT <= 15); Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // new_ Chris@16: // Chris@16: // Lazy object construction Chris@16: // Chris@16: // The set of new_<> template classes and functions provide a way Chris@16: // of lazily constructing certain object from a arbitrary set of Chris@16: // actors during parsing. Chris@16: // The new_ templates are (syntactically) used very much like Chris@16: // the well known C++ casts: Chris@16: // Chris@16: // A *a = new_(...arbitrary list of actors...); Chris@16: // Chris@16: // where the given parameters are submitted as parameters to the Chris@16: // contructor of the object of type A. (This certainly implies, that Chris@16: // type A has a constructor with a fitting set of parameter types Chris@16: // defined.) Chris@16: // Chris@16: // The maximum number of needed parameters is controlled through the Chris@16: // preprocessor constant PHOENIX_CONSTRUCT_LIMIT. Note though, that this Chris@16: // limit should not be greater than PHOENIX_LIMIT. Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: template Chris@16: struct new_l_0 Chris@16: { Chris@16: typedef T* result_type; Chris@16: Chris@16: T* operator()() const Chris@16: { Chris@16: return new T(); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct new_l { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: , typename B Chris@16: , typename C Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 3 Chris@16: , typename D Chris@16: , typename E Chris@16: , typename F Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 6 Chris@16: , typename G Chris@16: , typename H Chris@16: , typename I Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 9 Chris@16: , typename J Chris@16: , typename K Chris@16: , typename L Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 12 Chris@16: , typename M Chris@16: , typename N Chris@16: , typename O Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: T* operator()() const { Chris@16: return new T(); Chris@16: } Chris@16: Chris@16: template Chris@16: T* operator()(A const& a) const { Chris@16: return new T(a); Chris@16: } Chris@16: Chris@16: template Chris@16: T* operator()(A const& a, B const& b) const { Chris@16: return new T(a, b); Chris@16: } Chris@16: Chris@16: template Chris@16: T* operator()(A const& a, B const& b, C const& c) const { Chris@16: return new T(a, b, c); Chris@16: } Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 3 Chris@16: template < Chris@16: typename A, typename B, typename C, typename D Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d) const Chris@16: { Chris@16: return new T(a, b, c, d); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e) const Chris@16: { Chris@16: return new T(a, b, c, d, e); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f); Chris@16: } Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 6 Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g, h); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g, h, i); Chris@16: } Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 9 Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g, h, i, j); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, Chris@16: typename K Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j, Chris@16: K const& k) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g, h, i, j, k); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, Chris@16: typename K, typename L Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j, Chris@16: K const& k, L const& l) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g, h, i, j, k, l); Chris@16: } Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 12 Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, Chris@16: typename K, typename L, typename M Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j, Chris@16: K const& k, L const& l, M const& m) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g, h, i, j, k, l, m); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, Chris@16: typename K, typename L, typename M, typename N Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j, Chris@16: K const& k, L const& l, M const& m, N const& n) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g, h, i, j, k, l, m, n); Chris@16: } Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, Chris@16: typename K, typename L, typename M, typename N, typename O Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j, Chris@16: K const& k, L const& l, M const& m, N const& n, O const& o) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o); Chris@16: } Chris@16: Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: }; Chris@16: Chris@16: template Chris@16: struct new_1 { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: template Chris@16: T* operator()(A const& a) const { Chris@16: return new T(a); Chris@16: } Chris@16: Chris@16: }; Chris@16: Chris@16: template Chris@16: struct new_2 { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: , typename B Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: template Chris@16: T* operator()(A const& a, B const& b) const { Chris@16: return new T(a, b); Chris@16: } Chris@16: Chris@16: }; Chris@16: Chris@16: template Chris@16: struct new_3 { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: , typename B Chris@16: , typename C Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: template Chris@16: T* operator()(A const& a, B const& b, C const& c) const { Chris@16: return new T(a, b, c); Chris@16: } Chris@16: }; Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 3 Chris@16: template Chris@16: struct new_4 { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: , typename B Chris@16: , typename C Chris@16: , typename D Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d) const Chris@16: { Chris@16: return new T(a, b, c, d); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@16: struct new_5 { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: , typename B Chris@16: , typename C Chris@16: , typename D Chris@16: , typename E Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e) const Chris@16: { Chris@16: return new T(a, b, c, d, e); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: template Chris@16: struct new_6 { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: , typename B Chris@16: , typename C Chris@16: , typename D Chris@16: , typename E Chris@16: , typename F Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f); Chris@16: } Chris@16: }; Chris@16: #endif Chris@16: Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 6 Chris@16: template Chris@16: struct new_7 { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: , typename B Chris@16: , typename C Chris@16: , typename D Chris@16: , typename E Chris@16: , typename F Chris@16: , typename G Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct new_8 { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: , typename B Chris@16: , typename C Chris@16: , typename D Chris@16: , typename E Chris@16: , typename F Chris@16: , typename G Chris@16: , typename H Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g, h); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct new_9 { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: , typename B Chris@16: , typename C Chris@16: , typename D Chris@16: , typename E Chris@16: , typename F Chris@16: , typename G Chris@16: , typename H Chris@16: , typename I Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g, h, i); Chris@16: } Chris@16: }; Chris@16: #endif Chris@16: Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 9 Chris@16: template Chris@16: struct new_10 { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: , typename B Chris@16: , typename C Chris@16: , typename D Chris@16: , typename E Chris@16: , typename F Chris@16: , typename G Chris@16: , typename H Chris@16: , typename I Chris@16: , typename J Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g, h, i, j); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct new_11 { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: , typename B Chris@16: , typename C Chris@16: , typename D Chris@16: , typename E Chris@16: , typename F Chris@16: , typename G Chris@16: , typename H Chris@16: , typename I Chris@16: , typename J Chris@16: , typename K Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, Chris@16: typename K Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j, Chris@16: K const& k) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g, h, i, j, k); Chris@16: } Chris@16: Chris@16: }; Chris@16: Chris@16: template Chris@16: struct new_12 { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: , typename B Chris@16: , typename C Chris@16: , typename D Chris@16: , typename E Chris@16: , typename F Chris@16: , typename G Chris@16: , typename H Chris@16: , typename I Chris@16: , typename J Chris@16: , typename K Chris@16: , typename L Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, Chris@16: typename K, typename L Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j, Chris@16: K const& k, L const& l) const Chris@16: { Chris@16: return new T(a, b, c, d, f, e, g, h, i, j, k, l); Chris@16: } Chris@16: }; Chris@16: #endif Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 12 Chris@16: template Chris@16: struct new_13 { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: , typename B Chris@16: , typename C Chris@16: , typename D Chris@16: , typename E Chris@16: , typename F Chris@16: , typename G Chris@16: , typename H Chris@16: , typename I Chris@16: , typename J Chris@16: , typename K Chris@16: , typename L Chris@16: , typename M Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, Chris@16: typename K, typename L, typename M Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j, Chris@16: K const& k, L const& l, M const& m) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g, h, i, j, k, l, m); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct new_14 { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: , typename B Chris@16: , typename C Chris@16: , typename D Chris@16: , typename E Chris@16: , typename F Chris@16: , typename G Chris@16: , typename H Chris@16: , typename I Chris@16: , typename J Chris@16: , typename K Chris@16: , typename L Chris@16: , typename M Chris@16: , typename N Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, Chris@16: typename K, typename L, typename M, typename N Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j, Chris@16: K const& k, L const& l, M const& m, N const& n) const Chris@16: { Chris@16: return new T(a, b, c, d, e, f, g, h, i, j, k, l, m, n); Chris@16: } Chris@16: Chris@16: }; Chris@16: Chris@16: template Chris@16: struct new_15 { Chris@16: Chris@16: template < Chris@16: typename A Chris@16: , typename B Chris@16: , typename C Chris@16: , typename D Chris@16: , typename E Chris@16: , typename F Chris@16: , typename G Chris@16: , typename H Chris@16: , typename I Chris@16: , typename J Chris@16: , typename K Chris@16: , typename L Chris@16: , typename M Chris@16: , typename N Chris@16: , typename O Chris@16: > Chris@16: struct result { typedef T* type; }; Chris@16: Chris@16: Chris@16: template < Chris@16: typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, Chris@16: typename K, typename L, typename M, typename N, typename O Chris@16: > Chris@16: T* operator()( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j, Chris@16: K const& k, L const& l, M const& m, N const& n, O const& o) const Chris@16: { Chris@16: return new T(a, b, c, d, f, e, g, h, i, j, k, l, m, n, o); Chris@16: } Chris@16: Chris@16: }; Chris@16: #endif Chris@16: Chris@16: Chris@16: #if defined(__BORLANDC__) || (defined(__MWERKS__) && (__MWERKS__ <= 0x3002)) Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // The following specializations are needed because Borland and CodeWarrior Chris@16: // does not accept default template arguments in nested template classes in Chris@16: // classes (i.e new_l::result) Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: template Chris@16: struct composite0_result, TupleT> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: struct composite1_result, TupleT, A> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: struct composite2_result, TupleT, A, B> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: struct composite3_result, TupleT, A, B, C> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: #if PHOENIX_LIMIT > 3 Chris@16: ////////////////////////////////// Chris@16: template Chris@16: struct composite4_result, TupleT, Chris@16: A, B, C, D> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: struct composite5_result, TupleT, Chris@16: A, B, C, D, E> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: struct composite6_result, TupleT, Chris@16: A, B, C, D, E, F> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: #if PHOENIX_LIMIT > 6 Chris@16: ////////////////////////////////// Chris@16: template Chris@16: struct composite7_result, TupleT, Chris@16: A, B, C, D, E, F, G> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: struct composite8_result, TupleT, Chris@16: A, B, C, D, E, F, G, H> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: struct composite9_result, TupleT, Chris@16: A, B, C, D, E, F, G, H, I> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: #if PHOENIX_LIMIT > 9 Chris@16: ////////////////////////////////// Chris@16: template Chris@16: struct composite10_result, TupleT, Chris@16: A, B, C, D, E, F, G, H, I, J> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: struct composite11_result, TupleT, Chris@16: A, B, C, D, E, F, G, H, I, J, K> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: struct composite12_result, TupleT, Chris@16: A, B, C, D, E, F, G, H, I, J, K, L> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: #if PHOENIX_LIMIT > 12 Chris@16: ////////////////////////////////// Chris@16: template Chris@16: struct composite13_result, TupleT, Chris@16: A, B, C, D, E, F, G, H, I, J, K, L, M> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: struct composite14_result, TupleT, Chris@16: A, B, C, D, E, F, G, H, I, J, K, L, M, N> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: struct composite15_result, TupleT, Chris@16: A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> { Chris@16: Chris@16: typedef T* type; Chris@16: }; Chris@16: Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: inline typename impl::make_composite >::type Chris@16: new_() Chris@16: { Chris@16: typedef impl::make_composite > make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_l_0())); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: inline typename impl::make_composite, A>::type Chris@16: new_(A const& a) Chris@16: { Chris@16: typedef impl::make_composite, A> make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_1(), Chris@16: as_actor::convert(a) Chris@16: )); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: inline typename impl::make_composite, A, B>::type Chris@16: new_(A const& a, B const& b) Chris@16: { Chris@16: typedef impl::make_composite, A, B> make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_2(), Chris@16: as_actor::convert(a), Chris@16: as_actor::convert(b) Chris@16: )); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: inline typename impl::make_composite, A, B, C>::type Chris@16: new_(A const& a, B const& b, C const& c) Chris@16: { Chris@16: typedef impl::make_composite, A, B, C> make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_3(), Chris@16: as_actor::convert(a), Chris@16: as_actor::convert(b), Chris@16: as_actor::convert(c) Chris@16: )); Chris@16: } Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 3 Chris@16: ////////////////////////////////// Chris@16: template < Chris@16: typename T, typename A, typename B, typename C, typename D Chris@16: > Chris@16: inline typename impl::make_composite, A, B, C, D>::type Chris@16: new_( Chris@16: A const& a, B const& b, C const& c, D const& d) Chris@16: { Chris@16: typedef Chris@16: impl::make_composite, A, B, C, D> Chris@16: make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_4(), Chris@16: as_actor::convert(a), Chris@16: as_actor::convert(b), Chris@16: as_actor::convert(c), Chris@16: as_actor::convert(d) Chris@16: )); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template < Chris@16: typename T, typename A, typename B, typename C, typename D, typename E Chris@16: > Chris@16: inline typename impl::make_composite, A, B, C, D, E>::type Chris@16: new_( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e) Chris@16: { Chris@16: typedef Chris@16: impl::make_composite, A, B, C, D, E> Chris@16: make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_5(), Chris@16: as_actor::convert(a), Chris@16: as_actor::convert(b), Chris@16: as_actor::convert(c), Chris@16: as_actor::convert(d), Chris@16: as_actor::convert(e) Chris@16: )); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template < Chris@16: typename T, typename A, typename B, typename C, typename D, typename E, Chris@16: typename F Chris@16: > Chris@16: inline typename impl::make_composite, A, B, C, D, E, F>::type Chris@16: new_( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f) Chris@16: { Chris@16: typedef Chris@16: impl::make_composite, A, B, C, D, E, F> Chris@16: make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_6(), Chris@16: as_actor::convert(a), Chris@16: as_actor::convert(b), Chris@16: as_actor::convert(c), Chris@16: as_actor::convert(d), Chris@16: as_actor::convert(e), Chris@16: as_actor::convert(f) Chris@16: )); Chris@16: } Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 6 Chris@16: ////////////////////////////////// Chris@16: template < Chris@16: typename T, typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G Chris@16: > Chris@16: inline typename impl::make_composite, A, B, C, D, E, F, G>::type Chris@16: new_( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g) Chris@16: { Chris@16: typedef Chris@16: impl::make_composite, A, B, C, D, E, F, G> Chris@16: make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_7(), Chris@16: as_actor::convert(a), Chris@16: as_actor::convert(b), Chris@16: as_actor::convert(c), Chris@16: as_actor::convert(d), Chris@16: as_actor::convert(e), Chris@16: as_actor::convert(f), Chris@16: as_actor::convert(g) Chris@16: )); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template < Chris@16: typename T, typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H Chris@16: > Chris@16: inline typename impl::make_composite, A, B, C, D, E, F, G, H>::type Chris@16: new_( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h) Chris@16: { Chris@16: typedef Chris@16: impl::make_composite, A, B, C, D, E, F, G, H> Chris@16: make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_8(), Chris@16: as_actor::convert(a), Chris@16: as_actor::convert(b), Chris@16: as_actor::convert(c), Chris@16: as_actor::convert(d), Chris@16: as_actor::convert(e), Chris@16: as_actor::convert(f), Chris@16: as_actor::convert(g), Chris@16: as_actor::convert(h) Chris@16: )); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template < Chris@16: typename T, typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I Chris@16: > Chris@16: inline typename impl::make_composite, A, B, C, D, E, F, G, H, I>::type Chris@16: new_( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i) Chris@16: { Chris@16: typedef Chris@16: impl::make_composite, A, B, C, D, E, F, G, H, I> Chris@16: make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_9(), Chris@16: as_actor::convert(a), Chris@16: as_actor::convert(b), Chris@16: as_actor::convert(c), Chris@16: as_actor::convert(d), Chris@16: as_actor::convert(e), Chris@16: as_actor::convert(f), Chris@16: as_actor::convert(g), Chris@16: as_actor::convert(h), Chris@16: as_actor::convert(i) Chris@16: )); Chris@16: } Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 9 Chris@16: ////////////////////////////////// Chris@16: template < Chris@16: typename T, typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J Chris@16: > Chris@16: inline typename impl::make_composite< Chris@16: new_10, A, B, C, D, E, F, G, H, I, J>::type Chris@16: new_( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j) Chris@16: { Chris@16: typedef Chris@16: impl::make_composite< Chris@16: new_10, A, B, C, D, E, F, G, H, I, J Chris@16: > Chris@16: make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_10(), Chris@16: as_actor::convert(a), Chris@16: as_actor::convert(b), Chris@16: as_actor::convert(c), Chris@16: as_actor::convert(d), Chris@16: as_actor::convert(e), Chris@16: as_actor::convert(f), Chris@16: as_actor::convert(g), Chris@16: as_actor::convert(h), Chris@16: as_actor::convert(i), Chris@16: as_actor::convert(j) Chris@16: )); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template < Chris@16: typename T, typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, typename K Chris@16: > Chris@16: inline typename impl::make_composite< Chris@16: new_11, A, B, C, D, E, F, G, H, I, J, K>::type Chris@16: new_( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j, Chris@16: K const& k) Chris@16: { Chris@16: typedef Chris@16: impl::make_composite< Chris@16: new_11, A, B, C, D, E, F, G, H, I, J, K Chris@16: > Chris@16: make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_11(), Chris@16: as_actor::convert(a), Chris@16: as_actor::convert(b), Chris@16: as_actor::convert(c), Chris@16: as_actor::convert(d), Chris@16: as_actor::convert(e), Chris@16: as_actor::convert(f), Chris@16: as_actor::convert(g), Chris@16: as_actor::convert(h), Chris@16: as_actor::convert(i), Chris@16: as_actor::convert(j), Chris@16: as_actor::convert(k) Chris@16: )); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template < Chris@16: typename T, typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, typename K, Chris@16: typename L Chris@16: > Chris@16: inline typename impl::make_composite< Chris@16: new_12, A, B, C, D, E, F, G, H, I, J, K, L>::type Chris@16: new_( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j, Chris@16: K const& k, L const& l) Chris@16: { Chris@16: typedef Chris@16: impl::make_composite< Chris@16: new_12, A, B, C, D, E, F, G, H, I, J, K, L Chris@16: > Chris@16: make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_12(), Chris@16: as_actor::convert(a), Chris@16: as_actor::convert(b), Chris@16: as_actor::convert(c), Chris@16: as_actor::convert(d), Chris@16: as_actor::convert(e), Chris@16: as_actor::convert(f), Chris@16: as_actor::convert(g), Chris@16: as_actor::convert(h), Chris@16: as_actor::convert(i), Chris@16: as_actor::convert(j), Chris@16: as_actor::convert(k), Chris@16: as_actor::convert(l) Chris@16: )); Chris@16: } Chris@16: Chris@16: #if PHOENIX_CONSTRUCT_LIMIT > 12 Chris@16: ////////////////////////////////// Chris@16: template < Chris@16: typename T, typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, typename K, Chris@16: typename L, typename M Chris@16: > Chris@16: inline typename impl::make_composite< Chris@16: new_13, A, B, C, D, E, F, G, H, I, J, K, L, M>::type Chris@16: new_( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j, Chris@16: K const& k, L const& l, M const& m) Chris@16: { Chris@16: typedef Chris@16: impl::make_composite< Chris@16: new_13, A, B, C, D, E, F, G, H, I, J, K, L, M Chris@16: > Chris@16: make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_13(), Chris@16: as_actor::convert(a), Chris@16: as_actor::convert(b), Chris@16: as_actor::convert(c), Chris@16: as_actor::convert(d), Chris@16: as_actor::convert(e), Chris@16: as_actor::convert(f), Chris@16: as_actor::convert(g), Chris@16: as_actor::convert(h), Chris@16: as_actor::convert(i), Chris@16: as_actor::convert(j), Chris@16: as_actor::convert(k), Chris@16: as_actor::convert(l), Chris@16: as_actor::convert(m) Chris@16: )); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template < Chris@16: typename T, typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, typename K, Chris@16: typename L, typename M, typename N Chris@16: > Chris@16: inline typename impl::make_composite< Chris@16: new_14, A, B, C, D, E, F, G, H, I, J, K, L, M>::type Chris@16: new_( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j, Chris@16: K const& k, L const& l, M const& m, N const& n) Chris@16: { Chris@16: typedef Chris@16: impl::make_composite< Chris@16: new_14, A, B, C, D, E, F, G, H, I, J, K, L, M, N Chris@16: > Chris@16: make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_14(), Chris@16: as_actor::convert(a), Chris@16: as_actor::convert(b), Chris@16: as_actor::convert(c), Chris@16: as_actor::convert(d), Chris@16: as_actor::convert(e), Chris@16: as_actor::convert(f), Chris@16: as_actor::convert(g), Chris@16: as_actor::convert(h), Chris@16: as_actor::convert(i), Chris@16: as_actor::convert(j), Chris@16: as_actor::convert(k), Chris@16: as_actor::convert(l), Chris@16: as_actor::convert(m), Chris@16: as_actor::convert(n) Chris@16: )); Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template < Chris@16: typename T, typename A, typename B, typename C, typename D, typename E, Chris@16: typename F, typename G, typename H, typename I, typename J, typename K, Chris@16: typename L, typename M, typename N, typename O Chris@16: > Chris@16: inline typename impl::make_composite< Chris@16: new_15, A, B, C, D, E, F, G, H, I, J, K, L, M, O>::type Chris@16: new_( Chris@16: A const& a, B const& b, C const& c, D const& d, E const& e, Chris@16: F const& f, G const& g, H const& h, I const& i, J const& j, Chris@16: K const& k, L const& l, M const& m, N const& n, O const& o) Chris@16: { Chris@16: typedef Chris@16: impl::make_composite< Chris@16: new_15, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O Chris@16: > Chris@16: make_composite_t; Chris@16: typedef typename make_composite_t::type type_t; Chris@16: typedef typename make_composite_t::composite_type composite_type_t; Chris@16: Chris@16: return type_t(composite_type_t(new_15(), Chris@16: as_actor::convert(a), Chris@16: as_actor::convert(b), Chris@16: as_actor::convert(c), Chris@16: as_actor::convert(d), Chris@16: as_actor::convert(e), Chris@16: as_actor::convert(f), Chris@16: as_actor::convert(g), Chris@16: as_actor::convert(h), Chris@16: as_actor::convert(i), Chris@16: as_actor::convert(j), Chris@16: as_actor::convert(k), Chris@16: as_actor::convert(l), Chris@16: as_actor::convert(m), Chris@16: as_actor::convert(n), Chris@16: as_actor::convert(o) Chris@16: )); Chris@16: } Chris@16: Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: #endif Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: } // namespace phoenix Chris@16: Chris@16: #endif // PHOENIX_NEW_HPP