| #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 <boost/python/detail/type_list.hpp> |
| |
| # include <boost/preprocessor/enum_params.hpp> |
| # include <boost/preprocessor/enum_params_with_a_default.hpp> |
| # include <boost/preprocessor/cat.hpp> |
| # include <boost/preprocessor/repeat.hpp> |
| # include <boost/preprocessor/empty.hpp> |
| # include <boost/preprocessor/iterate.hpp> |
| # include <boost/mpl/void.hpp> |
| |
| namespace boost { namespace python { namespace detail { |
| |
| template< typename T > |
| struct is_list_arg |
| { |
| enum { value = true }; |
| }; |
| |
| template<> |
| struct is_list_arg<mpl::void_> |
| { |
| enum { value = false }; |
| }; |
| |
| template<int> 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, <boost/python/detail/type_list_impl_no_pts.hpp>)) |
| # 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<N> |
| { |
| 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 |