/*============================================================================= Phoenix V1.2.1 Copyright (c) 2001-2002 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #ifndef PHOENIX_TUPLES_HPP #define PHOENIX_TUPLES_HPP #if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300) #error "Sorry, Phoenix does not support VC6 and VC7. Please upgrade to at least VC7.1" #endif /////////////////////////////////////////////////////////////////////////////// // // Phoenix predefined maximum limit. This limit defines the maximum // number of elements a tuple can hold. This number defaults to 3. The // actual maximum is rounded up in multiples of 3. Thus, if this value // is 4, the actual limit is 6. The ultimate maximum limit in this // implementation is 15. // /////////////////////////////////////////////////////////////////////////////// #ifndef PHOENIX_LIMIT #define PHOENIX_LIMIT 3 #endif #if defined(__BORLANDC__) && (__BORLANDC__ <= 0x561) namespace phoenix { namespace borland_only { namespace ftors { // We define these dummy template functions. Borland complains when // a template class has the same name as a template function, // regardless if they are in different namespaces. template void if_(T) {} template void for_(T) {} template void while_(T) {} template void do_(T) {} } namespace tmpls { // We define these dummy template functions. Borland complains when // a template class has the same name as a template function, // regardless if they are in different namespaces. template struct if_ {}; template struct for_ {}; template struct while_ {}; template struct do_ {}; } }} // namespace phoenix::borland_only #endif /////////////////////////////////////////////////////////////////////////////// #include #include #include #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) #pragma warning(push) #pragma warning(disable:4512) //assignment operator could not be generated #endif /////////////////////////////////////////////////////////////////////////////// namespace phoenix { /////////////////////////////////////////////////////////////////////////////// // // tuple // // Tuples hold heterogeneous types up to a predefined maximum. Only // the most basic functionality needed is provided. Unlike other // recursive list-like tuple implementations, this tuple // implementation uses simple structs similar to std::pair with // specialization for 0 to N tuple elements. // // 1) Construction // Here are examples on how to construct tuples: // // typedef tuple t1_t; // typedef tuple t2_t; // // // this tuple has an int and char members // t1_t t1(3, 'c'); // // // this tuple has an int, std::string and double members // t2_t t2(3, "hello", 3.14); // // Tuples can also be constructed from other tuples. The // source and destination tuples need not have exactly the // same element types. The only requirement is that the // source tuple have the same number of elements as the // destination and that each element slot in the // destination can be copy constructed from the source // element. For example: // // tuple t3(t1); // OK. Compatible tuples // tuple t4(t2); // Error! Incompatible tuples // // 2) Member access // A member in a tuple can be accessed using the // tuple's [] operator by specifying the Nth // tuple_index. Here are some examples: // // tuple_index<0> ix0; // 0th index == 1st item // tuple_index<1> ix1; // 1st index == 2nd item // tuple_index<2> ix2; // 2nd index == 3rd item // // t1[ix0] = 33; // sets the int member of the tuple t1 // t2[ix2] = 6e6; // sets the double member of the tuple t2 // t1[ix1] = 'a'; // sets the char member of the tuple t1 // // There are some predefined names are provided in sub- // namespace tuple_index_names: // // tuple_index<0> _1; // tuple_index<1> _2; // ... // tuple_index _N; // // These indexes may be used by 'using' namespace // phoenix::tuple_index_names. // // Access to out of bound indexes returns a nil_t value. // // 3) Member type inquiry // The type of an individual member can be queried. // Example: // // tuple_element<1, t2_t>::type // // Refers to the type of the second member (note zero based, // thus 0 = 1st item, 1 = 2nd item) of the tuple. // // Aside from tuple_element::type, there are two // more types that tuple_element provides: rtype and // crtype. While 'type' is the plain underlying type, // 'rtype' is the reference type, or type& and 'crtype' // is the constant reference type or type const&. The // latter two are provided to make it easy for the // client in dealing with the possibility of reference // to reference when type is already a reference, which // is illegal in C++. // // Access to out of bound indexes returns a nil_t type. // // 4) Tuple length // The number of elements in a tuple can be queried. // Example: // // int n = t1.length; // // gets the number of elements in tuple t1. // // length is a static constant. Thus, TupleT::length // also works. Example: // // int n = t1_t::length; // /////////////////////////////////////////////////////////////////////////////// struct nil_t {}; using boost::remove_reference; using boost::call_traits; ////////////////////////////////// namespace impl { template struct access { typedef const T& ctype; typedef T& type; }; template struct access { typedef T& ctype; typedef T& type; }; } /////////////////////////////////////////////////////////////////////////////// // // tuple_element // // A query class that gets the Nth element inside a tuple. // Examples: // // tuple_element<1, tuple >::type // plain // tuple_element<1, tuple >::rtype // ref // tuple_element<1, tuple >::crtype // const ref // // Has type char which is the 2nd type in the tuple // (note zero based, thus 0 = 1st item, 1 = 2nd item). // // Given a tuple object, the static function tuple_element::get(tuple) gets the Nth element in the tuple. The // tuple class' tuple::operator[] uses this to get its Nth // element. // /////////////////////////////////////////////////////////////////////////////// template struct tuple_element { typedef nil_t type; typedef nil_t& rtype; typedef nil_t const& crtype; static nil_t get(TupleT const& t) { return nil_t(); } }; ////////////////////////////////// template struct tuple_element<0, TupleT> { typedef typename TupleT::a_type type; typedef typename impl::access::type rtype; typedef typename impl::access::ctype crtype; static rtype get(TupleT& t) { return t.a; } static crtype get(TupleT const& t) { return t.a; } }; ////////////////////////////////// template struct tuple_element<1, TupleT> { typedef typename TupleT::b_type type; typedef typename impl::access::type rtype; typedef typename impl::access::ctype crtype; static rtype get(TupleT& t) { return t.b; } static crtype get(TupleT const& t) { return t.b; } }; ////////////////////////////////// template struct tuple_element<2, TupleT> { typedef typename TupleT::c_type type; typedef typename impl::access::type rtype; typedef typename impl::access::ctype crtype; static rtype get(TupleT& t) { return t.c; } static crtype get(TupleT const& t) { return t.c; } }; #if PHOENIX_LIMIT > 3 ////////////////////////////////// template struct tuple_element<3, TupleT> { typedef typename TupleT::d_type type; typedef typename impl::access::type rtype; typedef typename impl::access::ctype crtype; static rtype get(TupleT& t) { return t.d; } static crtype get(TupleT const& t) { return t.d; } }; ////////////////////////////////// template struct tuple_element<4, TupleT> { typedef typename TupleT::e_type type; typedef typename impl::access::type rtype; typedef typename impl::access::ctype crtype; static rtype get(TupleT& t) { return t.e; } static crtype get(TupleT const& t) { return t.e; } }; ////////////////////////////////// template struct tuple_element<5, TupleT> { typedef typename TupleT::f_type type; typedef typename impl::access::type rtype; typedef typename impl::access::ctype crtype; static rtype get(TupleT& t) { return t.f; } static crtype get(TupleT const& t) { return t.f; } }; #if PHOENIX_LIMIT > 6 ////////////////////////////////// template struct tuple_element<6, TupleT> { typedef typename TupleT::g_type type; typedef typename impl::access::type rtype; typedef typename impl::access::ctype crtype; static rtype get(TupleT& t) { return t.g; } static crtype get(TupleT const& t) { return t.g; } }; ////////////////////////////////// template struct tuple_element<7, TupleT> { typedef typename TupleT::h_type type; typedef typename impl::access::type rtype; typedef typename impl::access::ctype crtype; static rtype get(TupleT& t) { return t.h; } static crtype get(TupleT const& t) { return t.h; } }; ////////////////////////////////// template struct tuple_element<8, TupleT> { typedef typename TupleT::i_type type; typedef typename impl::access::type rtype; typedef typename impl::access::ctype crtype; static rtype get(TupleT& t) { return t.i; } static crtype get(TupleT const& t) { return t.i; } }; #if PHOENIX_LIMIT > 9 ////////////////////////////////// template struct tuple_element<9, TupleT> { typedef typename TupleT::j_type type; typedef typename impl::access::type rtype; typedef typename impl::access::ctype crtype; static rtype get(TupleT& t) { return t.j; } static crtype get(TupleT const& t) { return t.j; } }; ////////////////////////////////// template struct tuple_element<10, TupleT> { typedef typename TupleT::k_type type; typedef typename impl::access::type rtype; typedef typename impl::access::ctype crtype; static rtype get(TupleT& t) { return t.k; } static crtype get(TupleT const& t) { return t.k; } }; ////////////////////////////////// template struct tuple_element<11, TupleT> { typedef typename TupleT::l_type type; typedef typename impl::access::type rtype; typedef typename impl::access::ctype crtype; static rtype get(TupleT& t) { return t.l; } static crtype get(TupleT const& t) { return t.l; } }; #if PHOENIX_LIMIT > 12 ////////////////////////////////// template struct tuple_element<12, TupleT> { typedef typename TupleT::m_type type; typedef typename impl::access::type rtype; typedef typename impl::access::ctype crtype; static rtype get(TupleT& t) { return t.m; } static crtype get(TupleT const& t) { return t.m; } }; ////////////////////////////////// template struct tuple_element<13, TupleT> { typedef typename TupleT::n_type type; typedef typename impl::access::type rtype; typedef typename impl::access::ctype crtype; static rtype get(TupleT& t) { return t.n; } static crtype get(TupleT const& t) { return t.n; } }; ////////////////////////////////// template struct tuple_element<14, TupleT> { typedef typename TupleT::o_type type; typedef typename impl::access::type rtype; typedef typename impl::access::ctype crtype; static rtype get(TupleT& t) { return t.o; } static crtype get(TupleT const& t) { return t.o; } }; #endif #endif #endif #endif /////////////////////////////////////////////////////////////////////////////// // // tuple forward declaration. // /////////////////////////////////////////////////////////////////////////////// template < typename A = nil_t , typename B = nil_t , typename C = nil_t #if PHOENIX_LIMIT > 3 , typename D = nil_t , typename E = nil_t , typename F = nil_t #if PHOENIX_LIMIT > 6 , typename G = nil_t , typename H = nil_t , typename I = nil_t #if PHOENIX_LIMIT > 9 , typename J = nil_t , typename K = nil_t , typename L = nil_t #if PHOENIX_LIMIT > 12 , typename M = nil_t , typename N = nil_t , typename O = nil_t #endif #endif #endif #endif , typename NU = nil_t // Not used > struct tuple; /////////////////////////////////////////////////////////////////////////////// // // tuple_index // // This class wraps an integer in a type to be used for indexing // the Nth element in a tuple. See tuple operator[]. Some // predefined names are provided in sub-namespace // tuple_index_names. // /////////////////////////////////////////////////////////////////////////////// template struct tuple_index {}; ////////////////////////////////// namespace tuple_index_names { tuple_index<0> const _1 = tuple_index<0>(); tuple_index<1> const _2 = tuple_index<1>(); tuple_index<2> const _3 = tuple_index<2>(); #if PHOENIX_LIMIT > 3 tuple_index<3> const _4 = tuple_index<3>(); tuple_index<4> const _5 = tuple_index<4>(); tuple_index<5> const _6 = tuple_index<5>(); #if PHOENIX_LIMIT > 6 tuple_index<6> const _7 = tuple_index<6>(); tuple_index<7> const _8 = tuple_index<7>(); tuple_index<8> const _9 = tuple_index<8>(); #if PHOENIX_LIMIT > 9 tuple_index<9> const _10 = tuple_index<9>(); tuple_index<10> const _11 = tuple_index<10>(); tuple_index<11> const _12 = tuple_index<11>(); #if PHOENIX_LIMIT > 12 tuple_index<12> const _13 = tuple_index<12>(); tuple_index<13> const _14 = tuple_index<13>(); tuple_index<14> const _15 = tuple_index<14>(); #endif #endif #endif #endif } /////////////////////////////////////////////////////////////////////////////// // // tuple_common class // /////////////////////////////////////////////////////////////////////////////// template struct tuple_base { typedef nil_t a_type; typedef nil_t b_type; typedef nil_t c_type; #if PHOENIX_LIMIT > 3 typedef nil_t d_type; typedef nil_t e_type; typedef nil_t f_type; #if PHOENIX_LIMIT > 6 typedef nil_t g_type; typedef nil_t h_type; typedef nil_t i_type; #if PHOENIX_LIMIT > 9 typedef nil_t j_type; typedef nil_t k_type; typedef nil_t l_type; #if PHOENIX_LIMIT > 12 typedef nil_t m_type; typedef nil_t n_type; typedef nil_t o_type; #endif #endif #endif #endif template typename tuple_element::crtype operator[](tuple_index) const { return tuple_element ::get(*static_cast(this)); } template typename tuple_element::rtype operator[](tuple_index) { return tuple_element ::get(*static_cast(this)); } }; /////////////////////////////////////////////////////////////////////////////// // // tuple <0 member> class // /////////////////////////////////////////////////////////////////////////////// template <> struct tuple<> : public tuple_base > { BOOST_STATIC_CONSTANT(int, length = 0); }; /////////////////////////////////////////////////////////////////////////////// // // tuple <1 member> class // /////////////////////////////////////////////////////////////////////////////// template struct tuple 3 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 6 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 9 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 12 nil_t, nil_t, nil_t, #endif #endif #endif #endif nil_t // Unused > : public tuple_base > { BOOST_STATIC_CONSTANT(int, length = 1); typedef A a_type; tuple() {} tuple( typename call_traits::param_type a_ ): a(a_) {} template tuple(TupleT const& init) : a(init[tuple_index<0>()]) { BOOST_STATIC_ASSERT(TupleT::length == length); } A a; }; /////////////////////////////////////////////////////////////////////////////// // // tuple <2 member> class // /////////////////////////////////////////////////////////////////////////////// template struct tuple 3 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 6 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 9 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 12 nil_t, nil_t, nil_t, #endif #endif #endif #endif nil_t // Unused > : public tuple_base > { BOOST_STATIC_CONSTANT(int, length = 2); typedef A a_type; typedef B b_type; tuple() {} tuple( typename call_traits::param_type a_, typename call_traits::param_type b_ ): a(a_), b(b_) {} template tuple(TupleT const& init) : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]) { BOOST_STATIC_ASSERT(TupleT::length == length); } A a; B b; }; /////////////////////////////////////////////////////////////////////////////// // // tuple <3 member> class // /////////////////////////////////////////////////////////////////////////////// template struct tuple 3 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 6 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 9 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 12 nil_t, nil_t, nil_t, #endif #endif #endif #endif nil_t // Unused > : public tuple_base > { BOOST_STATIC_CONSTANT(int, length = 3); typedef A a_type; typedef B b_type; typedef C c_type; tuple() {} tuple( typename call_traits::param_type a_, typename call_traits::param_type b_, typename call_traits::param_type c_ ): a(a_), b(b_), c(c_) {} template tuple(TupleT const& init) : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]), c(init[tuple_index<2>()]) { BOOST_STATIC_ASSERT(TupleT::length == length); } A a; B b; C c; }; #if PHOENIX_LIMIT > 3 /////////////////////////////////////////////////////////////////////////////// // // tuple <4 member> class // /////////////////////////////////////////////////////////////////////////////// template struct tuple 6 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 9 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 12 nil_t, nil_t, nil_t, #endif #endif #endif nil_t // Unused > : public tuple_base > { BOOST_STATIC_CONSTANT(int, length = 4); typedef A a_type; typedef B b_type; typedef C c_type; typedef D d_type; tuple() {} tuple( typename call_traits::param_type a_, typename call_traits::param_type b_, typename call_traits::param_type c_, typename call_traits::param_type d_ ): a(a_), b(b_), c(c_), d(d_) {} template tuple(TupleT const& init) : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]), c(init[tuple_index<2>()]), d(init[tuple_index<3>()]) { BOOST_STATIC_ASSERT(TupleT::length == length); } A a; B b; C c; D d; }; /////////////////////////////////////////////////////////////////////////////// // // tuple <5 member> class // /////////////////////////////////////////////////////////////////////////////// template struct tuple 6 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 9 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 12 nil_t, nil_t, nil_t, #endif #endif #endif nil_t // Unused > : public tuple_base > { BOOST_STATIC_CONSTANT(int, length = 5); typedef A a_type; typedef B b_type; typedef C c_type; typedef D d_type; typedef E e_type; tuple() {} tuple( typename call_traits::param_type a_, typename call_traits::param_type b_, typename call_traits::param_type c_, typename call_traits::param_type d_, typename call_traits::param_type e_ ): a(a_), b(b_), c(c_), d(d_), e(e_) {} template tuple(TupleT const& init) : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]), c(init[tuple_index<2>()]), d(init[tuple_index<3>()]), e(init[tuple_index<4>()]) { BOOST_STATIC_ASSERT(TupleT::length == length); } A a; B b; C c; D d; E e; }; /////////////////////////////////////////////////////////////////////////////// // // tuple <6 member> class // /////////////////////////////////////////////////////////////////////////////// template < typename A, typename B, typename C, typename D, typename E, typename F> struct tuple 6 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 9 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 12 nil_t, nil_t, nil_t, #endif #endif #endif nil_t // Unused > : public tuple_base > { BOOST_STATIC_CONSTANT(int, length = 6); typedef A a_type; typedef B b_type; typedef C c_type; typedef D d_type; typedef E e_type; typedef F f_type; tuple() {} tuple( typename call_traits::param_type a_, typename call_traits::param_type b_, typename call_traits::param_type c_, typename call_traits::param_type d_, typename call_traits::param_type e_, typename call_traits::param_type f_ ): a(a_), b(b_), c(c_), d(d_), e(e_), f(f_) {} template tuple(TupleT const& init) : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]), c(init[tuple_index<2>()]), d(init[tuple_index<3>()]), e(init[tuple_index<4>()]), f(init[tuple_index<5>()]) { BOOST_STATIC_ASSERT(TupleT::length == length); } A a; B b; C c; D d; E e; F f; }; #if PHOENIX_LIMIT > 6 /////////////////////////////////////////////////////////////////////////////// // // tuple <7 member> class // /////////////////////////////////////////////////////////////////////////////// template < typename A, typename B, typename C, typename D, typename E, typename F, typename G> struct tuple 9 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 12 nil_t, nil_t, nil_t, #endif #endif nil_t // Unused > : public tuple_base > { BOOST_STATIC_CONSTANT(int, length = 7); typedef A a_type; typedef B b_type; typedef C c_type; typedef D d_type; typedef E e_type; typedef F f_type; typedef G g_type; tuple() {} tuple( typename call_traits::param_type a_, typename call_traits::param_type b_, typename call_traits::param_type c_, typename call_traits::param_type d_, typename call_traits::param_type e_, typename call_traits::param_type f_, typename call_traits::param_type g_ ): a(a_), b(b_), c(c_), d(d_), e(e_), f(f_), g(g_) {} template tuple(TupleT const& init) : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]), c(init[tuple_index<2>()]), d(init[tuple_index<3>()]), e(init[tuple_index<4>()]), f(init[tuple_index<5>()]), g(init[tuple_index<6>()]) { BOOST_STATIC_ASSERT(TupleT::length == length); } A a; B b; C c; D d; E e; F f; G g; }; /////////////////////////////////////////////////////////////////////////////// // // tuple <8 member> class // /////////////////////////////////////////////////////////////////////////////// template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H> struct tuple 9 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 12 nil_t, nil_t, nil_t, #endif #endif nil_t // Unused > : public tuple_base > { BOOST_STATIC_CONSTANT(int, length = 8); typedef A a_type; typedef B b_type; typedef C c_type; typedef D d_type; typedef E e_type; typedef F f_type; typedef G g_type; typedef H h_type; tuple() {} tuple( typename call_traits::param_type a_, typename call_traits::param_type b_, typename call_traits::param_type c_, typename call_traits::param_type d_, typename call_traits::param_type e_, typename call_traits::param_type f_, typename call_traits::param_type g_, typename call_traits::param_type h_ ): a(a_), b(b_), c(c_), d(d_), e(e_), f(f_), g(g_), h(h_) {} template tuple(TupleT const& init) : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]), c(init[tuple_index<2>()]), d(init[tuple_index<3>()]), e(init[tuple_index<4>()]), f(init[tuple_index<5>()]), g(init[tuple_index<6>()]), h(init[tuple_index<7>()]) { BOOST_STATIC_ASSERT(TupleT::length == length); } A a; B b; C c; D d; E e; F f; G g; H h; }; /////////////////////////////////////////////////////////////////////////////// // // tuple <9 member> class // /////////////////////////////////////////////////////////////////////////////// template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I> struct tuple 9 nil_t, nil_t, nil_t, #if PHOENIX_LIMIT > 12 nil_t, nil_t, nil_t, #endif #endif nil_t // Unused > : public tuple_base > { BOOST_STATIC_CONSTANT(int, length = 9); typedef A a_type; typedef B b_type; typedef C c_type; typedef D d_type; typedef E e_type; typedef F f_type; typedef G g_type; typedef H h_type; typedef I i_type; tuple() {} tuple( typename call_traits::param_type a_, typename call_traits::param_type b_, typename call_traits::param_type c_, typename call_traits::param_type d_, typename call_traits::param_type e_, typename call_traits::param_type f_, typename call_traits::param_type g_, typename call_traits::param_type h_, typename call_traits::param_type i_ ): a(a_), b(b_), c(c_), d(d_), e(e_), f(f_), g(g_), h(h_), i(i_) {} template tuple(TupleT const& init) : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]), c(init[tuple_index<2>()]), d(init[tuple_index<3>()]), e(init[tuple_index<4>()]), f(init[tuple_index<5>()]), g(init[tuple_index<6>()]), h(init[tuple_index<7>()]), i(init[tuple_index<8>()]) { BOOST_STATIC_ASSERT(TupleT::length == length); } A a; B b; C c; D d; E e; F f; G g; H h; I i; }; #if PHOENIX_LIMIT > 9 /////////////////////////////////////////////////////////////////////////////// // // tuple <10 member> class // /////////////////////////////////////////////////////////////////////////////// template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J> struct tuple 12 nil_t, nil_t, nil_t, #endif nil_t // Unused > : public tuple_base > { BOOST_STATIC_CONSTANT(int, length = 10); typedef A a_type; typedef B b_type; typedef C c_type; typedef D d_type; typedef E e_type; typedef F f_type; typedef G g_type; typedef H h_type; typedef I i_type; typedef J j_type; tuple() {} tuple( typename call_traits::param_type a_, typename call_traits::param_type b_, typename call_traits::param_type c_, typename call_traits::param_type d_, typename call_traits::param_type e_, typename call_traits::param_type f_, typename call_traits::param_type g_, typename call_traits::param_type h_, typename call_traits::param_type i_, typename call_traits::param_type j_ ): a(a_), b(b_), c(c_), d(d_), e(e_), f(f_), g(g_), h(h_), i(i_), j(j_) {} template tuple(TupleT const& init) : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]), c(init[tuple_index<2>()]), d(init[tuple_index<3>()]), e(init[tuple_index<4>()]), f(init[tuple_index<5>()]), g(init[tuple_index<6>()]), h(init[tuple_index<7>()]), i(init[tuple_index<8>()]), j(init[tuple_index<9>()]) { BOOST_STATIC_ASSERT(TupleT::length == length); } A a; B b; C c; D d; E e; F f; G g; H h; I i; J j; }; /////////////////////////////////////////////////////////////////////////////// // // tuple <11 member> class // /////////////////////////////////////////////////////////////////////////////// template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K> struct tuple 12 nil_t, nil_t, nil_t, #endif nil_t // Unused > : public tuple_base > { BOOST_STATIC_CONSTANT(int, length = 11); typedef A a_type; typedef B b_type; typedef C c_type; typedef D d_type; typedef E e_type; typedef F f_type; typedef G g_type; typedef H h_type; typedef I i_type; typedef J j_type; typedef K k_type; tuple() {} tuple( typename call_traits::param_type a_, typename call_traits::param_type b_, typename call_traits::param_type c_, typename call_traits::param_type d_, typename call_traits::param_type e_, typename call_traits::param_type f_, typename call_traits::param_type g_, typename call_traits::param_type h_, typename call_traits::param_type i_, typename call_traits::param_type j_, typename call_traits::param_type k_ ): a(a_), b(b_), c(c_), d(d_), e(e_), f(f_), g(g_), h(h_), i(i_), j(j_), k(k_) {} template tuple(TupleT const& init) : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]), c(init[tuple_index<2>()]), d(init[tuple_index<3>()]), e(init[tuple_index<4>()]), f(init[tuple_index<5>()]), g(init[tuple_index<6>()]), h(init[tuple_index<7>()]), i(init[tuple_index<8>()]), j(init[tuple_index<9>()]), k(init[tuple_index<10>()]) { BOOST_STATIC_ASSERT(TupleT::length == length); } A a; B b; C c; D d; E e; F f; G g; H h; I i; J j; K k; }; /////////////////////////////////////////////////////////////////////////////// // // tuple <12 member> class // /////////////////////////////////////////////////////////////////////////////// template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L> struct tuple 12 nil_t, nil_t, nil_t, #endif nil_t // Unused > : public tuple_base > { BOOST_STATIC_CONSTANT(int, length = 12); typedef A a_type; typedef B b_type; typedef C c_type; typedef D d_type; typedef E e_type; typedef F f_type; typedef G g_type; typedef H h_type; typedef I i_type; typedef J j_type; typedef K k_type; typedef L l_type; tuple() {} tuple( typename call_traits::param_type a_, typename call_traits::param_type b_, typename call_traits::param_type c_, typename call_traits::param_type d_, typename call_traits::param_type e_, typename call_traits::param_type f_, typename call_traits::param_type g_, typename call_traits::param_type h_, typename call_traits::param_type i_, typename call_traits::param_type j_, typename call_traits::param_type k_, typename call_traits::param_type l_ ): a(a_), b(b_), c(c_), d(d_), e(e_), f(f_), g(g_), h(h_), i(i_), j(j_), k(k_), l(l_) {} template tuple(TupleT const& init) : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]), c(init[tuple_index<2>()]), d(init[tuple_index<3>()]), e(init[tuple_index<4>()]), f(init[tuple_index<5>()]), g(init[tuple_index<6>()]), h(init[tuple_index<7>()]), i(init[tuple_index<8>()]), j(init[tuple_index<9>()]), k(init[tuple_index<10>()]), l(init[tuple_index<11>()]) { BOOST_STATIC_ASSERT(TupleT::length == length); } A a; B b; C c; D d; E e; F f; G g; H h; I i; J j; K k; L l; }; #if PHOENIX_LIMIT > 12 /////////////////////////////////////////////////////////////////////////////// // // tuple <13 member> class // /////////////////////////////////////////////////////////////////////////////// template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L, typename M> struct tuple : public tuple_base< tuple > { BOOST_STATIC_CONSTANT(int, length = 13); typedef A a_type; typedef B b_type; typedef C c_type; typedef D d_type; typedef E e_type; typedef F f_type; typedef G g_type; typedef H h_type; typedef I i_type; typedef J j_type; typedef K k_type; typedef L l_type; typedef M m_type; tuple() {} tuple( typename call_traits::param_type a_, typename call_traits::param_type b_, typename call_traits::param_type c_, typename call_traits::param_type d_, typename call_traits::param_type e_, typename call_traits::param_type f_, typename call_traits::param_type g_, typename call_traits::param_type h_, typename call_traits::param_type i_, typename call_traits::param_type j_, typename call_traits::param_type k_, typename call_traits::param_type l_, typename call_traits::param_type m_ ): a(a_), b(b_), c(c_), d(d_), e(e_), f(f_), g(g_), h(h_), i(i_), j(j_), k(k_), l(l_), m(m_) {} template tuple(TupleT const& init) : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]), c(init[tuple_index<2>()]), d(init[tuple_index<3>()]), e(init[tuple_index<4>()]), f(init[tuple_index<5>()]), g(init[tuple_index<6>()]), h(init[tuple_index<7>()]), i(init[tuple_index<8>()]), j(init[tuple_index<9>()]), k(init[tuple_index<10>()]), l(init[tuple_index<11>()]), m(init[tuple_index<12>()]) { BOOST_STATIC_ASSERT(TupleT::length == length); } A a; B b; C c; D d; E e; F f; G g; H h; I i; J j; K k; L l; M m; }; /////////////////////////////////////////////////////////////////////////////// // // tuple <14 member> class // /////////////////////////////////////////////////////////////////////////////// template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L, typename M, typename N> struct tuple : public tuple_base< tuple > { BOOST_STATIC_CONSTANT(int, length = 14); typedef A a_type; typedef B b_type; typedef C c_type; typedef D d_type; typedef E e_type; typedef F f_type; typedef G g_type; typedef H h_type; typedef I i_type; typedef J j_type; typedef K k_type; typedef L l_type; typedef M m_type; typedef N n_type; tuple() {} tuple( typename call_traits::param_type a_, typename call_traits::param_type b_, typename call_traits::param_type c_, typename call_traits::param_type d_, typename call_traits::param_type e_, typename call_traits::param_type f_, typename call_traits::param_type g_, typename call_traits::param_type h_, typename call_traits::param_type i_, typename call_traits::param_type j_, typename call_traits::param_type k_, typename call_traits::param_type l_, typename call_traits::param_type m_, typename call_traits::param_type n_ ): a(a_), b(b_), c(c_), d(d_), e(e_), f(f_), g(g_), h(h_), i(i_), j(j_), k(k_), l(l_), m(m_), n(n_) {} template tuple(TupleT const& init) : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]), c(init[tuple_index<2>()]), d(init[tuple_index<3>()]), e(init[tuple_index<4>()]), f(init[tuple_index<5>()]), g(init[tuple_index<6>()]), h(init[tuple_index<7>()]), i(init[tuple_index<8>()]), j(init[tuple_index<9>()]), k(init[tuple_index<10>()]), l(init[tuple_index<11>()]), m(init[tuple_index<12>()]), n(init[tuple_index<13>()]) { BOOST_STATIC_ASSERT(TupleT::length == length); } A a; B b; C c; D d; E e; F f; G g; H h; I i; J j; K k; L l; M m; N n; }; /////////////////////////////////////////////////////////////////////////////// // // tuple <15 member> class // /////////////////////////////////////////////////////////////////////////////// template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L, typename M, typename N, typename O> struct tuple : public tuple_base< tuple > { BOOST_STATIC_CONSTANT(int, length = 15); typedef A a_type; typedef B b_type; typedef C c_type; typedef D d_type; typedef E e_type; typedef F f_type; typedef G g_type; typedef H h_type; typedef I i_type; typedef J j_type; typedef K k_type; typedef L l_type; typedef M m_type; typedef N n_type; typedef O o_type; tuple() {} tuple( typename call_traits::param_type a_, typename call_traits::param_type b_, typename call_traits::param_type c_, typename call_traits::param_type d_, typename call_traits::param_type e_, typename call_traits::param_type f_, typename call_traits::param_type g_, typename call_traits::param_type h_, typename call_traits::param_type i_, typename call_traits::param_type j_, typename call_traits::param_type k_, typename call_traits::param_type l_, typename call_traits::param_type m_, typename call_traits::param_type n_, typename call_traits::param_type o_ ): a(a_), b(b_), c(c_), d(d_), e(e_), f(f_), g(g_), h(h_), i(i_), j(j_), k(k_), l(l_), m(m_), n(n_), o(o_) {} template tuple(TupleT const& init) : a(init[tuple_index<0>()]), b(init[tuple_index<1>()]), c(init[tuple_index<2>()]), d(init[tuple_index<3>()]), e(init[tuple_index<4>()]), f(init[tuple_index<5>()]), g(init[tuple_index<6>()]), h(init[tuple_index<7>()]), i(init[tuple_index<8>()]), j(init[tuple_index<9>()]), k(init[tuple_index<10>()]), l(init[tuple_index<11>()]), m(init[tuple_index<12>()]), n(init[tuple_index<13>()]), o(init[tuple_index<14>()]) { BOOST_STATIC_ASSERT(TupleT::length == length); } A a; B b; C c; D d; E e; F f; G g; H h; I i; J j; K k; L l; M m; N n; O o; }; #endif #endif #endif #endif #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400) #pragma warning(pop) #endif /////////////////////////////////////////////////////////////////////////////// } // namespace phoenix #endif