You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
1338 lines
42 KiB
1338 lines
42 KiB
/*============================================================================= |
|
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
|
|
|