tuple_helpers.hpp

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

HPP
1,076
字号
    typename G, typename H, typename I, typename J, typename K>struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K>, nil_t> {    typedef tuple<A, B, C, D, E, F, G, H, I, J, K> type;};#if PHOENIX_LIMIT > 12///////////////////////////////////////////////////////////////////////////////////  concat 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,    typename AppendT>struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L>, AppendT> {    typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, AppendT> type;};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 concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L>, nil_t> {    typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L> type;};///////////////////////////////////////////////////////////////////////////////////  concat 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,    typename AppendT>struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M>, AppendT> {    typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, AppendT> type;};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 concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M>, nil_t> {    typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M> type;};///////////////////////////////////////////////////////////////////////////////////  concat 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,    typename AppendT>struct concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N>, AppendT> {    typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N, AppendT> type;};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 concat_tuple<tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N>, nil_t> {    typedef tuple<A, B, C, D, E, F, G, H, I, J, K, L, M, N> type;};#endif#endif#endif#endif///////////////////////////////////////////////////////////////////////////////////  concat_tuples type computer////      This template class returns the type of a tuple built from the//      concatenation of two given tuples./////////////////////////////////////////////////////////////////////////////////template <typename TupleT1, typename TupleT2, int N, typename AppendT>struct concat_tuple_element {    typedef        typename concat_tuple_element<                typename concat_tuple<TupleT1, AppendT>::type, TupleT2, N+1,                typename tuple_element<N+1, TupleT2>::type            >::type        type;};template <typename TupleT1, typename TupleT2, int N>struct concat_tuple_element<TupleT1, TupleT2, N, nil_t> {    typedef TupleT1 type;};template <typename TupleT1, typename TupleT2>struct concat_tuples {    typedef        typename concat_tuple_element<                TupleT1, TupleT2, 0,                typename tuple_element<0, TupleT2>::type            >::type        type;};///////////////////////////////////////////////////////////////////////////////////  convert_actors template function////      The convert_actors template functions constructs a new tuple object//      composed of the elements returned by the actors contained in the//      input tuple. (i.e. the given tuple type 'actor_tuple' contains a set//      of actors to evaluate and the resulting tuple contains the results of//      evaluating the actors.)/////////////////////////////////////////////////////////////////////////////////template <typename ActorT, typename TupleT>struct actor_result; // forward declarationnamespace impl{    template <unsigned N>    struct convert_actors_ {};}template <typename TupleResultT, typename ActorTupleT>TupleResultTconvert_actors(ActorTupleT const& actor_tuple){    BOOST_STATIC_ASSERT(ActorTupleT::length <= TupleResultT::length);    BOOST_STATIC_CONSTANT(int, length = TupleResultT::length);    return impl::convert_actors_<length>        ::template apply<TupleResultT, ActorTupleT>::do_(actor_tuple);}namespace impl{    template <int N, typename TupleResultT, typename ActorTupleT>    struct convert_actor    {        typedef typename tuple_element<N, TupleResultT>::type type;        template <bool C>        struct is_default_t {};        typedef is_default_t<true>  is_default;        typedef is_default_t<false> is_not_default;        static type        actor_element(ActorTupleT const& /*actor_tuple*/, is_default)        {            return type(); // default construct        }        static type        actor_element(ActorTupleT const& actor_tuple, is_not_default)        {            BOOST_STATIC_ASSERT(ActorTupleT::length <= TupleResultT::length);            return actor_tuple[tuple_index<N>()](); // apply the actor        }        static type        do_(ActorTupleT const& actor_tuple)        {            return actor_element(                actor_tuple, is_default_t<(N >= ActorTupleT::length)>());        }    };    ///////////////////////////////////////    template <>    struct convert_actors_<1>    {        template <typename TupleResultT, typename ActorTupleT>        struct apply        {            static TupleResultT            do_(ActorTupleT const& actor_tuple)            {                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;                return TupleResultT(                    converter0::do_(actor_tuple)                );            }        };    };    ///////////////////////////////////////    template <>    struct convert_actors_<2>    {        template <typename TupleResultT, typename ActorTupleT>        struct apply        {            static TupleResultT            do_(ActorTupleT const& actor_tuple)            {                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;                using namespace tuple_index_names;                return TupleResultT(                        converter0::do_(actor_tuple)                    ,   converter1::do_(actor_tuple)                );            }        };    };    ///////////////////////////////////////    template <>    struct convert_actors_<3>    {        template <typename TupleResultT, typename ActorTupleT>        struct apply        {            static TupleResultT            do_(ActorTupleT const& actor_tuple)            {                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;                using namespace tuple_index_names;                return TupleResultT(                        converter0::do_(actor_tuple)                    ,   converter1::do_(actor_tuple)                    ,   converter2::do_(actor_tuple)                );            }        };    };    #if PHOENIX_LIMIT > 3    /////////////////////////////////////    template <>    struct convert_actors_<4>    {        template <typename TupleResultT, typename ActorTupleT>        struct apply        {            static TupleResultT            do_(ActorTupleT const& actor_tuple)            {                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;                using namespace tuple_index_names;                return TupleResultT(                        converter0::do_(actor_tuple)                    ,   converter1::do_(actor_tuple)                    ,   converter2::do_(actor_tuple)                    ,   converter3::do_(actor_tuple)                );            }        };    };    /////////////////////////////////////    template <>    struct convert_actors_<5>    {        template <typename TupleResultT, typename ActorTupleT>        struct apply        {            static TupleResultT            do_(ActorTupleT const& actor_tuple)            {                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;                typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;                using namespace tuple_index_names;                return TupleResultT(                        converter0::do_(actor_tuple)                    ,   converter1::do_(actor_tuple)                    ,   converter2::do_(actor_tuple)                    ,   converter3::do_(actor_tuple)                    ,   converter4::do_(actor_tuple)                );            }        };    };    /////////////////////////////////////    template <>    struct convert_actors_<6>    {        template <typename TupleResultT, typename ActorTupleT>        struct apply        {            static TupleResultT            do_(ActorTupleT const& actor_tuple)            {                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;                typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;                typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;                using namespace tuple_index_names;                return TupleResultT(                        converter0::do_(actor_tuple)                    ,   converter1::do_(actor_tuple)                    ,   converter2::do_(actor_tuple)                    ,   converter3::do_(actor_tuple)                    ,   converter4::do_(actor_tuple)                    ,   converter5::do_(actor_tuple)                );            }        };    };    #if PHOENIX_LIMIT > 6    /////////////////////////////////////    template <>    struct convert_actors_<7>    {        template <typename TupleResultT, typename ActorTupleT>        struct apply        {            static TupleResultT            do_(ActorTupleT const& actor_tuple)            {                typedef impl::convert_actor<0, TupleResultT, ActorTupleT> converter0;                typedef impl::convert_actor<1, TupleResultT, ActorTupleT> converter1;                typedef impl::convert_actor<2, TupleResultT, ActorTupleT> converter2;                typedef impl::convert_actor<3, TupleResultT, ActorTupleT> converter3;                typedef impl::convert_actor<4, TupleResultT, ActorTupleT> converter4;                typedef impl::convert_actor<5, TupleResultT, ActorTupleT> converter5;                typedef impl::convert_actor<6, TupleResultT, ActorTupleT> converter6;

⌨️ 快捷键说明

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