register_ptr.cpp 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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. #include <boost/python.hpp>
  5. #include <boost/shared_ptr.hpp>
  6. using namespace boost;
  7. using namespace python;
  8. struct A
  9. {
  10. virtual int f() { return 0; }
  11. };
  12. shared_ptr<A> New() { return shared_ptr<A>( new A() ); }
  13. int Call( const shared_ptr<A> & a )
  14. {
  15. return a->f();
  16. }
  17. int Fail( shared_ptr<A> & a )
  18. {
  19. return a->f();
  20. }
  21. struct A_Wrapper: A
  22. {
  23. A_Wrapper(PyObject* self_): self(self_) {}
  24. A_Wrapper(PyObject* self_, const A& a): self(self_), A(a) {}
  25. int f()
  26. {
  27. return call_method<int>(self, "f");
  28. }
  29. int default_f()
  30. {
  31. return A::f();
  32. }
  33. PyObject* self;
  34. };
  35. BOOST_PYTHON_MODULE(register_ptr)
  36. {
  37. class_<A, A_Wrapper>("A")
  38. .def("f", &A::f, &A_Wrapper::default_f)
  39. ;
  40. register_ptr_to_python< shared_ptr<A> >();
  41. def("New", &New);
  42. def("Call", &Call);
  43. def("Fail", &Fail);
  44. }