@@ -333,6 +333,42 @@ QuadPrecision_dealloc(QuadPrecisionObject *self)
333333 Py_TYPE (self )-> tp_free ((PyObject * )self );
334334}
335335
336+ static int
337+ QuadPrecision_getbuffer (QuadPrecisionObject * self , Py_buffer * view , int flags )
338+ {
339+ if (view == NULL ) {
340+ PyErr_SetString (PyExc_ValueError , "NULL view in getbuffer" );
341+ return -1 ;
342+ }
343+
344+ if ((flags & PyBUF_WRITABLE ) == PyBUF_WRITABLE ) {
345+ PyErr_SetString (PyExc_BufferError , "QuadPrecision scalar is not writable" );
346+ return -1 ;
347+ }
348+
349+ size_t elem_size = (self -> backend == BACKEND_SLEEF ) ? sizeof (Sleef_quad ) : sizeof (long double );
350+
351+ view -> obj = (PyObject * )self ;
352+ Py_INCREF (self );
353+ view -> buf = & self -> value ;
354+ view -> len = elem_size ;
355+ view -> readonly = 1 ;
356+ view -> itemsize = elem_size ;
357+ view -> format = NULL ; // No format string for now
358+ view -> ndim = 0 ;
359+ view -> shape = NULL ;
360+ view -> strides = NULL ;
361+ view -> suboffsets = NULL ;
362+ view -> internal = NULL ;
363+
364+ return 0 ;
365+ }
366+
367+ static PyBufferProcs QuadPrecision_as_buffer = {
368+ .bf_getbuffer = (getbufferproc )QuadPrecision_getbuffer ,
369+ .bf_releasebuffer = NULL ,
370+ };
371+
336372static PyObject *
337373QuadPrecision_get_real (QuadPrecisionObject * self , void * closure )
338374{
@@ -362,6 +398,7 @@ PyTypeObject QuadPrecision_Type = {
362398 .tp_repr = (reprfunc )QuadPrecision_repr_dragon4 ,
363399 .tp_str = (reprfunc )QuadPrecision_str_dragon4 ,
364400 .tp_as_number = & quad_as_scalar ,
401+ .tp_as_buffer = & QuadPrecision_as_buffer ,
365402 .tp_richcompare = (richcmpfunc )quad_richcompare ,
366403 .tp_getset = QuadPrecision_getset ,
367404};
0 commit comments