[C++-sig] can boost::python class imlement buffer protocol?

Neal Becker ndbecker2 at gmail.com
Fri Jan 16 20:23:20 CET 2009


Neal Becker wrote:

> David Abrahams wrote:
> 
>> 
>> on Wed Jan 07 2009, Neal Becker <ndbecker2-AT-gmail.com> wrote:
>> 
>>> This would require filling in tp_as_buffer field in the PyTypeObject
>>> structure for the
>>> class.  Is this possible?  Any clue how/where this could be done?
>> 
>> I honestly don't know the answers to these questions, sorry.
>> 
> 
> As a workaround, I currently implemented an 'as_buffer' member function.
> For example:
> 
> template<typename T>
> inline object as_buffer (ublas::vector<T> & m) {
>   return object (handle<> (PyBuffer_FromReadWriteMemory
>   ((void*)(&m.data()[0]), m.size()*sizeof(T))));
> }

Actually, this isn't all that useful.  The problem is, you want to use 
with_custodian_and_ward_postcall<0,1> on this.  But you can't because buffer 
object doesn't support weak references.  So while the above can provide a 
buffer interface, it has no idea of lifetime management.

I wonder whether python buffer object could be made to support weak refs?  Of 
course, if there was really a way to add a buffer interface to my 
boost::python object that would be even better.




More information about the Cplusplus-sig mailing list