tuple_helpers.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 1,076 行 · 第 1/3 页

HPP
1,076
字号
/*=============================================================================    Phoenix V1.2.1    Copyright (c) 2002 Joel de Guzman    Copyright (c) 2002-2003 Hartmut Kaiser  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_TUPLEHELPERS_HPP#define PHOENIX_TUPLEHELPERS_HPP///////////////////////////////////////////////////////////////////////////////#include <cassert>#include <boost/spirit/home/classic/phoenix/tuples.hpp>///////////////////////////////////////////////////////////////////////////////namespace phoenix{///////////////////////////////////////////////////////////////////////////////////  make_tuple template class////      This template class is used to calculate a tuple type required to hold//      the given template parameter type//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  normal (non-tuple types are wrapped into a tuple)template <typename ResultT>struct make_tuple {    typedef tuple<ResultT> type;};/////////////////////////////////////////////////////////////////////////////////  nil_t is converted to an empty tuple typetemplate <>struct make_tuple<nil_t> {    typedef tuple<> type;};/////////////////////////////////////////////////////////////////////////////////  tuple types are left alone without any refactoringtemplate <      typename A, typename B, typename C#if PHOENIX_LIMIT > 3    , typename D, typename E, typename F#if PHOENIX_LIMIT > 6    , typename G, typename H, typename I#if PHOENIX_LIMIT > 9    , typename J, typename K, typename L#if PHOENIX_LIMIT > 12    , typename M, typename N, typename O#endif#endif#endif#endif>struct make_tuple<tuple<A, B, C#if PHOENIX_LIMIT > 3    , D, E, F#if PHOENIX_LIMIT > 6    , G, H, I#if PHOENIX_LIMIT > 9    , J, K, L#if PHOENIX_LIMIT > 12    , M, N, O#endif#endif#endif#endif    > > {// the tuple parameter itself is the required tuple type    typedef tuple<A, B, C#if PHOENIX_LIMIT > 3        , D, E, F#if PHOENIX_LIMIT > 6        , G, H, I#if PHOENIX_LIMIT > 9        , J, K, L#if PHOENIX_LIMIT > 12        , M, N, O#endif#endif#endif#endif        > type;};///////////////////////////////////////////////////////////////////////////////////  concat_tuple type computer////      This class returns the type of a tuple, which is constructed by//      concatenating a tuple with a given type/////////////////////////////////////////////////////////////////////////////////template <typename TupleT, typename AppendT>struct concat_tuple;///////////////////////////////////////////////////////////////////////////////////  concat tuple <0 member> class/////////////////////////////////////////////////////////////////////////////////template <typename AppendT>struct concat_tuple<tuple<>, AppendT> {    typedef tuple<AppendT> type;};template <>struct concat_tuple<tuple<>, nil_t> {    typedef tuple<> type;};///////////////////////////////////////////////////////////////////////////////////  concat tuple <1 member> class/////////////////////////////////////////////////////////////////////////////////template <typename A, typename AppendT>struct concat_tuple<tuple<A>, AppendT> {    typedef tuple<A, AppendT> type;};template <typename A>struct concat_tuple<tuple<A>, nil_t> {    typedef tuple<A> type;};///////////////////////////////////////////////////////////////////////////////////  concat tuple <2 member> class/////////////////////////////////////////////////////////////////////////////////template <typename A, typename B, typename AppendT>struct concat_tuple<tuple<A, B>, AppendT> {    typedef tuple<A, B, AppendT> type;};template <typename A, typename B>struct concat_tuple<tuple<A, B>, nil_t> {    typedef tuple<A, B> type;};#if PHOENIX_LIMIT > 3///////////////////////////////////////////////////////////////////////////////////  concat tuple <3 member> class/////////////////////////////////////////////////////////////////////////////////template <    typename A, typename B, typename C,    typename AppendT>struct concat_tuple<tuple<A, B, C>, AppendT> {    typedef tuple<A, B, C, AppendT> type;};template <    typename A, typename B, typename C>struct concat_tuple<tuple<A, B, C>, nil_t> {    typedef tuple<A, B, C> type;};///////////////////////////////////////////////////////////////////////////////////  concat tuple <4 member> class/////////////////////////////////////////////////////////////////////////////////template <    typename A, typename B, typename C, typename D,    typename AppendT>struct concat_tuple<tuple<A, B, C, D>, AppendT> {    typedef tuple<A, B, C, D, AppendT> type;};template <    typename A, typename B, typename C, typename D>struct concat_tuple<tuple<A, B, C, D>, nil_t> {    typedef tuple<A, B, C, D> type;};///////////////////////////////////////////////////////////////////////////////////  concat tuple <5 member> class/////////////////////////////////////////////////////////////////////////////////template <    typename A, typename B, typename C, typename D, typename E,    typename AppendT>struct concat_tuple<tuple<A, B, C, D, E>, AppendT> {    typedef tuple<A, B, C, D, E, AppendT> type;};template <    typename A, typename B, typename C, typename D, typename E>struct concat_tuple<tuple<A, B, C, D, E>, nil_t> {    typedef tuple<A, B, C, D, E> type;};#if PHOENIX_LIMIT > 6///////////////////////////////////////////////////////////////////////////////////  concat tuple <6 member> class/////////////////////////////////////////////////////////////////////////////////template <    typename A, typename B, typename C, typename D, typename E, typename F,    typename AppendT>struct concat_tuple<tuple<A, B, C, D, E, F>, AppendT> {    typedef tuple<A, B, C, D, E, F, AppendT> type;};template <    typename A, typename B, typename C, typename D, typename E, typename F>struct concat_tuple<tuple<A, B, C, D, E, F>, nil_t> {    typedef tuple<A, B, C, D, E, F> type;};///////////////////////////////////////////////////////////////////////////////////  concat tuple <7 member> class/////////////////////////////////////////////////////////////////////////////////template <    typename A, typename B, typename C, typename D, typename E, typename F,    typename G,    typename AppendT>struct concat_tuple<tuple<A, B, C, D, E, F, G>, AppendT> {    typedef tuple<A, B, C, D, E, F, G, AppendT> type;};template <    typename A, typename B, typename C, typename D, typename E, typename F,    typename G>struct concat_tuple<tuple<A, B, C, D, E, F, G>, nil_t> {    typedef tuple<A, B, C, D, E, F, G> type;};///////////////////////////////////////////////////////////////////////////////////  concat tuple <8 member> class/////////////////////////////////////////////////////////////////////////////////template <    typename A, typename B, typename C, typename D, typename E, typename F,    typename G, typename H,    typename AppendT>struct concat_tuple<tuple<A, B, C, D, E, F, G, H>, AppendT> {    typedef tuple<A, B, C, D, E, F, G, H, AppendT> type;};template <    typename A, typename B, typename C, typename D, typename E, typename F,    typename G, typename H>struct concat_tuple<tuple<A, B, C, D, E, F, G, H>, nil_t> {    typedef tuple<A, B, C, D, E, F, G, H> type;};#if PHOENIX_LIMIT > 9///////////////////////////////////////////////////////////////////////////////////  concat tuple <9 member> class/////////////////////////////////////////////////////////////////////////////////template <    typename A, typename B, typename C, typename D, typename E, typename F,    typename G, typename H, typename I,    typename AppendT>struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I>, AppendT> {    typedef tuple<A, B, C, D, E, F, G, H, I, AppendT> type;};template <    typename A, typename B, typename C, typename D, typename E, typename F,    typename G, typename H, typename I>struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I>, nil_t> {    typedef tuple<A, B, C, D, E, F, G, H, I> type;};///////////////////////////////////////////////////////////////////////////////////  concat 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,    typename AppendT>struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J>, AppendT> {    typedef tuple<A, B, C, D, E, F, G, H, I, J, AppendT> type;};template <    typename A, typename B, typename C, typename D, typename E, typename F,    typename G, typename H, typename I, typename J>struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J>, nil_t> {    typedef tuple<A, B, C, D, E, F, G, H, I, J> type;};///////////////////////////////////////////////////////////////////////////////////  concat 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,    typename AppendT>struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K>, AppendT> {    typedef tuple<A, B, C, D, E, F, G, H, I, J, K, AppendT> type;};template <    typename A, typename B, typename C, typename D, typename E, typename F,

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?