/* * auto_pyptr.h * * Originally from * http://code.activestate.com/recipes/528875-automatic-ref-count-management-in-c-using-a-smart-/ */ #ifndef AUTO_PYPTR_H_ #define AUTO_PYPTR_H_ #include #include typedef std::auto_ptr auto_pyptr_base; /** * An auto_ptr that, instead of deleting, decrements the reference count * of a PyObject pointer. * * Make sure to only use this when you get a *new* reference (Py_INCREF or * getting the result of any function that says it returns a new reference * to a PyObject), NOT for "borrowed" references. */ class auto_pyptr : public auto_pyptr_base { public: auto_pyptr(PyObject * obj = NULL) : auto_pyptr_base(obj) { } ~auto_pyptr() { reset(); } void reset(PyObject * obj = NULL) { if(obj != get()) { PyObject * old = release(); // Avoid the delete call Py_XDECREF(old); auto_pyptr_base::reset(obj); } } void inc() { PyObject * ptr = get(); if(ptr) Py_INCREF(ptr); } /* * Implement cast to PyObject pointer so you don't have to call var.get() * every time you use the object. * * You still have to use get() in certain cases, notably varargs * (i.e. "..."). GCC will warn you that this will abort at runtime. */ operator PyObject*() { return this->get(); } }; #endif /* AUTO_PYPTR_H_ */