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