Differences between revisions 1 and 9 (spanning 8 versions)
Revision 1 as of 2007-11-24 19:58:16
Size: 1962
Editor: 40
Comment:
Revision 9 as of 2009-04-01 09:25:41
Size: 1866
Editor: cache
Comment: the c++ code did not compile at all the way it was presented
Deletions are marked like this. Additions are marked like this.
Line 7: Line 7:
The life time of C++ objects created by "new A" kan be handled by Pythons garbage collection by using the {{{manage_new_object}}} storage policy: The life time of C++ objects created by "new A" can be handled by Python's garbage collection by using the {{{manage_new_object}}} storage policy:
Line 9: Line 9:
{{{struct A { {{{
struct A {
Line 28: Line 29:
print A.hello() print an_A.hello()
Line 34: Line 35:
give away ownership of objects in C++. The following suggests a way to
handle shared_ptr objects in Python, introducing the notation
{{{(+ptr).foo()}}} in python to immitate C++'s {{{(*ptr).foo()}}}:
give away ownership of objects in C++. Theese kind of smart pointer are automatically
handled, if you declare their existence, when declaring the class to boost.python.
Line 38: Line 38:
{{{#include <boost/shared_ptr.h> E.g.

{{{
#include <string>
#include <boost/shared_ptr.hpp>
#include <boost/python.hpp>
Line 40: Line 46:
using namespace std;
using namespace boost::python;
Line 42: Line 50:
  shared_ptr<A> create () { return shared_ptr<A>(new A); }
  std::string hello () { return "Just nod if you can hear me!"; }
    static shared_ptr<A> create () { return shared_ptr<A>(new A); }
   std::string hello () { return "Just nod if you can hear me!"; }
Line 48: Line 56:
    class_<A>("A",init<>())
        .def("create",&A::create,return_value_policy<return_by_value>())
    class_<A, shared_ptr<A> >("A",init<>())
        .def("create",&A::create )
Line 52: Line 60:
        ;

    class_< shared_ptr<A> >("A_ptr", init<const shared_ptr<A>& >())
        .def("__pos__",&boost::shared_ptr<A>::get,return_internal_reference<>())
        ;
    ;
Line 63: Line 67:
an_A = A_ptr.create()
print (+an_A).hello()
an_A = A.create()
print an_A.hello()

Pointers and smart pointers

Since Python handles memory allocation and garbage collection automatically, the concept "pointer" is not meaningful within Python. However, many C++ API exposes either raw pointers or shared pointers, and to wrap such APIs one would need to deal with pointers.

Pointers (raw C++ pointers)

The life time of C++ objects created by "new A" can be handled by Python's garbage collection by using the manage_new_object storage policy:

struct A {
    static A*   create () { return new A; }
    std::string hello  () { return "Hello, is there anybody in there?"; }
};

BOOST_PYTHON_MODULE(shared_ptr)
{
    class_<A>("A",no_init)
        .def("create",&A::create,return_value_policy<manage_new_object>())
        .staticmethod("create")
        .def("hello",&A::hello)
        ;
}

A sample python program:

from pointer import *
an_A = A.create()
print an_A.hello()

Smart pointers

Smart pointers, e.g. boost::shared_ptr<T>, is another common way to give away ownership of objects in C++. Theese kind of smart pointer are automatically handled, if you declare their existence, when declaring the class to boost.python.

E.g.

#include <string>
#include <boost/shared_ptr.hpp>
#include <boost/python.hpp>

using namespace boost;
using namespace std;
using namespace boost::python;

struct A {
    static shared_ptr<A> create () { return shared_ptr<A>(new A); }
    std::string   hello  () { return "Just nod if you can hear me!"; }
};

BOOST_PYTHON_MODULE(shared_ptr)
{
    class_<A, shared_ptr<A> >("A",init<>())
        .def("create",&A::create )
        .staticmethod("create")
        .def("hello",&A::hello)
    ;
}

A sample python program:

from shared_ptr import *
an_A = A.create()
print an_A.hello()

boost.python/PointersAndSmartPointers (last edited 2009-12-01 12:27:34 by tomato)

Unable to edit the page? See the FrontPage for instructions.