| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388 | /////////////////////////////////////////////////////////////////////////////////// Copyright David Abrahams 2002, Joel de Guzman, 2002.// Distributed under the Boost Software License, Version 1.0. (See// accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)/////////////////////////////////////////////////////////////////////////////////#ifndef DEFAULTS_GEN_JDG20020807_HPP#define DEFAULTS_GEN_JDG20020807_HPP#include <boost/python/detail/preprocessor.hpp>#include <boost/preprocessor/repeat.hpp>#include <boost/preprocessor/repeat_from_to.hpp>#include <boost/preprocessor/enum.hpp>#include <boost/preprocessor/enum_params.hpp>#include <boost/preprocessor/repetition/enum_binary_params.hpp>#include <boost/preprocessor/tuple.hpp>#include <boost/preprocessor/cat.hpp>#include <boost/preprocessor/arithmetic/sub.hpp>#include <boost/preprocessor/stringize.hpp>#include <boost/preprocessor/inc.hpp>#include <boost/preprocessor/empty.hpp>#include <boost/preprocessor/comma_if.hpp>#include <boost/config.hpp>#include <boost/mpl/begin_end.hpp>#include <boost/mpl/next.hpp>#include <boost/mpl/deref.hpp>#include <cstddef>namespace boost { namespace python {namespace detail{  // overloads_base is used as a base class for all function  // stubs. This class holds the doc_string of the stubs.  struct overloads_base  {      overloads_base(char const* doc_)          : m_doc(doc_) {}      overloads_base(char const* doc_, detail::keyword_range const& kw)          : m_doc(doc_), m_keywords(kw) {}      char const* doc_string() const      {          return m_doc;      }      detail::keyword_range const& keywords() const      {          return m_keywords;      }   private:      char const* m_doc;      detail::keyword_range m_keywords;  };  // overloads_proxy is generated by the overloads_common operator[] (see  // below). This class holds a user defined call policies of the stubs.  template <class CallPoliciesT, class OverloadsT>  struct overloads_proxy      : public overloads_base  {      typedef typename OverloadsT::non_void_return_type   non_void_return_type;      typedef typename OverloadsT::void_return_type       void_return_type;      overloads_proxy(          CallPoliciesT const& policies_          , char const* doc          , keyword_range const& kw          )          : overloads_base(doc, kw)            , policies(policies_)      {}      CallPoliciesT      call_policies() const      {          return policies;      }      CallPoliciesT policies;  };  // overloads_common is our default function stubs base class. This  // class returns the default_call_policies in its call_policies()  // member function.  It can generate a overloads_proxy however through  // its operator[]  template <class DerivedT>  struct overloads_common      : public overloads_base  {      overloads_common(char const* doc)          : overloads_base(doc) {}      overloads_common(char const* doc, keyword_range const& kw)          : overloads_base(doc, kw) {}      default_call_policies      call_policies() const      {          return default_call_policies();      }      template <class CallPoliciesT>      overloads_proxy<CallPoliciesT, DerivedT>      operator[](CallPoliciesT const& policies) const      {          return overloads_proxy<CallPoliciesT, DerivedT>(              policies, this->doc_string(), this->keywords());      }  };}}} // namespace boost::python::detail#define BOOST_PYTHON_TYPEDEF_GEN(z, index, data)                                \    typedef typename ::boost::mpl::next<BOOST_PP_CAT(iter, index)>::type        \        BOOST_PP_CAT(iter, BOOST_PP_INC(index));                                \    typedef typename ::boost::mpl::deref<BOOST_PP_CAT(iter, index)>::type       \        BOOST_PP_CAT(T, index);#define BOOST_PYTHON_FUNC_WRAPPER_GEN(z, index, data)                   \    static RT BOOST_PP_CAT(func_,                                       \        BOOST_PP_SUB_D(1, index, BOOST_PP_TUPLE_ELEM(3, 1, data))) (    \        BOOST_PP_ENUM_BINARY_PARAMS_Z(                                  \            1, index, T, arg))                                          \    {                                                                   \        BOOST_PP_TUPLE_ELEM(3, 2, data)                                 \        BOOST_PP_TUPLE_ELEM(3, 0, data)(                                \            BOOST_PP_ENUM_PARAMS(                                       \                index,                                                  \                arg));                                                  \    }#define BOOST_PYTHON_GEN_FUNCTION(fname, fstubs_name, n_args, n_dflts, ret)     \    struct fstubs_name                                                          \    {                                                                           \        BOOST_STATIC_CONSTANT(int, n_funcs = BOOST_PP_INC(n_dflts));            \        BOOST_STATIC_CONSTANT(int, max_args = n_funcs);                         \                                                                                \        template <typename SigT>                                                \        struct gen                                                              \        {                                                                       \            typedef typename ::boost::mpl::begin<SigT>::type rt_iter;           \            typedef typename ::boost::mpl::deref<rt_iter>::type RT;             \            typedef typename ::boost::mpl::next<rt_iter>::type iter0;           \                                                                                \            BOOST_PP_REPEAT_2ND(                                                \                n_args,                                                         \                BOOST_PYTHON_TYPEDEF_GEN,                                       \                0)                                                              \                                                                                \            BOOST_PP_REPEAT_FROM_TO_2(                                          \                BOOST_PP_SUB_D(1, n_args, n_dflts),                             \                BOOST_PP_INC(n_args),                                           \                BOOST_PYTHON_FUNC_WRAPPER_GEN,                                  \                (fname, BOOST_PP_SUB_D(1, n_args, n_dflts), ret))               \        };                                                                      \    };                                                                          \///////////////////////////////////////////////////////////////////////////////#define BOOST_PYTHON_MEM_FUNC_WRAPPER_GEN(z, index, data)                       \    static RT BOOST_PP_CAT(func_,                                               \        BOOST_PP_SUB_D(1, index, BOOST_PP_TUPLE_ELEM(3, 1, data))) (            \            ClassT obj BOOST_PP_COMMA_IF(index)                                 \            BOOST_PP_ENUM_BINARY_PARAMS_Z(1, index, T, arg)                     \        )                                                                       \    {                                                                           \        BOOST_PP_TUPLE_ELEM(3, 2, data) obj.BOOST_PP_TUPLE_ELEM(3, 0, data)(    \            BOOST_PP_ENUM_PARAMS(index, arg)                                    \        );                                                                      \    }#define BOOST_PYTHON_GEN_MEM_FUNCTION(fname, fstubs_name, n_args, n_dflts, ret) \    struct fstubs_name                                                          \    {                                                                           \        BOOST_STATIC_CONSTANT(int, n_funcs = BOOST_PP_INC(n_dflts));            \        BOOST_STATIC_CONSTANT(int, max_args = n_funcs + 1);                     \                                                                                \        template <typename SigT>                                                \        struct gen                                                              \        {                                                                       \            typedef typename ::boost::mpl::begin<SigT>::type rt_iter;           \            typedef typename ::boost::mpl::deref<rt_iter>::type RT;             \                                                                                \            typedef typename ::boost::mpl::next<rt_iter>::type class_iter;      \            typedef typename ::boost::mpl::deref<class_iter>::type ClassT;      \            typedef typename ::boost::mpl::next<class_iter>::type iter0;        \                                                                                \            BOOST_PP_REPEAT_2ND(                                                \                n_args,                                                         \                BOOST_PYTHON_TYPEDEF_GEN,                                       \                0)                                                              \                                                                                \            BOOST_PP_REPEAT_FROM_TO_2(                                          \                BOOST_PP_SUB_D(1, n_args, n_dflts),                             \                BOOST_PP_INC(n_args),                                           \                BOOST_PYTHON_MEM_FUNC_WRAPPER_GEN,                              \                (fname, BOOST_PP_SUB_D(1, n_args, n_dflts), ret))               \        };                                                                      \    };#define BOOST_PYTHON_OVERLOAD_CONSTRUCTORS(fstubs_name, n_args, n_dflts)                    \    fstubs_name(char const* doc = 0)                                                        \        : ::boost::python::detail::overloads_common<fstubs_name>(doc) {}                    \    template <std::size_t N>                                                                \    fstubs_name(char const* doc, ::boost::python::detail::keywords<N> const& keywords)      \        : ::boost::python::detail::overloads_common<fstubs_name>(                           \            doc, keywords.range())                                                          \    {                                                                                       \        typedef typename ::boost::python::detail::                                          \            error::more_keywords_than_function_arguments<                                   \                N,n_args>::too_many_keywords assertion BOOST_ATTRIBUTE_UNUSED;              \    }                                                                                       \    template <std::size_t N>                                                                \    fstubs_name(::boost::python::detail::keywords<N> const& keywords, char const* doc = 0)  \        : ::boost::python::detail::overloads_common<fstubs_name>(                           \            doc, keywords.range())                                                          \    {                                                                                       \        typedef typename ::boost::python::detail::                                          \            error::more_keywords_than_function_arguments<                                   \                N,n_args>::too_many_keywords assertion BOOST_ATTRIBUTE_UNUSED;              \    }# if defined(BOOST_NO_VOID_RETURNS)#  define BOOST_PYTHON_GEN_FUNCTION_STUB(fname, fstubs_name, n_args, n_dflts)   \    struct fstubs_name                                                          \        : public ::boost::python::detail::overloads_common<fstubs_name>         \    {                                                                           \        BOOST_PYTHON_GEN_FUNCTION(                                              \            fname, non_void_return_type, n_args, n_dflts, return)               \        BOOST_PYTHON_GEN_FUNCTION(                                              \            fname, void_return_type, n_args, n_dflts, ;)                        \                                                                                \        BOOST_PYTHON_OVERLOAD_CONSTRUCTORS(fstubs_name, n_args, n_dflts)        \    };#  define BOOST_PYTHON_GEN_MEM_FUNCTION_STUB(fname, fstubs_name, n_args, n_dflts)       \    struct fstubs_name                                                                  \        : public ::boost::python::detail::overloads_common<fstubs_name>                 \    {                                                                                   \        BOOST_PYTHON_GEN_MEM_FUNCTION(                                                  \            fname, non_void_return_type, n_args, n_dflts, return)                       \        BOOST_PYTHON_GEN_MEM_FUNCTION(                                                  \            fname, void_return_type, n_args, n_dflts, ;)                                \                                                                                        \        BOOST_PYTHON_OVERLOAD_CONSTRUCTORS(fstubs_name, n_args + 1, n_dflts)            \    };# else // !defined(BOOST_NO_VOID_RETURNS)#  define BOOST_PYTHON_GEN_FUNCTION_STUB(fname, fstubs_name, n_args, n_dflts)   \    struct fstubs_name                                                          \        : public ::boost::python::detail::overloads_common<fstubs_name>         \    {                                                                           \        BOOST_PYTHON_GEN_FUNCTION(                                              \            fname, non_void_return_type, n_args, n_dflts, return)               \                                                                                \        typedef non_void_return_type void_return_type;                          \        BOOST_PYTHON_OVERLOAD_CONSTRUCTORS(fstubs_name, n_args, n_dflts)        \    };#  define BOOST_PYTHON_GEN_MEM_FUNCTION_STUB(fname, fstubs_name, n_args, n_dflts)       \    struct fstubs_name                                                                  \        : public ::boost::python::detail::overloads_common<fstubs_name>                 \    {                                                                                   \        BOOST_PYTHON_GEN_MEM_FUNCTION(                                                  \            fname, non_void_return_type, n_args, n_dflts, return)                       \                                                                                        \        typedef non_void_return_type void_return_type;                                  \        BOOST_PYTHON_OVERLOAD_CONSTRUCTORS(fstubs_name, n_args + 1, n_dflts)            \    };# endif // !defined(BOOST_NO_VOID_RETURNS)///////////////////////////////////////////////////////////////////////////////////  MAIN MACROS////      Given generator_name, fname, min_args and max_args, These macros//      generate function stubs that forward to a function or member function//      named fname. max_args is the arity of the function or member function//      fname. fname can have default arguments. min_args is the minimum//      arity that fname can accept.////      There are two versions:////          1. BOOST_PYTHON_FUNCTION_OVERLOADS for free functions//          2. BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS for member functions.////      For instance, given a function:////      int//      foo(int a, char b = 1, unsigned c = 2, double d = 3)//      {//          return a + b + c + int(d);//      }////      The macro invocation:////          BOOST_PYTHON_FUNCTION_OVERLOADS(foo_stubs, foo, 1, 4)////      Generates this code:////      struct foo_stubsNonVoid//      {//          static const int n_funcs = 4;//          static const int max_args = n_funcs;////          template <typename SigT>//          struct gen//          {//              typedef typename ::boost::mpl::begin<SigT>::type    rt_iter;//              typedef typename rt_iter::type                      RT;//              typedef typename rt_iter::next                      iter0;//              typedef typename iter0::type                        T0;//              typedef typename iter0::next                        iter1;//              typedef typename iter1::type                        T1;//              typedef typename iter1::next                        iter2;//              typedef typename iter2::type                        T2;//              typedef typename iter2::next                        iter3;//              typedef typename iter3::type                        T3;//              typedef typename iter3::next                        iter4;////              static RT func_0(T0 arg0)//              { return foo(arg0); }////              static RT func_1(T0 arg0, T1 arg1)//              { return foo(arg0, arg1); }////              static RT func_2(T0 arg0, T1 arg1, T2 arg2)//              { return foo(arg0, arg1, arg2); }////              static RT func_3(T0 arg0, T1 arg1, T2 arg2, T3 arg3)//              { return foo(arg0, arg1, arg2, arg3); }//          };//      };////      struct foo_overloads//          : public boost::python::detail::overloads_common<foo_overloads>//      {//          typedef foo_overloadsNonVoid    non_void_return_type;//          typedef foo_overloadsNonVoid    void_return_type;////          foo_overloads(char const* doc = 0)//             : boost::python::detail::overloads_common<foo_overloads>(doc) {}//      };////      The typedefs non_void_return_type and void_return_type are//      used to handle compilers that do not support void returns. The//      example above typedefs non_void_return_type and//      void_return_type to foo_overloadsNonVoid. On compilers that do//      not support void returns, there are two versions://      foo_overloadsNonVoid and foo_overloadsVoid.  The "Void"//      version is almost identical to the "NonVoid" version except//      for the return type (void) and the lack of the return keyword.////      See the overloads_common above for a description of the//      foo_overloads' base class./////////////////////////////////////////////////////////////////////////////////#define BOOST_PYTHON_FUNCTION_OVERLOADS(generator_name, fname, min_args, max_args)          \    BOOST_PYTHON_GEN_FUNCTION_STUB(                                                         \        fname,                                                                              \        generator_name,                                                                     \        max_args,                                                                           \        BOOST_PP_SUB_D(1, max_args, min_args))#define BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(generator_name, fname, min_args, max_args)   \    BOOST_PYTHON_GEN_MEM_FUNCTION_STUB(                                                     \        fname,                                                                              \        generator_name,                                                                     \        max_args,                                                                           \        BOOST_PP_SUB_D(1, max_args, min_args))// deprecated macro names (to be removed)#define BOOST_PYTHON_FUNCTION_GENERATOR BOOST_PYTHON_FUNCTION_OVERLOADS#define BOOST_PYTHON_MEM_FUN_GENERATOR BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS///////////////////////////////////////////////////////////////////////////////#endif // DEFAULTS_GEN_JDG20020807_HPP
 |