diff --git a/include/boost/python/detail/signature.hpp b/include/boost/python/detail/signature.hpp new file mode 100644 index 00000000..354e54dc --- /dev/null +++ b/include/boost/python/detail/signature.hpp @@ -0,0 +1,98 @@ +#if !defined(BOOST_PP_IS_ITERATING) + +// Copyright David Abrahams 2002. Permission to copy, use, +// modify, sell and distribute this software is granted provided this +// copyright notice appears in all copies. This software is provided +// "as is" without express or implied warranty, and with no claim as +// to its suitability for any purpose. + +# ifndef SIGNATURE_DWA20021121_HPP +# define SIGNATURE_DWA20021121_HPP + +# include +# include + +# include +# include +# include +# include +# include +# include +# include +# include + +# include + +# include +# include +# include + +# include +# include +# include + +namespace boost { namespace python { namespace detail { + +struct signature_element +{ + char const* basename; + bool lvalue; +}; + +template struct signature_arity; + +# define BOOST_PP_ITERATION_PARAMS_1 \ + (3, (0, BOOST_PYTHON_MAX_ARITY + 1, )) +# include BOOST_PP_ITERATE() + +// A metafunction returning the base class used for signature. +template +struct signature_base_select +{ + enum { arity = mpl::size::value - 1 }; + typedef typename signature_arity::template impl type; +}; + +template +struct signature + : signature_base_select::type +{ +}; + +}}} // namespace boost::python::detail + +# endif // SIGNATURE_DWA20021121_HPP + +#else + +# define N BOOST_PP_ITERATION() + +template <> +struct signature_arity +{ + template + struct impl + { + static signature_element const* elements() + { + static signature_element const result[N+2] = { + +# define BOOST_PP_LOCAL_MACRO(i) \ + { \ + type_id::type>().name() \ + , is_reference_to_non_const::type>::value \ + }, + +# define BOOST_PP_LOCAL_LIMITS (0, N) +# include BOOST_PP_LOCAL_ITERATE() + {0,0} + }; + return result; + } + }; +}; + +#endif // BOOST_PP_IS_ITERATING + +