1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306 |
- /*=============================================================================
- 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 BOOST_SPIRIT_CLASSIC_PHOENIX_TUPLES_HPP
- #define BOOST_SPIRIT_CLASSIC_PHOENIX_TUPLES_HPP
- ///////////////////////////////////////////////////////////////////////////////
- //
- // 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
- ///////////////////////////////////////////////////////////////////////////////
- #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
- // bogus https://developercommunity.visualstudio.com/t/buggy-warning-c4709/471956
- #pragma warning(disable:4709) //comma operator within array index expression
- #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&) { 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
|