📄 tuple_helpers.hpp
字号:
typename A, typename B, typename C, typename D, typename E, typename F,
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 declaration
namespace impl
{
template <unsigned N>
struct convert_actors_ {};
}
template <typename TupleResultT, typename ActorTupleT>
TupleResultT
convert_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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -