11#if PY_VERSION_HEX >= 0x03000000
12static PyObject* PyBuffer_FromReadWriteMemory(
void* ptr,
int size ) {
13#if PY_VERSION_HEX > 0x03000000
21 Py_buffer bufinfo = { ptr, NULL, size, 1, 0, 1, NULL, NULL, NULL, NULL,
22#if PY_VERSION_HEX < 0x03030000
26 return PyMemoryView_FromBuffer( &bufinfo );
35 struct PyBufferTop_t {
44 std::map< PyObject*, PyObject* > gSizeCallbacks;
47#define PYROOT_PREPARE_PYBUFFER_TYPE( name ) \
48 PyTypeObject Py##name##Buffer_Type; \
49 PySequenceMethods Py##name##Buffer_SeqMethods = *(PyBuffer_Type.tp_as_sequence);\
50 PyMappingMethods Py##name##Buffer_MapMethods;
68#if PY_VERSION_HEX < 0x03000000
69 Py_ssize_t nlen = ((PyBufferTop_t*)self)->fSize;
70 Py_ssize_t item = ((PyBufferTop_t*)self)->fItemSize;
72 Py_buffer* bufinfo = PyMemoryView_GET_BUFFER(self);
76 if ( nlen != INT_MAX )
79 std::map< PyObject*, PyObject* >::iterator iscbp = gSizeCallbacks.find( self );
80 if ( iscbp != gSizeCallbacks.end() ) {
81 PyObject* pylen = PyObject_CallObject( iscbp->second, NULL );
85 if ( nlen2 == (
Py_ssize_t)-1 && PyErr_Occurred() )
97 const char* buffer_get(
PyObject* self,
int idx )
99 if ( idx < 0 || idx >= buffer_length( self ) ) {
100 PyErr_SetString( PyExc_IndexError,
"buffer index out of range" );
104#if PY_VERSION_HEX < 0x02050000
109#if PY_VERSION_HEX < 0x03000000
110 (*(PyBuffer_Type.tp_as_buffer->bf_getcharbuffer))( self, 0, &buf );
113 (*(PyBuffer_Type.tp_as_buffer->bf_getbuffer))( self, &bufinfo, PyBUF_SIMPLE );
114 buf = (
char*)bufinfo.buf;
115 (*(PyBuffer_Type.tp_as_buffer->bf_releasebuffer))(self, &bufinfo);
116 Py_DECREF(bufinfo.obj);
120 PyErr_SetString( PyExc_IndexError,
"attempt to index a null-buffer" );
127#define PYROOT_IMPLEMENT_PYBUFFER_METHODS( name, type, stype, F1, F2 ) \
128 PyObject* name##_buffer_str( PyObject* self ) \
130 Py_ssize_t l = buffer_length( self ); \
131 return PyROOT_PyUnicode_FromFormat( "<"#type" buffer, size " PY_SSIZE_T_FORMAT ">", l );\
134 PyObject* name##_buffer_item( PyObject* self, Py_ssize_t idx ) { \
135 const char* buf = buffer_get( self, idx ); \
137 return F1( (stype)*((type*)buf + idx) ); \
141 int name##_buffer_ass_item( PyObject* self, Py_ssize_t idx, PyObject* val ) {\
142 const char* buf = buffer_get( self, idx ); \
146 type value = F2( val ); \
147 if ( value == (type)-1 && PyErr_Occurred() ) \
150 *((type*)buf+idx) = (type)value; \
154 PyObject* name##_buffer_subscript( PyObject* self, PyObject* item ) { \
155 if ( PyIndex_Check( item ) ) { \
156 Py_ssize_t idx = PyNumber_AsSsize_t( item, PyExc_IndexError ); \
157 if ( idx == -1 && PyErr_Occurred() ) \
159 return name##_buffer_item( self, idx ); \
180 if ( i == -1 && PyErr_Occurred() )
182 return Py_TYPE(self)->tp_as_sequence->sq_ass_item( self, i, val );
184 PyErr_SetString( PyExc_TypeError,
"buffer indices must be integers" );
196 if ( nlen == -1 && PyErr_Occurred() )
199#if PY_VERSION_HEX < 0x03000000
200 ((PyBufferTop_t*)self)->fSize = nlen * ((PyBufferTop_t*)self)->fItemSize;
202 PyMemoryView_GET_BUFFER(self)->len = nlen * PyMemoryView_GET_BUFFER(self)->itemsize;
205 Py_INCREF( Py_None );
214 if ( PyObject_TypeCheck( pyobject, &PyBoolBuffer_Type ) )
216 else if ( PyObject_TypeCheck( pyobject, &PyCharBuffer_Type ) )
218 else if ( PyObject_TypeCheck( pyobject, &PyUCharBuffer_Type ) )
220 else if ( PyObject_TypeCheck( pyobject, &PyShortBuffer_Type ) )
222 else if ( PyObject_TypeCheck( pyobject, &PyUShortBuffer_Type ) )
224 else if ( PyObject_TypeCheck( pyobject, &PyIntBuffer_Type ) )
226 else if ( PyObject_TypeCheck( pyobject, &PyUIntBuffer_Type ) )
228 else if ( PyObject_TypeCheck( pyobject, &PyLongBuffer_Type ) )
230 else if ( PyObject_TypeCheck( pyobject, &PyULongBuffer_Type ) )
232 else if ( PyObject_TypeCheck( pyobject, &PyFloatBuffer_Type ) )
234 else if ( PyObject_TypeCheck( pyobject, &PyDoubleBuffer_Type ) )
237 PyErr_SetString( PyExc_TypeError,
"received unknown buffer object" );
243 PyGetSetDef buffer_getset[] = {
244 { (
char*)
"typecode", (getter)buf_typecode, NULL, NULL, NULL },
245 { (
char*)NULL, NULL, NULL, NULL, NULL }
250 PyMethodDef buffer_methods[] = {
251 { (
char*)
"SetSize", (PyCFunction)buffer_setsize, METH_O, NULL },
252 { (
char*)NULL, NULL, 0, NULL }
268#define PYROOT_INSTALL_PYBUFFER_METHODS( name, type ) \
269 Py##name##Buffer_Type.tp_name = (char*)"ROOT.Py"#name"Buffer"; \
270 Py##name##Buffer_Type.tp_base = &PyBuffer_Type; \
271 Py##name##Buffer_Type.tp_as_buffer = PyBuffer_Type.tp_as_buffer; \
272 Py##name##Buffer_SeqMethods.sq_item = (ssizeargfunc)name##_buffer_item; \
273 Py##name##Buffer_SeqMethods.sq_ass_item = (ssizeobjargproc)name##_buffer_ass_item;\
274 Py##name##Buffer_SeqMethods.sq_length = (lenfunc)buffer_length; \
275 Py##name##Buffer_Type.tp_as_sequence = &Py##name##Buffer_SeqMethods; \
276 if ( PyBuffer_Type.tp_as_mapping ) {
\
277 Py##name##Buffer_MapMethods.mp_length = (lenfunc)buffer_length; \
278 Py##name##Buffer_MapMethods.mp_subscript = (binaryfunc)name##_buffer_subscript;\
279 Py##name##Buffer_MapMethods.mp_ass_subscript = (objobjargproc)pyroot_buffer_ass_subscript;\
280 Py##name##Buffer_Type.tp_as_mapping = &Py##name##Buffer_MapMethods; \
282 Py##name##Buffer_Type.tp_str = (reprfunc)name##_buffer_str; \
283 Py##name##Buffer_Type.tp_methods = buffer_methods; \
284 Py##name##Buffer_Type.tp_getset = buffer_getset; \
285 PyType_Ready( &Py##name##Buffer_Type );
321#if PY_VERSION_HEX < 0x03000000
322 #define PYBUFFER_SETITEMSIZE(buf,type) ((PyBufferTop_t*)buf)->fItemSize = Py_ssize_t(sizeof(type))
323 #define PYBUFFER_SETFORMAT(buf,name)
325 #define PYBUFFER_SETITEMSIZE(buf,type) PyMemoryView_GET_BUFFER(buf)->itemsize = Py_ssize_t(sizeof(type))
326 #define PYBUFFER_SETFORMAT(buf,name) PyMemoryView_GET_BUFFER(buf)->format = (char *)get##name##Format()
330#define PYROOT_IMPLEMENT_PYBUFFER_FROM_MEMORY( name, type ) \
331PyObject* PyROOT::TPyBufferFactory::PyBuffer_FromMemory( type* address, Py_ssize_t size )\
333 size = size < 0 ? INT_MAX : size; \
334 PyObject* buf = PyBuffer_FromReadWriteMemory( (void*)address, size ); \
336 Py_INCREF( (PyObject*)(void*)&Py##name##Buffer_Type ); \
337 buf->ob_type = &Py##name##Buffer_Type; \
338 PYBUFFER_SETITEMSIZE(buf,type); \
339 PYBUFFER_SETFORMAT(buf, name); \
344PyObject* PyROOT::TPyBufferFactory::PyBuffer_FromMemory( type* address, PyObject* scb )\
346 PyObject* buf = PyBuffer_FromMemory( address, Py_ssize_t(0) ); \
347 if ( buf != 0 && PyCallable_Check( scb ) ) { \
349 gSizeCallbacks[ buf ] = scb; \
Py_ssize_t PyNumber_AsSsize_t(PyObject *obj, PyObject *)
#define PyROOT_PyUnicode_FromString
#define PyIndex_Check(obj)
static RooMathCoreReg dummy
#define PYROOT_IMPLEMENT_PYBUFFER_FROM_MEMORY(name, type)
const char * getShortFormat()
const char * getUShortFormat()
const char * getIntFormat()
#define PYROOT_PREPARE_PYBUFFER_TYPE(name)
const char * getULongFormat()
const char * getUCharFormat()
const char * getBoolFormat()
const char * getUIntFormat()
#define PYROOT_INSTALL_PYBUFFER_METHODS(name, type)
const char * getFloatFormat()
const char * getLongFormat()
#define PYROOT_IMPLEMENT_PYBUFFER_METHODS(name, type, stype, F1, F2)
const char * getDoubleFormat()
const char * getCharFormat()
Factory for python buffers of non-string type.
static TPyBufferFactory * Instance()