@@ -315,6 +315,42 @@ QuadPrecision_dealloc(QuadPrecisionObject *self)
315315 Py_TYPE (self )-> tp_free ((PyObject * )self );
316316}
317317
318+ static int
319+ QuadPrecision_getbuffer (QuadPrecisionObject * self , Py_buffer * view , int flags )
320+ {
321+ if (view == NULL ) {
322+ PyErr_SetString (PyExc_ValueError , "NULL view in getbuffer" );
323+ return -1 ;
324+ }
325+
326+ if ((flags & PyBUF_WRITABLE ) == PyBUF_WRITABLE ) {
327+ PyErr_SetString (PyExc_BufferError , "QuadPrecision scalar is not writable" );
328+ return -1 ;
329+ }
330+
331+ size_t elem_size = (self -> backend == BACKEND_SLEEF ) ? sizeof (Sleef_quad ) : sizeof (long double );
332+
333+ view -> obj = (PyObject * )self ;
334+ Py_INCREF (self );
335+ view -> buf = & self -> value ;
336+ view -> len = elem_size ;
337+ view -> readonly = 1 ;
338+ view -> itemsize = elem_size ;
339+ view -> format = NULL ; // No format string for now
340+ view -> ndim = 0 ;
341+ view -> shape = NULL ;
342+ view -> strides = NULL ;
343+ view -> suboffsets = NULL ;
344+ view -> internal = NULL ;
345+
346+ return 0 ;
347+ }
348+
349+ static PyBufferProcs QuadPrecision_as_buffer = {
350+ .bf_getbuffer = (getbufferproc )QuadPrecision_getbuffer ,
351+ .bf_releasebuffer = NULL ,
352+ };
353+
318354PyTypeObject QuadPrecision_Type = {
319355 PyVarObject_HEAD_INIT (NULL , 0 ).tp_name = "numpy_quaddtype.QuadPrecision" ,
320356 .tp_basicsize = sizeof (QuadPrecisionObject ),
@@ -324,6 +360,7 @@ PyTypeObject QuadPrecision_Type = {
324360 .tp_repr = (reprfunc )QuadPrecision_repr_dragon4 ,
325361 .tp_str = (reprfunc )QuadPrecision_str_dragon4 ,
326362 .tp_as_number = & quad_as_scalar ,
363+ .tp_as_buffer = & QuadPrecision_as_buffer ,
327364 .tp_richcompare = (richcmpfunc )quad_richcompare ,
328365};
329366
0 commit comments