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 + -
显示快捷键?