Skip to content

Commit 30a24b5

Browse files
committed
tp_buffer
1 parent d90519b commit 30a24b5

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed

quaddtype/numpy_quaddtype/src/scalar.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
318354
PyTypeObject 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

Comments
 (0)