#ifndef BOOST_PP_IS_ITERATING // Copyright David Abrahams 2002. // 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 TYPE_LIST_IMPL_NO_PTS_DWA2002913_HPP # define TYPE_LIST_IMPL_NO_PTS_DWA2002913_HPP # include # include # include # include # include # include # include # include namespace boost { namespace python { namespace detail { template< typename T > struct is_list_arg { enum { value = true }; }; template<> struct is_list_arg { enum { value = false }; }; template struct type_list_impl_chooser; # define BOOST_PYTHON_LIST_ACTUAL_PARAMS BOOST_PP_ENUM_PARAMS_Z(1,BOOST_PYTHON_LIST_SIZE,T) # define BOOST_PYTHON_LIST_FORMAL_PARAMS BOOST_PP_ENUM_PARAMS_Z(1,BOOST_PYTHON_LIST_SIZE,class T) # define BOOST_PP_ITERATION_PARAMS_1 \ (3, (0, BOOST_PYTHON_LIST_SIZE, )) # include BOOST_PP_ITERATE() # define BOOST_PYTHON_PLUS() + # define BOOST_PYTHON_IS_LIST_ARG(z, n, data) \ BOOST_PP_IF(n, BOOST_PYTHON_PLUS, BOOST_PP_EMPTY)() \ is_list_arg< BOOST_PP_CAT(T,n) >::value template< BOOST_PYTHON_LIST_FORMAL_PARAMS > struct type_list_count_args { enum { value = BOOST_PP_REPEAT_1(BOOST_PYTHON_LIST_SIZE, BOOST_PYTHON_IS_LIST_ARG, _) }; }; template< BOOST_PYTHON_LIST_FORMAL_PARAMS > struct type_list_impl { typedef type_list_count_args< BOOST_PYTHON_LIST_ACTUAL_PARAMS > arg_num_; typedef typename detail::type_list_impl_chooser< arg_num_::value > ::template result_< BOOST_PYTHON_LIST_ACTUAL_PARAMS >::type type; }; template< BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_PYTHON_LIST_SIZE, class T, mpl::void_) > struct type_list : detail::type_list_impl< BOOST_PYTHON_LIST_ACTUAL_PARAMS >::type { typedef typename detail::type_list_impl< BOOST_PYTHON_LIST_ACTUAL_PARAMS >::type type; }; # undef BOOST_PYTHON_IS_LIST_ARG # undef BOOST_PYTHON_PLUS # undef BOOST_PYTHON_LIST_FORMAL_PARAMS # undef BOOST_PYTHON_LIST_ACTUAL_PARAMS }}} // namespace boost::python::detail # endif // TYPE_LIST_IMPL_NO_PTS_DWA2002913_HPP #else // BOOST_PP_IS_ITERATING # define N BOOST_PP_ITERATION() template<> struct type_list_impl_chooser { template< BOOST_PYTHON_LIST_FORMAL_PARAMS > struct result_ { typedef typename BOOST_PP_CAT(mpl::vector,N)< BOOST_PP_ENUM_PARAMS(N, T) >::type type; }; }; # undef N #endif // BOOST_PP_IS_ITERATING