123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- // Copyright David Abrahams 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)
- #include <boost/python/def.hpp>
- #include <boost/python/module.hpp>
- #include <boost/python/class.hpp>
- #include <boost/python/tuple.hpp>
- #include <boost/python/list.hpp>
- #include <boost/python/overloads.hpp>
- #include <boost/python/return_internal_reference.hpp>
- #if defined(_AIX) && defined(__EDG_VERSION__) && __EDG_VERSION__ < 245
- # include <iostream> // works around a KCC intermediate code generation bug
- #endif
- using namespace boost::python;
- namespace bpl = boost::python;
- char const* const format = "int(%s); char(%s); string(%s); double(%s); ";
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Overloaded functions
- //
- ///////////////////////////////////////////////////////////////////////////////
- object
- bar(int a, char b, std::string c, double d)
- {
- return format % bpl::make_tuple(a, b, c, d);
- }
- object
- bar(int a, char b, std::string c)
- {
- return format % bpl::make_tuple(a, b, c, 0.0);
- }
- object
- bar(int a, char b)
- {
- return format % bpl::make_tuple(a, b, "default", 0.0);
- }
- object
- bar(int a)
- {
- return format % bpl::make_tuple(a, 'D', "default", 0.0);
- }
- BOOST_PYTHON_FUNCTION_OVERLOADS(bar_stubs, bar, 1, 4)
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Functions with default arguments
- //
- ///////////////////////////////////////////////////////////////////////////////
- object
- foo(int a, char b = 'D', std::string c = "default", double d = 0.0)
- {
- return format % bpl::make_tuple(a, b, c, d);
- }
- BOOST_PYTHON_FUNCTION_OVERLOADS(foo_stubs, foo, 1, 4)
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Overloaded member functions with default arguments
- //
- ///////////////////////////////////////////////////////////////////////////////
- struct Y {
- Y() {}
- object
- get_state() const
- {
- return format % bpl::make_tuple(a, b, c, d);
- }
- int a; char b; std::string c; double d;
- };
- struct X {
- X() {}
- X(int a, char b = 'D', std::string c = "constructor", double d = 0.0)
- : state(format % bpl::make_tuple(a, b, c, d))
- {}
- X(std::string s, bool b)
- : state("Got exactly two arguments from constructor: string(%s); bool(%s); " % bpl::make_tuple(s, b*1))
- {}
- object
- bar(int a, char b = 'D', std::string c = "default", double d = 0.0) const
- {
- return format % bpl::make_tuple(a, b, c, d);
- }
- Y const&
- bar2(int a = 0, char b = 'D', std::string c = "default", double d = 0.0)
- {
- // tests zero arg member function and return_internal_reference policy
- y.a = a;
- y.b = b;
- y.c = c;
- y.d = d;
- return y;
- }
- object
- foo(int a, bool b=false) const
- {
- return "int(%s); bool(%s); " % bpl::make_tuple(a, b*1);
- }
- object
- foo(std::string a, bool b=false) const
- {
- return "string(%s); bool(%s); " % bpl::make_tuple(a, b*1);
- }
- object
- foo(list a, list b, bool c=false) const
- {
- return "list(%s); list(%s); bool(%s); " % bpl::make_tuple(a, b, c*1);
- }
- object
- get_state() const
- {
- return state;
- }
- Y y;
- object state;
- };
- BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_bar_stubs, bar, 1, 4)
- BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_bar_stubs2, bar2, 0, 4)
- BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_foo_2_stubs, foo, 1, 2)
- BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_foo_3_stubs, foo, 2, 3)
- ///////////////////////////////////////////////////////////////////////////////
- BOOST_PYTHON_MODULE(defaults_ext)
- {
- def("foo", foo, foo_stubs());
- def("bar", (object(*)(int, char, std::string, double))0, bar_stubs());
- class_<Y>("Y", init<>("doc of Y init")) // this should work
- .def("get_state", &Y::get_state)
- ;
- class_<X>("X",no_init)
- .def(init<optional<int, char, std::string, double> >("doc of init", args("self", "a", "b", "c", "d")))
- .def(init<std::string, bool>(args("self", "s", "b"))[default_call_policies()]) // what's a good policy here?
- .def("get_state", &X::get_state)
- .def("bar", &X::bar, X_bar_stubs())
- .def("bar2", &X::bar2, X_bar_stubs2("doc of X::bar2")[return_internal_reference<>()])
- .def("foo", (object(X::*)(std::string, bool) const)0, X_foo_2_stubs())
- .def("foo", (object(X::*)(int, bool) const)0, X_foo_2_stubs())
- .def("foo", (object(X::*)(list, list, bool) const)0, X_foo_3_stubs())
- ;
- }
- #include "module_tail.cpp"
|