| /*============================================================================= |
| 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 <typename T> void if_(T) {} |
| template <typename T> void for_(T) {} |
| template <typename T> void while_(T) {} |
| template <typename T> 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 <typename T> struct if_ {}; |
| template <typename T> struct for_ {}; |
| template <typename T> struct while_ {}; |
| template <typename T> struct do_ {}; |
| } |
| |
| }} // namespace phoenix::borland_only |
| #endif |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| #include <boost/static_assert.hpp> |
| #include <boost/call_traits.hpp> |
| #include <boost/type_traits/remove_reference.hpp> |
| |
| #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<int, char> t1_t; |
| // typedef tuple<int, std::string, double> 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<double, double> t3(t1); // OK. Compatible tuples |
| // tuple<double, double> 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> _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<N, T>::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 <typename T> |
| struct access { |
| |
| typedef const T& ctype; |
| typedef T& type; |
| }; |
| |
| template <typename T> |
| struct access<T&> { |
| |
| typedef T& ctype; |
| typedef T& type; |
| }; |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // tuple_element |
| // |
| // A query class that gets the Nth element inside a tuple. |
| // Examples: |
| // |
| // tuple_element<1, tuple<int, char, void*> >::type // plain |
| // tuple_element<1, tuple<int, char, void*> >::rtype // ref |
| // tuple_element<1, tuple<int, char, void*> >::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<N, |
| // TupleT>::get(tuple) gets the Nth element in the tuple. The |
| // tuple class' tuple::operator[] uses this to get its Nth |
| // element. |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| template <int N, typename TupleT> |
| 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 <typename TupleT> |
| struct tuple_element<0, TupleT> |
| { |
| typedef typename TupleT::a_type type; |
| typedef typename impl::access<type>::type rtype; |
| typedef typename impl::access<type>::ctype crtype; |
| |
| static rtype get(TupleT& t) { return t.a; } |
| static crtype get(TupleT const& t) { return t.a; } |
| }; |
| |
| ////////////////////////////////// |
| template <typename TupleT> |
| struct tuple_element<1, TupleT> |
| { |
| typedef typename TupleT::b_type type; |
| typedef typename impl::access<type>::type rtype; |
| typedef typename impl::access<type>::ctype crtype; |
| |
| static rtype get(TupleT& t) { return t.b; } |
| static crtype get(TupleT const& t) { return t.b; } |
| }; |
| |
| ////////////////////////////////// |
| template <typename TupleT> |
| struct tuple_element<2, TupleT> |
| { |
| typedef typename TupleT::c_type type; |
| typedef typename impl::access<type>::type rtype; |
| typedef typename impl::access<type>::ctype crtype; |
| |
| static rtype get(TupleT& t) { return t.c; } |
| static crtype get(TupleT const& t) { return t.c; } |
| }; |
| |
| #if PHOENIX_LIMIT > 3 |
| ////////////////////////////////// |
| template <typename TupleT> |
| struct tuple_element<3, TupleT> |
| { |
| typedef typename TupleT::d_type type; |
| typedef typename impl::access<type>::type rtype; |
| typedef typename impl::access<type>::ctype crtype; |
| |
| static rtype get(TupleT& t) { return t.d; } |
| static crtype get(TupleT const& t) { return t.d; } |
| }; |
| |
| ////////////////////////////////// |
| template <typename TupleT> |
| struct tuple_element<4, TupleT> |
| { |
| typedef typename TupleT::e_type type; |
| typedef typename impl::access<type>::type rtype; |
| typedef typename impl::access<type>::ctype crtype; |
| |
| static rtype get(TupleT& t) { return t.e; } |
| static crtype get(TupleT const& t) { return t.e; } |
| }; |
| |
| ////////////////////////////////// |
| template <typename TupleT> |
| struct tuple_element<5, TupleT> |
| { |
| typedef typename TupleT::f_type type; |
| typedef typename impl::access<type>::type rtype; |
| typedef typename impl::access<type>::ctype crtype; |
| |
| static rtype get(TupleT& t) { return t.f; } |
| static crtype get(TupleT const& t) { return t.f; } |
| }; |
| |
| #if PHOENIX_LIMIT > 6 |
| ////////////////////////////////// |
| template <typename TupleT> |
| struct tuple_element<6, TupleT> |
| { |
| typedef typename TupleT::g_type type; |
| typedef typename impl::access<type>::type rtype; |
| typedef typename impl::access<type>::ctype crtype; |
| |
| static rtype get(TupleT& t) { return t.g; } |
| static crtype get(TupleT const& t) { return t.g; } |
| }; |
| |
| ////////////////////////////////// |
| template <typename TupleT> |
| struct tuple_element<7, TupleT> |
| { |
| typedef typename TupleT::h_type type; |
| typedef typename impl::access<type>::type rtype; |
| typedef typename impl::access<type>::ctype crtype; |
| |
| static rtype get(TupleT& t) { return t.h; } |
| static crtype get(TupleT const& t) { return t.h; } |
| }; |
| |
| ////////////////////////////////// |
| template <typename TupleT> |
| struct tuple_element<8, TupleT> |
| { |
| typedef typename TupleT::i_type type; |
| typedef typename impl::access<type>::type rtype; |
| typedef typename impl::access<type>::ctype crtype; |
| |
| static rtype get(TupleT& t) { return t.i; } |
| static crtype get(TupleT const& t) { return t.i; } |
| }; |
| |
| #if PHOENIX_LIMIT > 9 |
| ////////////////////////////////// |
| template <typename TupleT> |
| struct tuple_element<9, TupleT> |
| { |
| typedef typename TupleT::j_type type; |
| typedef typename impl::access<type>::type rtype; |
| typedef typename impl::access<type>::ctype crtype; |
| |
| static rtype get(TupleT& t) { return t.j; } |
| static crtype get(TupleT const& t) { return t.j; } |
| }; |
| |
| ////////////////////////////////// |
| template <typename TupleT> |
| struct tuple_element<10, TupleT> |
| { |
| typedef typename TupleT::k_type type; |
| typedef typename impl::access<type>::type rtype; |
| typedef typename impl::access<type>::ctype crtype; |
| |
| static rtype get(TupleT& t) { return t.k; } |
| static crtype get(TupleT const& t) { return t.k; } |
| }; |
| |
| ////////////////////////////////// |
| template <typename TupleT> |
| struct tuple_element<11, TupleT> |
| { |
| typedef typename TupleT::l_type type; |
| typedef typename impl::access<type>::type rtype; |
| typedef typename impl::access<type>::ctype crtype; |
| |
| static rtype get(TupleT& t) { return t.l; } |
| static crtype get(TupleT const& t) { return t.l; } |
| }; |
| |
| #if PHOENIX_LIMIT > 12 |
| ////////////////////////////////// |
| template <typename TupleT> |
| struct tuple_element<12, TupleT> |
| { |
| typedef typename TupleT::m_type type; |
| typedef typename impl::access<type>::type rtype; |
| typedef typename impl::access<type>::ctype crtype; |
| |
| static rtype get(TupleT& t) { return t.m; } |
| static crtype get(TupleT const& t) { return t.m; } |
| }; |
| |
| ////////////////////////////////// |
| template <typename TupleT> |
| struct tuple_element<13, TupleT> |
| { |
| typedef typename TupleT::n_type type; |
| typedef typename impl::access<type>::type rtype; |
| typedef typename impl::access<type>::ctype crtype; |
| |
| static rtype get(TupleT& t) { return t.n; } |
| static crtype get(TupleT const& t) { return t.n; } |
| }; |
| |
| ////////////////////////////////// |
| template <typename TupleT> |
| struct tuple_element<14, TupleT> |
| { |
| typedef typename TupleT::o_type type; |
| typedef typename impl::access<type>::type rtype; |
| typedef typename impl::access<type>::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 <int N> |
| 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 <typename DerivedT> |
| 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 <int N> |
| typename tuple_element<N, DerivedT>::crtype |
| operator[](tuple_index<N>) const |
| { |
| return tuple_element<N, DerivedT> |
| ::get(*static_cast<DerivedT const*>(this)); |
| } |
| |
| template <int N> |
| typename tuple_element<N, DerivedT>::rtype |
| operator[](tuple_index<N>) |
| { |
| return tuple_element<N, DerivedT> |
| ::get(*static_cast<DerivedT*>(this)); |
| } |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // tuple <0 member> class |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| template <> |
| struct tuple<> |
| : public tuple_base<tuple<> > { |
| |
| BOOST_STATIC_CONSTANT(int, length = 0); |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // tuple <1 member> class |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| template <typename A> |
| struct tuple<A, nil_t, nil_t, |
| #if PHOENIX_LIMIT > 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<tuple<A> > { |
| |
| BOOST_STATIC_CONSTANT(int, length = 1); |
| typedef A a_type; |
| |
| tuple() {} |
| |
| tuple( |
| typename call_traits<A>::param_type a_ |
| ): a(a_) {} |
| |
| template <typename TupleT> |
| tuple(TupleT const& init) |
| : a(init[tuple_index<0>()]) |
| { BOOST_STATIC_ASSERT(TupleT::length == length); } |
| |
| A a; |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // tuple <2 member> class |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| template <typename A, typename B> |
| struct tuple<A, B, nil_t, |
| #if PHOENIX_LIMIT > 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<tuple<A, B> > { |
| |
| BOOST_STATIC_CONSTANT(int, length = 2); |
| typedef A a_type; typedef B b_type; |
| |
| tuple() {} |
| |
| tuple( |
| typename call_traits<A>::param_type a_, |
| typename call_traits<B>::param_type b_ |
| ): a(a_), b(b_) {} |
| |
| template <typename TupleT> |
| 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 <typename A, typename B, typename C> |
| struct tuple<A, B, C, |
| #if PHOENIX_LIMIT > 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<tuple<A, B, C> > { |
| |
| BOOST_STATIC_CONSTANT(int, length = 3); |
| typedef A a_type; typedef B b_type; |
| typedef C c_type; |
| |
| tuple() {} |
| |
| tuple( |
| typename call_traits<A>::param_type a_, |
| typename call_traits<B>::param_type b_, |
| typename call_traits<C>::param_type c_ |
| ): a(a_), b(b_), c(c_) {} |
| |
| template <typename TupleT> |
| 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 <typename A, typename B, typename C, typename D> |
| struct tuple<A, B, C, D, 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 |
| nil_t // Unused |
| > |
| : public tuple_base<tuple<A, B, C, D> > { |
| |
| 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<A>::param_type a_, |
| typename call_traits<B>::param_type b_, |
| typename call_traits<C>::param_type c_, |
| typename call_traits<D>::param_type d_ |
| ): a(a_), b(b_), c(c_), d(d_) {} |
| |
| template <typename TupleT> |
| 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 <typename A, typename B, typename C, typename D, typename E> |
| struct tuple<A, B, C, D, E, 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 |
| nil_t // Unused |
| > |
| : public tuple_base<tuple<A, B, C, D, E> > { |
| |
| 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<A>::param_type a_, |
| typename call_traits<B>::param_type b_, |
| typename call_traits<C>::param_type c_, |
| typename call_traits<D>::param_type d_, |
| typename call_traits<E>::param_type e_ |
| ): a(a_), b(b_), c(c_), d(d_), e(e_) {} |
| |
| template <typename TupleT> |
| 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<A, B, C, D, E, F, |
| #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 |
| nil_t // Unused |
| > |
| : public tuple_base<tuple<A, B, C, D, E, F> > { |
| |
| 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<A>::param_type a_, |
| typename call_traits<B>::param_type b_, |
| typename call_traits<C>::param_type c_, |
| typename call_traits<D>::param_type d_, |
| typename call_traits<E>::param_type e_, |
| typename call_traits<F>::param_type f_ |
| ): a(a_), b(b_), c(c_), d(d_), e(e_), |
| f(f_) {} |
| |
| template <typename TupleT> |
| 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<A, B, C, D, E, F, G, 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 |
| nil_t // Unused |
| > |
| : public tuple_base<tuple<A, B, C, D, E, F, G> > { |
| |
| 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<A>::param_type a_, |
| typename call_traits<B>::param_type b_, |
| typename call_traits<C>::param_type c_, |
| typename call_traits<D>::param_type d_, |
| typename call_traits<E>::param_type e_, |
| typename call_traits<F>::param_type f_, |
| typename call_traits<G>::param_type g_ |
| ): a(a_), b(b_), c(c_), d(d_), e(e_), |
| f(f_), g(g_) {} |
| |
| template <typename TupleT> |
| 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<A, B, C, D, E, F, G, H, nil_t, |
| #if PHOENIX_LIMIT > 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<tuple<A, B, C, D, E, F, G, H> > { |
| |
| 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<A>::param_type a_, |
| typename call_traits<B>::param_type b_, |
| typename call_traits<C>::param_type c_, |
| typename call_traits<D>::param_type d_, |
| typename call_traits<E>::param_type e_, |
| typename call_traits<F>::param_type f_, |
| typename call_traits<G>::param_type g_, |
| typename call_traits<H>::param_type h_ |
| ): a(a_), b(b_), c(c_), d(d_), e(e_), |
| f(f_), g(g_), h(h_) {} |
| |
| template <typename TupleT> |
| 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<A, B, C, D, E, F, G, H, I, |
| #if PHOENIX_LIMIT > 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<tuple<A, B, C, D, E, F, G, H, I> > { |
| |
| 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<A>::param_type a_, |
| typename call_traits<B>::param_type b_, |
| typename call_traits<C>::param_type c_, |
| typename call_traits<D>::param_type d_, |
| typename call_traits<E>::param_type e_, |
| typename call_traits<F>::param_type f_, |
| typename call_traits<G>::param_type g_, |
| typename call_traits<H>::param_type h_, |
| typename call_traits<I>::param_type i_ |
| ): a(a_), b(b_), c(c_), d(d_), e(e_), |
| f(f_), g(g_), h(h_), i(i_) {} |
| |
| template <typename TupleT> |
| 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<A, B, C, D, E, F, G, H, I, J, nil_t, nil_t, |
| #if PHOENIX_LIMIT > 12 |
| nil_t, nil_t, nil_t, |
| #endif |
| nil_t // Unused |
| > |
| : public tuple_base<tuple<A, B, C, D, E, F, G, H, I, J> > { |
| |
| 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<A>::param_type a_, |
| typename call_traits<B>::param_type b_, |
| typename call_traits<C>::param_type c_, |
| typename call_traits<D>::param_type d_, |
| typename call_traits<E>::param_type e_, |
| typename call_traits<F>::param_type f_, |
| typename call_traits<G>::param_type g_, |
| typename call_traits<H>::param_type h_, |
| typename call_traits<I>::param_type i_, |
| typename call_traits<J>::param_type j_ |
| ): a(a_), b(b_), c(c_), d(d_), e(e_), |
| f(f_), g(g_), h(h_), i(i_), j(j_) {} |
| |
| template <typename TupleT> |
| 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<A, B, C, D, E, F, G, H, I, J, K, nil_t, |
| #if PHOENIX_LIMIT > 12 |
| nil_t, nil_t, nil_t, |
| #endif |
| nil_t // Unused |
| > |
| : public tuple_base<tuple<A, B, C, D, E, F, G, H, I, J, K> > { |
| |
| 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<A>::param_type a_, |
| typename call_traits<B>::param_type b_, |
| typename call_traits<C>::param_type c_, |
| typename call_traits<D>::param_type d_, |
| typename call_traits<E>::param_type e_, |
| typename call_traits<F>::param_type f_, |
| typename call_traits<G>::param_type g_, |
| typename call_traits<H>::param_type h_, |
| typename call_traits<I>::param_type i_, |
| typename call_traits<J>::param_type j_, |
| typename call_traits<K>::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 <typename TupleT> |
| 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<A, B, C, D, E, F, G, H, I, J, K, L, |
| #if PHOENIX_LIMIT > 12 |
| nil_t, nil_t, nil_t, |
| #endif |
| nil_t // Unused |
| > |
| : public tuple_base<tuple<A, B, C, D, E, F, G, H, I, J, K, L> > { |
| |
| 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<A>::param_type a_, |
| typename call_traits<B>::param_type b_, |
| typename call_traits<C>::param_type c_, |
| typename call_traits<D>::param_type d_, |
| typename call_traits<E>::param_type e_, |
| typename call_traits<F>::param_type f_, |
| typename call_traits<G>::param_type g_, |
| typename call_traits<H>::param_type h_, |
| typename call_traits<I>::param_type i_, |
| typename call_traits<J>::param_type j_, |
| typename call_traits<K>::param_type k_, |
| typename call_traits<L>::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 <typename TupleT> |
| 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<A, B, C, D, E, F, G, H, I, J, K, L, M, nil_t, nil_t, nil_t> |
| : public tuple_base< |
| tuple<A, B, C, D, E, F, G, H, I, J, K, L, M> > { |
| |
| 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<A>::param_type a_, |
| typename call_traits<B>::param_type b_, |
| typename call_traits<C>::param_type c_, |
| typename call_traits<D>::param_type d_, |
| typename call_traits<E>::param_type e_, |
| typename call_traits<F>::param_type f_, |
| typename call_traits<G>::param_type g_, |
| typename call_traits<H>::param_type h_, |
| typename call_traits<I>::param_type i_, |
| typename call_traits<J>::param_type j_, |
| typename call_traits<K>::param_type k_, |
| typename call_traits<L>::param_type l_, |
| typename call_traits<M>::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 <typename TupleT> |
| 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<A, B, C, D, E, F, G, H, I, J, K, L, M, N, nil_t, nil_t> |
| : public tuple_base< |
| tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N> > { |
| |
| 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<A>::param_type a_, |
| typename call_traits<B>::param_type b_, |
| typename call_traits<C>::param_type c_, |
| typename call_traits<D>::param_type d_, |
| typename call_traits<E>::param_type e_, |
| typename call_traits<F>::param_type f_, |
| typename call_traits<G>::param_type g_, |
| typename call_traits<H>::param_type h_, |
| typename call_traits<I>::param_type i_, |
| typename call_traits<J>::param_type j_, |
| typename call_traits<K>::param_type k_, |
| typename call_traits<L>::param_type l_, |
| typename call_traits<M>::param_type m_, |
| typename call_traits<N>::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 <typename TupleT> |
| 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<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, nil_t> |
| : public tuple_base< |
| tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O> > { |
| |
| 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<A>::param_type a_, |
| typename call_traits<B>::param_type b_, |
| typename call_traits<C>::param_type c_, |
| typename call_traits<D>::param_type d_, |
| typename call_traits<E>::param_type e_, |
| typename call_traits<F>::param_type f_, |
| typename call_traits<G>::param_type g_, |
| typename call_traits<H>::param_type h_, |
| typename call_traits<I>::param_type i_, |
| typename call_traits<J>::param_type j_, |
| typename call_traits<K>::param_type k_, |
| typename call_traits<L>::param_type l_, |
| typename call_traits<M>::param_type m_, |
| typename call_traits<N>::param_type n_, |
| typename call_traits<O>::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 <typename TupleT> |
| 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 |