1 // Copyright David Abrahams 2004. Distributed under the Boost
2 // Software License, Version 1.0. (See accompanying
3 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4
5 #include <boost/python.hpp>
6 #include <boost/shared_ptr.hpp>
7
8 using namespace boost;
9 using namespace python;
10
11 struct A
12 {
fA13 virtual int f() { return 0; }
14 };
15
New()16 shared_ptr<A> New() { return shared_ptr<A>( new A() ); }
17
Call(const shared_ptr<A> & a)18 int Call( const shared_ptr<A> & a )
19 {
20 return a->f();
21 }
22
Fail(shared_ptr<A> & a)23 int Fail( shared_ptr<A> & a )
24 {
25 return a->f();
26 }
27
28 struct A_Wrapper: A
29 {
A_WrapperA_Wrapper30 A_Wrapper(PyObject* self_): self(self_) {}
A_WrapperA_Wrapper31 A_Wrapper(PyObject* self_, const A& a): self(self_), A(a) {}
32
fA_Wrapper33 int f()
34 {
35 return call_method<int>(self, "f");
36 }
37
default_fA_Wrapper38 int default_f()
39 {
40 return A::f();
41 }
42
43 PyObject* self;
44 };
45
BOOST_PYTHON_MODULE(register_ptr)46 BOOST_PYTHON_MODULE(register_ptr)
47 {
48 class_<A, A_Wrapper>("A")
49 .def("f", &A::f, &A_Wrapper::default_f)
50 ;
51 register_ptr_to_python< shared_ptr<A> >();
52 def("New", &New);
53 def("Call", &Call);
54 def("Fail", &Fail);
55 }
56