📄 tuples.hpp
字号:
// 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -