The new PythonReference implementation
Here is the new PythonReference implementation, based on what I’ve learned from Scott Meyers’ Effective C++.
class PythonReference {
public:
explicit PythonReference() : ref(Py_None) {
Py_INCREF(ref);
}
explicit PythonReference(PyObject *object, int borrow=1) : ref(object) {
if(ref==NULL) {
throw TSTException("Cannot reference NULL");
}
if(borrow) {
Py_INCREF(ref);
}
}
PythonReference(const PythonReference& that) : ref(that.ref) {
Py_INCREF(ref);
}
PythonReference& operator= (const PythonReference& that) {
PyObject* old = ref;
if((this->ref = that.ref) != old) {
Py_INCREF(ref);
Py_DECREF(old);
}
return *this;
}
~PythonReference() {
Py_DECREF(ref);
}
int operator==(const PythonReference& that) {
return (ref==that.ref);
}
int operator!=(const PythonReference& that) {
return (ref!=that.ref);
}
PyObject* get() {
return ref;
}
PyObject* lend() {
Py_INCREF(ref);
return ref;
}
private:
PyObject* ref;
};