os/ossrv/ossrv_pub/boost_apis/boost/python/def.hpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright David Abrahams 2002.
     2 // Distributed under the Boost Software License, Version 1.0. (See
     3 // accompanying file LICENSE_1_0.txt or copy at
     4 // http://www.boost.org/LICENSE_1_0.txt)
     5 #ifndef DEF_DWA200292_HPP
     6 # define DEF_DWA200292_HPP
     7 
     8 # include <boost/python/detail/prefix.hpp>
     9 
    10 # include <boost/python/object_fwd.hpp>
    11 # include <boost/python/make_function.hpp>
    12 # include <boost/python/detail/def_helper.hpp>
    13 # include <boost/python/detail/overloads_fwd.hpp>
    14 # include <boost/python/scope.hpp>
    15 # include <boost/python/signature.hpp>
    16 # include <boost/python/detail/scope.hpp>
    17 
    18 namespace boost { namespace python {
    19 
    20 namespace detail
    21 {
    22   namespace error
    23   {
    24     // Compile-time error messages
    25     template <bool> struct multiple_functions_passed_to_def;
    26     template <> struct multiple_functions_passed_to_def<false> { typedef char type; };
    27   }
    28   
    29   //
    30   // def_from_helper --
    31   //
    32   // Use a def_helper to define a regular wrapped function in the current scope.
    33   template <class F, class Helper>
    34   void def_from_helper(
    35       char const* name, F const& fn, Helper const& helper)
    36   {
    37       // Must not try to use default implementations except with method definitions.
    38       typedef typename error::multiple_functions_passed_to_def<
    39           Helper::has_default_implementation
    40           >::type assertion;
    41       
    42       detail::scope_setattr_doc(
    43           name, boost::python::make_function(
    44               fn
    45               , helper.policies()
    46               , helper.keywords())
    47           , helper.doc()
    48           );
    49   }
    50 
    51   //
    52   // These two overloads discriminate between def() as applied to
    53   // regular functions and def() as applied to the result of
    54   // BOOST_PYTHON_FUNCTION_OVERLOADS(). The final argument is used to
    55   // discriminate.
    56   //
    57   template <class Fn, class A1>
    58   void
    59   def_maybe_overloads(
    60       char const* name
    61       , Fn fn
    62       , A1 const& a1
    63       , ...)
    64   {
    65       detail::def_from_helper(name, fn, def_helper<A1>(a1));
    66   }
    67 
    68   template <class StubsT, class SigT>
    69   void def_maybe_overloads(
    70       char const* name
    71       , SigT sig
    72       , StubsT const& stubs
    73       , detail::overloads_base const*)
    74   {
    75       scope current;
    76       
    77       detail::define_with_defaults(
    78           name, stubs, current, detail::get_signature(sig));
    79   }
    80 
    81   template <class T>
    82   object make_function1(T fn, ...) { return make_function(fn); }
    83 
    84   inline
    85   object make_function1(object const& x, object const*) { return x; }
    86 }
    87 
    88 template <class Fn>
    89 void def(char const* name, Fn fn)
    90 {
    91     detail::scope_setattr_doc(name, detail::make_function1(fn, &fn), 0);
    92 }
    93 
    94 template <class Arg1T, class Arg2T>
    95 void def(char const* name, Arg1T arg1, Arg2T const& arg2)
    96 {
    97     detail::def_maybe_overloads(name, arg1, arg2, &arg2);
    98 }
    99 
   100 template <class F, class A1, class A2>
   101 void def(char const* name, F f, A1 const& a1, A2 const& a2)
   102 {
   103     detail::def_from_helper(name, f, detail::def_helper<A1,A2>(a1,a2));
   104 }
   105 
   106 template <class F, class A1, class A2, class A3>
   107 void def(char const* name, F f, A1 const& a1, A2 const& a2, A3 const& a3)
   108 {
   109     detail::def_from_helper(name, f, detail::def_helper<A1,A2,A3>(a1,a2,a3));
   110 }
   111 
   112 }} // namespace boost::python
   113 
   114 #endif // DEF_DWA200292_HPP