* Alf P. Steinbach /Usenet, on 08.07.2010 01:47:
enum DoAddRef { doAddRef };
class Ptr
{
private:
PyObject* p_;
public:
Ptr( PyObject* p = 0 ): p_( p )
{}
Ptr( PyObject* p, DoAddRef ): p_( p )
{
assert( p != 0 );
Py_INCREF( p_ );
}
Ptr( Ptr const& other ): p_( other.p_ )
{
Py_XINCREF( p_ );
}
~Ptr()
{
Py_XDECREF( p_ );
}
void swapWith( Ptr& other ) { std::swap( p_, other.p_ ); }
Ptr& operator=( Ptr other ) { swapWith( other ); return *this; }
PyObject* get() const { return p_; }
PyObject* release()
{
PyObject* const result = p_;
Py_XDECREF( p_ );
Hark. This Py_XDECREF shouldn't be there, I don't know how it got there. The
whole point of 'release', with conventional semantics, is to /not/ decrement the
reference count.
p_ = 0;
return result;
}
};
Sorry for posting unfinished code,
- Alf
PS: "pyni" was a good name. But in use! When I thought about adding the "s" as
disambiguation I thought the pure shock value of that was funny in a way, but
now it doesn't seem funny. Is "pytes" (Python Extension Support) a good name?
--
blog at <url: http://alfps.wordpress.com>
--
http://mail.python.org/mailman/listinfo/python-list