123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- #if !defined(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 SIGNATURE_DWA20021121_HPP
- # define SIGNATURE_DWA20021121_HPP
- # include <boost/python/type_id.hpp>
- # include <boost/python/detail/preprocessor.hpp>
- # include <boost/python/detail/indirect_traits.hpp>
- # include <boost/python/converter/pytype_function.hpp>
- # include <boost/preprocessor/iterate.hpp>
- # include <boost/preprocessor/iteration/local.hpp>
- # include <boost/mpl/at.hpp>
- # include <boost/mpl/size.hpp>
- namespace boost { namespace python { namespace detail {
- struct signature_element
- {
- char const* basename;
- converter::pytype_function pytype_f;
- bool lvalue;
- };
- struct py_func_sig_info
- {
- signature_element const *signature;
- signature_element const *ret;
- };
- template <unsigned> struct signature_arity;
- # define BOOST_PP_ITERATION_PARAMS_1 \
- (3, (0, BOOST_PYTHON_MAX_ARITY + 1, <boost/python/detail/signature.hpp>))
- # include BOOST_PP_ITERATE()
- // A metafunction returning the base class used for
- //
- // signature<class F, class CallPolicies, class Sig>.
- //
- template <class Sig>
- struct signature_base_select
- {
- enum { arity = mpl::size<Sig>::value - 1 };
- typedef typename signature_arity<arity>::template impl<Sig> type;
- };
- template <class Sig>
- struct signature
- : signature_base_select<Sig>::type
- {
- };
- }}} // namespace boost::python::detail
- # endif // SIGNATURE_DWA20021121_HPP
- #else
- # define N BOOST_PP_ITERATION()
- template <>
- struct signature_arity<N>
- {
- template <class Sig>
- struct impl
- {
- static signature_element const* elements()
- {
- static signature_element const result[N+2] = {
-
- #ifndef BOOST_PYTHON_NO_PY_SIGNATURES
- # define BOOST_PP_LOCAL_MACRO(i) \
- { \
- type_id<BOOST_DEDUCED_TYPENAME mpl::at_c<Sig,i>::type>().name() \
- , &converter::expected_pytype_for_arg<BOOST_DEDUCED_TYPENAME mpl::at_c<Sig,i>::type>::get_pytype \
- , indirect_traits::is_reference_to_non_const<BOOST_DEDUCED_TYPENAME mpl::at_c<Sig,i>::type>::value \
- },
- #else
- # define BOOST_PP_LOCAL_MACRO(i) \
- { \
- type_id<BOOST_DEDUCED_TYPENAME mpl::at_c<Sig,i>::type>().name() \
- , 0 \
- , indirect_traits::is_reference_to_non_const<BOOST_DEDUCED_TYPENAME mpl::at_c<Sig,i>::type>::value \
- },
- #endif
-
- # define BOOST_PP_LOCAL_LIMITS (0, N)
- # include BOOST_PP_LOCAL_ITERATE()
- {0,0,0}
- };
- return result;
- }
- };
- };
- #endif // BOOST_PP_IS_ITERATING
|