|
1 | 1 | #include <Python.h> |
| 2 | +#include <structmember.h> |
2 | 3 | #include <sleef.h> |
3 | 4 | #include <sleefquad.h> |
4 | 5 | #include <ctype.h> |
@@ -439,13 +440,45 @@ QuadPrecDType_str(QuadPrecDTypeObject *self) |
439 | 440 | return PyUnicode_FromFormat("QuadPrecDType(backend='%s')", backend_str); |
440 | 441 | } |
441 | 442 |
|
| 443 | + |
| 444 | +static PyObject * |
| 445 | +quaddtype__reduce__(QuadPrecDTypeObject *self, PyObject *NPY_UNUSED(args)) |
| 446 | +{ |
| 447 | + const char *backend_str = (self->backend == BACKEND_SLEEF) ? "sleef" : "longdouble"; |
| 448 | + |
| 449 | + /* Return (type(self), (backend_str,)) |
| 450 | + * This will call type(self).__new__(type(self), backend_str) followed by __init__ |
| 451 | + */ |
| 452 | + PyObject *result = Py_BuildValue("O(s)", Py_TYPE(self), backend_str); |
| 453 | + |
| 454 | + return result; |
| 455 | +} |
| 456 | + |
| 457 | +static PyMethodDef QuadPrecDType_methods[] = { |
| 458 | + { |
| 459 | + "__reduce__", |
| 460 | + (PyCFunction)quaddtype__reduce__, |
| 461 | + METH_NOARGS, |
| 462 | + "Reduction method for a QuadPrecDType object", |
| 463 | + }, |
| 464 | + {NULL, NULL, 0, NULL}, |
| 465 | +}; |
| 466 | + |
| 467 | +static PyMemberDef QuadPrecDType_members[] = { |
| 468 | + {"backend", T_INT, offsetof(QuadPrecDTypeObject, backend), READONLY, |
| 469 | + "The backend used for quad precision (0=sleef, 1=longdouble)"}, |
| 470 | + {NULL, 0, 0, 0, NULL}, |
| 471 | +}; |
| 472 | + |
442 | 473 | PyArray_DTypeMeta QuadPrecDType = { |
443 | 474 | {{ |
444 | 475 | PyVarObject_HEAD_INIT(NULL, 0).tp_name = "numpy_quaddtype.QuadPrecDType", |
445 | 476 | .tp_basicsize = sizeof(QuadPrecDTypeObject), |
446 | 477 | .tp_new = QuadPrecDType_new, |
447 | 478 | .tp_repr = (reprfunc)QuadPrecDType_repr, |
448 | 479 | .tp_str = (reprfunc)QuadPrecDType_str, |
| 480 | + .tp_methods = QuadPrecDType_methods, |
| 481 | + .tp_members = QuadPrecDType_members, |
449 | 482 | }}, |
450 | 483 | }; |
451 | 484 |
|
|
0 commit comments