Cleanup: pass sizeof array element to PyC_AsArray

Replace the is_double argument which was only used for single/double
precision floats.

This allows supporting different sized int types more easily.
This commit is contained in:
2021-07-27 22:26:33 +10:00
parent b1a2abd6b2
commit 58eacb8e7c
9 changed files with 89 additions and 46 deletions

View File

@@ -57,10 +57,10 @@
/* array utility function */
int PyC_AsArray_FAST(void *array,
const size_t array_item_size,
PyObject *value_fast,
const Py_ssize_t length,
const PyTypeObject *type,
const bool is_double,
const char *error_prefix)
{
const Py_ssize_t value_len = PySequence_Fast_GET_SIZE(value_fast);
@@ -80,30 +80,55 @@ int PyC_AsArray_FAST(void *array,
/* for each type */
if (type == &PyFloat_Type) {
if (is_double) {
double *array_double = array;
for (i = 0; i < length; i++) {
array_double[i] = PyFloat_AsDouble(value_fast_items[i]);
switch (array_item_size) {
case sizeof(double): {
double *array_double = array;
for (i = 0; i < length; i++) {
array_double[i] = PyFloat_AsDouble(value_fast_items[i]);
}
break;
}
}
else {
float *array_float = array;
for (i = 0; i < length; i++) {
array_float[i] = PyFloat_AsDouble(value_fast_items[i]);
case sizeof(float): {
float *array_float = array;
for (i = 0; i < length; i++) {
array_float[i] = PyFloat_AsDouble(value_fast_items[i]);
}
break;
}
default: {
/* Internal error. */
BLI_assert_unreachable();
}
}
}
else if (type == &PyLong_Type) {
/* could use is_double for 'long int' but no use now */
int *array_int = array;
for (i = 0; i < length; i++) {
array_int[i] = PyC_Long_AsI32(value_fast_items[i]);
switch (array_item_size) {
case sizeof(int32_t): {
int32_t *array_int = array;
for (i = 0; i < length; i++) {
array_int[i] = PyC_Long_AsI32(value_fast_items[i]);
}
break;
}
default: {
/* Internal error. */
BLI_assert_unreachable();
}
}
}
else if (type == &PyBool_Type) {
bool *array_bool = array;
for (i = 0; i < length; i++) {
array_bool[i] = (PyLong_AsLong(value_fast_items[i]) != 0);
switch (array_item_size) {
case sizeof(bool): {
bool *array_bool = array;
for (i = 0; i < length; i++) {
array_bool[i] = (PyLong_AsLong(value_fast_items[i]) != 0);
}
break;
}
default: {
/* Internal error. */
BLI_assert_unreachable();
}
}
}
else {
@@ -123,10 +148,10 @@ int PyC_AsArray_FAST(void *array,
}
int PyC_AsArray(void *array,
const size_t array_item_size,
PyObject *value,
const Py_ssize_t length,
const PyTypeObject *type,
const bool is_double,
const char *error_prefix)
{
PyObject *value_fast;
@@ -136,7 +161,7 @@ int PyC_AsArray(void *array,
return -1;
}
ret = PyC_AsArray_FAST(array, value_fast, length, type, is_double, error_prefix);
ret = PyC_AsArray_FAST(array, array_item_size, value_fast, length, type, error_prefix);
Py_DECREF(value_fast);
return ret;
}