diff options
Diffstat (limited to 'devtools/swigwin-1.3.34/Lib/python/pyclasses.swg')
| -rw-r--r-- | devtools/swigwin-1.3.34/Lib/python/pyclasses.swg | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/devtools/swigwin-1.3.34/Lib/python/pyclasses.swg b/devtools/swigwin-1.3.34/Lib/python/pyclasses.swg new file mode 100644 index 0000000..122025c --- /dev/null +++ b/devtools/swigwin-1.3.34/Lib/python/pyclasses.swg @@ -0,0 +1,144 @@ +#ifdef __cplusplus + +/* + PyObject_ptr is used as a replacement of PyObject *, where + the INCREF/DECREF are applied as needed. + + You can use PyObject_ptr in a container, such as + + std::vector<PyObject_ptr>; + + or as a member variable: + + struct A { + PyObject_ptr obj; + A(PyObject *o) : _obj(o) { + } + }; + + or as a input/output value + + PyObject_ptr func(PyObject_ptr obj) { + PyObject_ptr 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 PyObject_ptr always add + one reference at construction. + + PyObject_ptr is 'visible' at the wrapped side, so you can do: + + + %template(pyvector) std::vector<swig::PyObject_ptr>; + + and all the proper typemaps will be used. + +*/ + +namespace swig { + %ignore PyObject_ptr; + struct PyObject_ptr {}; + %apply PyObject * {PyObject_ptr}; + %apply PyObject * const& {PyObject_ptr const&}; + + /* For output */ + %typemap(out,noblock=1) PyObject_ptr { + $result = (PyObject *)$1; + Py_INCREF($result); + } + + %typemap(out,noblock=1) PyObject_ptr const & { + $result = (PyObject *)*$1; + Py_INCREF($result); + } + +} + +%{ +namespace swig { + class PyObject_ptr { + protected: + PyObject *_obj; + + public: + PyObject_ptr() :_obj(0) + { + } + + PyObject_ptr(const PyObject_ptr& item) : _obj(item._obj) + { + Py_XINCREF(_obj); + } + + PyObject_ptr(PyObject *obj, bool initial_ref = true) :_obj(obj) + { + if (initial_ref) Py_XINCREF(_obj); + } + + PyObject_ptr & operator=(const PyObject_ptr& item) + { + Py_XINCREF(item._obj); + Py_XDECREF(_obj); + _obj = item._obj; + return *this; + } + + ~PyObject_ptr() + { + Py_XDECREF(_obj); + } + + operator PyObject *() const + { + return _obj; + } + + PyObject *operator->() const + { + return _obj; + } + }; +} +%} + +/* + PyObject_var is used to manage 'in the scope' PyObject * variables, + as in + + int func () { + PyObject_var 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. + + PyObject_var 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 PyObject_var; + struct PyObject_var {}; + %apply PyObject * {PyObject_var}; + %apply PyObject * const& {PyObject_var const&}; +} + +%{ +namespace swig { + struct PyObject_var : PyObject_ptr { + PyObject_var(PyObject* obj = 0) : PyObject_ptr(obj, false) { } + + PyObject_var & operator = (PyObject* obj) + { + Py_XDECREF(_obj); + _obj = obj; + return *this; + } + }; +} +%} + + +#endif |