Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions quaddtype/numpy_quaddtype/_quaddtype_main.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ _ScalarItemArg: TypeAlias = Literal[0, -1] | tuple[Literal[0, -1]] | tuple[()]
class QuadPrecDType(np.dtype[QuadPrecision]): # type: ignore[misc] # pyright: ignore[reportGeneralTypeIssues]
def __new__(cls, /, backend: _Backend = "sleef") -> Self: ...

# QuadPrecDType specific attributes
@property
def backend(self) -> Literal[0, 1]: ...

# `numpy.dtype` overrides
names: None # pyright: ignore[reportIncompatibleVariableOverride]
@property
Expand Down
33 changes: 33 additions & 0 deletions quaddtype/numpy_quaddtype/src/dtype.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <Python.h>
#include <structmember.h>
#include <sleef.h>
#include <sleefquad.h>
#include <ctype.h>
Expand Down Expand Up @@ -439,13 +440,45 @@ QuadPrecDType_str(QuadPrecDTypeObject *self)
return PyUnicode_FromFormat("QuadPrecDType(backend='%s')", backend_str);
}


static PyObject *
quaddtype__reduce__(QuadPrecDTypeObject *self, PyObject *NPY_UNUSED(args))
{
const char *backend_str = (self->backend == BACKEND_SLEEF) ? "sleef" : "longdouble";

/* Return (type(self), (backend_str,))
* This will call type(self).__new__(type(self), backend_str) followed by __init__
*/
PyObject *result = Py_BuildValue("O(s)", Py_TYPE(self), backend_str);

return result;
}

static PyMethodDef QuadPrecDType_methods[] = {
{
"__reduce__",
(PyCFunction)quaddtype__reduce__,
METH_NOARGS,
"Reduction method for a QuadPrecDType object",
},
{NULL, NULL, 0, NULL},
};

static PyMemberDef QuadPrecDType_members[] = {
{"backend", T_INT, offsetof(QuadPrecDTypeObject, backend), READONLY,
"The backend used for quad precision (0=sleef, 1=longdouble)"},
{NULL, 0, 0, 0, NULL},
};

PyArray_DTypeMeta QuadPrecDType = {
{{
PyVarObject_HEAD_INIT(NULL, 0).tp_name = "numpy_quaddtype.QuadPrecDType",
.tp_basicsize = sizeof(QuadPrecDTypeObject),
.tp_new = QuadPrecDType_new,
.tp_repr = (reprfunc)QuadPrecDType_repr,
.tp_str = (reprfunc)QuadPrecDType_str,
.tp_methods = QuadPrecDType_methods,
.tp_members = QuadPrecDType_members,
}},
};

Expand Down
Loading