os/ossrv/ossrv_pub/boost_apis/boost/python/detail/signature.hpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 #if !defined(BOOST_PP_IS_ITERATING)
     2 
     3 // Copyright David Abrahams 2002.
     4 // Distributed under the Boost Software License, Version 1.0. (See
     5 // accompanying file LICENSE_1_0.txt or copy at
     6 // http://www.boost.org/LICENSE_1_0.txt)
     7 
     8 # ifndef SIGNATURE_DWA20021121_HPP
     9 #  define SIGNATURE_DWA20021121_HPP
    10 
    11 #  include <boost/python/type_id.hpp>
    12 
    13 #  include <boost/python/detail/preprocessor.hpp>
    14 #  include <boost/python/detail/indirect_traits.hpp>
    15 
    16 #  include <boost/preprocessor/iterate.hpp>
    17 #  include <boost/preprocessor/iteration/local.hpp>
    18 
    19 #  include <boost/mpl/at.hpp>
    20 #  include <boost/mpl/size.hpp>
    21 
    22 namespace boost { namespace python { namespace detail { 
    23 
    24 struct signature_element
    25 {
    26     char const* basename;
    27     bool lvalue;
    28 };
    29 
    30 template <unsigned> struct signature_arity;
    31 
    32 #  define BOOST_PP_ITERATION_PARAMS_1                                            \
    33         (3, (0, BOOST_PYTHON_MAX_ARITY + 1, <boost/python/detail/signature.hpp>))
    34 #  include BOOST_PP_ITERATE()
    35 
    36 // A metafunction returning the base class used for
    37 //
    38 //   signature<class F, class CallPolicies, class Sig>.
    39 //
    40 template <class Sig>
    41 struct signature_base_select
    42 {
    43     enum { arity = mpl::size<Sig>::value - 1 };
    44     typedef typename signature_arity<arity>::template impl<Sig> type;
    45 };
    46 
    47 template <class Sig>
    48 struct signature
    49     : signature_base_select<Sig>::type
    50 {
    51 };
    52 
    53 }}} // namespace boost::python::detail
    54 
    55 # endif // SIGNATURE_DWA20021121_HPP
    56 
    57 #else
    58 
    59 # define N BOOST_PP_ITERATION()
    60 
    61 template <>
    62 struct signature_arity<N>
    63 {
    64     template <class Sig>
    65     struct impl
    66     {
    67         static signature_element const* elements()
    68         {
    69             static signature_element const result[N+2] = {
    70                 
    71 # define BOOST_PP_LOCAL_MACRO(i)                                                            \
    72      {                                                                                      \
    73          type_id<BOOST_DEDUCED_TYPENAME mpl::at_c<Sig,i>::type>().name()                    \
    74          , indirect_traits::is_reference_to_non_const<BOOST_DEDUCED_TYPENAME mpl::at_c<Sig,i>::type>::value \
    75      },
    76                 
    77 # define BOOST_PP_LOCAL_LIMITS (0, N)
    78 # include BOOST_PP_LOCAL_ITERATE()
    79                 {0,0}
    80             };
    81             return result;
    82         }
    83     };
    84 };
    85 
    86 #endif // BOOST_PP_IS_ITERATING 
    87 
    88