Index: swig/Lib/python/pyclasses.swg |
=================================================================== |
--- swig/Lib/python/pyclasses.swg (revision 0) |
+++ swig/Lib/python/pyclasses.swg (revision 0) |
@@ -0,0 +1,146 @@ |
+#ifdef __cplusplus |
+ |
+/* |
+ SwigPtr_PyObject is used as a replacement of PyObject *, where |
+ the INCREF/DECREF are applied as needed. |
+ |
+ You can use SwigPtr_PyObject in a container, such as |
+ |
+ std::vector<SwigPtr_PyObject>; |
+ |
+ or as a member variable: |
+ |
+ struct A { |
+ SwigPtr_PyObject obj; |
+ A(PyObject *o) : _obj(o) { |
+ } |
+ }; |
+ |
+ or as a input/output value |
+ |
+ SwigPtr_PyObject func(SwigPtr_PyObject obj) { |
+ SwigPtr_PyObject out = PyString_FromFormat("hello %s", PyObject_AsString(obj)); |
+ Py_DECREF(out); |
+ return out; |
+ } |
+ |
+ just remember to pair the object creation with the proper DECREF, |
+ the same as with plain PyObject *ptr, since SwigPtr_PyObject always add |
+ one reference at construction. |
+ |
+ SwigPtr_PyObject is 'visible' at the wrapped side, so you can do: |
+ |
+ |
+ %template(pyvector) std::vector<swig::SwigPtr_PyObject>; |
+ |
+ and all the proper typemaps will be used. |
+ |
+*/ |
+ |
+namespace swig { |
+ %ignore SwigPtr_PyObject; |
+ struct SwigPtr_PyObject {}; |
+ %apply PyObject * {SwigPtr_PyObject}; |
+ %apply PyObject * const& {SwigPtr_PyObject const&}; |
+ |
+ /* For output */ |
+ %typemap(out,noblock=1) SwigPtr_PyObject { |
+ $result = (PyObject *)$1; |
+ Py_INCREF($result); |
+ } |
+ |
+ %typemap(out,noblock=1) SwigPtr_PyObject const & { |
+ $result = (PyObject *)*$1; |
+ Py_INCREF($result); |
+ } |
+ |
+} |
+ |
+%{ |
+namespace swig { |
+ class SwigPtr_PyObject { |
+ protected: |
+ PyObject *_obj; |
+ |
+ public: |
+ SwigPtr_PyObject() :_obj(0) |
+ { |
+ } |
+ |
+ SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj) |
+ { |
+ Py_XINCREF(_obj); |
+ } |
+ |
+ SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj) |
+ { |
+ if (initial_ref) { |
+ Py_XINCREF(_obj); |
+ } |
+ } |
+ |
+ SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item) |
+ { |
+ Py_XINCREF(item._obj); |
+ Py_XDECREF(_obj); |
+ _obj = item._obj; |
+ return *this; |
+ } |
+ |
+ ~SwigPtr_PyObject() |
+ { |
+ Py_XDECREF(_obj); |
+ } |
+ |
+ operator PyObject *() const |
+ { |
+ return _obj; |
+ } |
+ |
+ PyObject *operator->() const |
+ { |
+ return _obj; |
+ } |
+ }; |
+} |
+%} |
+ |
+/* |
+ SwigVar_PyObject is used to manage 'in the scope' PyObject * variables, |
+ as in |
+ |
+ int func () { |
+ SwigVar_PyObject obj = PyString_FromString("hello"); |
+ } |
+ |
+ ie, 'obj' is created and destructed in the same scope from |
+ a python object that carries at least one reference value. |
+ |
+ SwigVar_PyObject just take care of applying the proper Py_DECREF. |
+ |
+ Hence, this class is purely internal and not visible at the wrapped side. |
+ */ |
+namespace swig { |
+ %ignore SwigVar_PyObject; |
+ struct SwigVar_PyObject {}; |
+ %apply PyObject * {SwigVar_PyObject}; |
+ %apply PyObject * const& {SwigVar_PyObject const&}; |
+} |
+ |
+%{ |
+namespace swig { |
+ struct SwigVar_PyObject : SwigPtr_PyObject { |
+ SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { } |
+ |
+ SwigVar_PyObject & operator = (PyObject* obj) |
+ { |
+ Py_XDECREF(_obj); |
+ _obj = obj; |
+ return *this; |
+ } |
+ }; |
+} |
+%} |
+ |
+ |
+#endif |