Skip to content

Commit 05203e2

Browse files
committed
refactor
1 parent 81d3bfc commit 05203e2

File tree

8 files changed

+53
-41
lines changed

8 files changed

+53
-41
lines changed

quaddtype/meson.build

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ srcs = [
177177
'numpy_quaddtype/src/constants.hpp',
178178
'numpy_quaddtype/src/lock.h',
179179
'numpy_quaddtype/src/lock.c',
180+
'numpy_quaddtype/src/utilities.h',
181+
'numpy_quaddtype/src/utilities.c',
180182
]
181183

182184
py.install_sources(

quaddtype/numpy_quaddtype/_quaddtype_main.pyi

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ _Backend: TypeAlias = Literal["sleef", "longdouble"]
88
_IntoQuad: TypeAlias = (
99
QuadPrecision
1010
| float
11-
| int
1211
| str
1312
| bytes
1413
| np.floating[Any]

quaddtype/numpy_quaddtype/src/dtype.c

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313
#include "numpy/ndarraytypes.h"
1414
#include "numpy/dtype_api.h"
1515

16+
#include "quad_common.h"
1617
#include "scalar.h"
1718
#include "casts.h"
1819
#include "dtype.h"
1920
#include "dragon4.h"
2021
#include "constants.hpp"
22+
#include "utilities.h"
2123

2224
static inline int
2325
quad_load(void *x, char *data_ptr, QuadBackendType backend)
@@ -353,19 +355,16 @@ quadprec_scanfunc(FILE *fp, void *dptr, char *ignore, PyArray_Descr *descr_gener
353355

354356
/* Convert string to quad precision */
355357
char *endptr;
358+
quad_value val;
359+
cstring_to_quad(buffer, descr->backend, &val, &endptr);
360+
if (endptr == buffer) {
361+
return 0; /* Return 0 on parse error (no items read) */
362+
}
356363
if (descr->backend == BACKEND_SLEEF) {
357-
Sleef_quad val = Sleef_strtoq(buffer, &endptr);
358-
if (endptr == buffer) {
359-
return 0; /* Return 0 on parse error (no items read) */
360-
}
361-
*(Sleef_quad *)dptr = val;
364+
*(Sleef_quad *)dptr = val.sleef_value;
362365
}
363366
else {
364-
long double val = strtold(buffer, &endptr);
365-
if (endptr == buffer) {
366-
return 0; /* Return 0 on parse error (no items read) */
367-
}
368-
*(long double *)dptr = val;
367+
*(long double *)dptr = val.longdouble_value;
369368
}
370369

371370
return 1; /* Return 1 on success (1 item read) */
@@ -375,22 +374,17 @@ static int
375374
quadprec_fromstr(char *s, void *dptr, char **endptr, PyArray_Descr *descr_generic)
376375
{
377376
QuadPrecDTypeObject *descr = (QuadPrecDTypeObject *)descr_generic;
378-
379-
if (descr->backend == BACKEND_SLEEF) {
380-
Sleef_quad val = Sleef_strtoq(s, endptr);
381-
if (*endptr == s) {
382-
return -1;
383-
}
384-
*(Sleef_quad *)dptr = val;
377+
quad_value val;
378+
cstring_to_quad(s, descr->backend, &val, endptr);
379+
if (*endptr == s) {
380+
return -1;
381+
}
382+
if(descr->backend == BACKEND_SLEEF) {
383+
*(Sleef_quad *)dptr = val.sleef_value;
385384
}
386385
else {
387-
long double val = strtold(s, endptr);
388-
if (*endptr == s) {
389-
return -1;
390-
}
391-
*(long double *)dptr = val;
386+
*(long double *)dptr = val.longdouble_value;
392387
}
393-
394388
return 0;
395389
}
396390

quaddtype/numpy_quaddtype/src/quad_common.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,20 @@
55
extern "C" {
66
#endif
77

8+
#include <sleef.h>
9+
#include <sleefquad.h>
10+
811
typedef enum {
912
BACKEND_INVALID = -1,
1013
BACKEND_SLEEF,
1114
BACKEND_LONGDOUBLE
1215
} QuadBackendType;
1316

17+
typedef union {
18+
Sleef_quad sleef_value;
19+
long double longdouble_value;
20+
} quad_value;
21+
1422
#ifdef __cplusplus
1523
}
1624
#endif

quaddtype/numpy_quaddtype/src/scalar.c

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "dragon4.h"
1717
#include "dtype.h"
1818
#include "lock.h"
19+
#include "utilities.h"
1920

2021
// For IEEE 754 binary128 (quad precision), we need 36 decimal digits
2122
// to guarantee round-trip conversion (string -> parse -> equals original value)
@@ -196,12 +197,7 @@ QuadPrecision_from_object(PyObject *value, QuadBackendType backend)
196197
else if (PyUnicode_Check(value)) {
197198
const char *s = PyUnicode_AsUTF8(value);
198199
char *endptr = NULL;
199-
if (backend == BACKEND_SLEEF) {
200-
self->value.sleef_value = Sleef_strtoq(s, &endptr);
201-
}
202-
else {
203-
self->value.longdouble_value = strtold(s, &endptr);
204-
}
200+
cstring_to_quad(s, backend, &self->value, &endptr);
205201
if (*endptr != '\0' || endptr == s) {
206202
PyErr_SetString(PyExc_ValueError, "Unable to parse string to QuadPrecision");
207203
Py_DECREF(self);
@@ -215,12 +211,7 @@ QuadPrecision_from_object(PyObject *value, QuadBackendType backend)
215211
return NULL;
216212
}
217213
char *endptr = NULL;
218-
if (backend == BACKEND_SLEEF) {
219-
self->value.sleef_value = Sleef_strtoq(s, &endptr);
220-
}
221-
else {
222-
self->value.longdouble_value = strtold(s, &endptr);
223-
}
214+
cstring_to_quad(s, backend, &self->value, &endptr);
224215
if (*endptr != '\0' || endptr == s) {
225216
PyErr_SetString(PyExc_ValueError, "Unable to parse bytes to QuadPrecision");
226217
Py_DECREF(self);

quaddtype/numpy_quaddtype/src/scalar.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@ extern "C" {
99
#include <sleef.h>
1010
#include "quad_common.h"
1111

12-
typedef union {
13-
Sleef_quad sleef_value;
14-
long double longdouble_value;
15-
} quad_value;
16-
1712
typedef struct {
1813
PyObject_HEAD
1914
quad_value value;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#include "utilities.h"
2+
3+
void cstring_to_quad(const char *str, QuadBackendType backend, quad_value *out_value, char **endptr)
4+
{
5+
if(backend == BACKEND_SLEEF)
6+
{
7+
out_value->sleef_value = Sleef_strtoq(str, endptr);
8+
}
9+
else
10+
{
11+
out_value->longdouble_value = strtold(str, endptr);
12+
}
13+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#ifndef QUAD_UTILITIES_H
2+
#define QUAD_UTILITIES_H
3+
4+
#include "quad_common.h"
5+
#include <sleef.h>
6+
#include <sleefquad.h>
7+
8+
void cstring_to_quad(const char *str, QuadBackendType backend, quad_value *out_value, char **endptr);
9+
10+
#endif

0 commit comments

Comments
 (0)