From 30a24b50ff3643942dbc848c7bb08521cbdb01ab Mon Sep 17 00:00:00 2001 From: swayaminsync Date: Sat, 25 Oct 2025 13:29:49 +0530 Subject: [PATCH] tp_buffer --- quaddtype/numpy_quaddtype/src/scalar.c | 37 ++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/quaddtype/numpy_quaddtype/src/scalar.c b/quaddtype/numpy_quaddtype/src/scalar.c index 7e3e33de..0889f627 100644 --- a/quaddtype/numpy_quaddtype/src/scalar.c +++ b/quaddtype/numpy_quaddtype/src/scalar.c @@ -315,6 +315,42 @@ QuadPrecision_dealloc(QuadPrecisionObject *self) Py_TYPE(self)->tp_free((PyObject *)self); } +static int +QuadPrecision_getbuffer(QuadPrecisionObject *self, Py_buffer *view, int flags) +{ + if (view == NULL) { + PyErr_SetString(PyExc_ValueError, "NULL view in getbuffer"); + return -1; + } + + if ((flags & PyBUF_WRITABLE) == PyBUF_WRITABLE) { + PyErr_SetString(PyExc_BufferError, "QuadPrecision scalar is not writable"); + return -1; + } + + size_t elem_size = (self->backend == BACKEND_SLEEF) ? sizeof(Sleef_quad) : sizeof(long double); + + view->obj = (PyObject *)self; + Py_INCREF(self); + view->buf = &self->value; + view->len = elem_size; + view->readonly = 1; + view->itemsize = elem_size; + view->format = NULL; // No format string for now + view->ndim = 0; + view->shape = NULL; + view->strides = NULL; + view->suboffsets = NULL; + view->internal = NULL; + + return 0; +} + +static PyBufferProcs QuadPrecision_as_buffer = { + .bf_getbuffer = (getbufferproc)QuadPrecision_getbuffer, + .bf_releasebuffer = NULL, +}; + PyTypeObject QuadPrecision_Type = { PyVarObject_HEAD_INIT(NULL, 0).tp_name = "numpy_quaddtype.QuadPrecision", .tp_basicsize = sizeof(QuadPrecisionObject), @@ -324,6 +360,7 @@ PyTypeObject QuadPrecision_Type = { .tp_repr = (reprfunc)QuadPrecision_repr_dragon4, .tp_str = (reprfunc)QuadPrecision_str_dragon4, .tp_as_number = &quad_as_scalar, + .tp_as_buffer = &QuadPrecision_as_buffer, .tp_richcompare = (richcmpfunc)quad_richcompare, };