ossrv_pub/boost_apis/boost/python/def.hpp
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     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