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