📄 tuple_helpers.hpp
字号:
/*=============================================================================
Phoenix V1.2.1
Copyright (c) 2002 Joel de Guzman
Copyright (c) 2002-2003 Hartmut Kaiser
Use, modification and distribution is subject to 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/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 type
template <>
struct make_tuple<nil_t> {
typedef tuple<> type;
};
///////////////////////////////////////////////////////////////////////////////
// tuple types are left alone without any refactoring
template <
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 <
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -