Skip to content

Commit 44b664a

Browse files
authored
Merge pull request #207 from SwayamInSync/buffer
2 parents 650330a + 9b9aa18 commit 44b664a

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

quaddtype/numpy_quaddtype/src/scalar.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
336372
static PyObject *
337373
QuadPrecision_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
};

quaddtype/tests/test_quaddtype.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3088,4 +3088,11 @@ def test_frexp_very_small(self):
30883088
# Verify reconstruction using ldexp (preserves full quad precision)
30893089
reconstructed = np.ldexp(quad_m, int(quad_e))
30903090
assert reconstructed == quad_x, \
3091-
f"Reconstruction failed for small value: {reconstructed} != {quad_x}"
3091+
f"Reconstruction failed for small value: {reconstructed} != {quad_x}"
3092+
# testng buffer
3093+
def test_buffer():
3094+
a = QuadPrecision(1.0)
3095+
buff = a.data
3096+
3097+
reconstructed = np.frombuffer(buff, dtype=QuadPrecDType())[0]
3098+
assert reconstructed == a, "Buffer reconstruction failed"

0 commit comments

Comments
 (0)