diff options
Diffstat (limited to 'numpy')
| -rw-r--r-- | numpy/core/include/numpy/experimental_dtype_api.h | 55 | ||||
| -rw-r--r-- | numpy/core/src/multiarray/experimental_public_dtype_api.c | 45 |
2 files changed, 99 insertions, 1 deletions
diff --git a/numpy/core/include/numpy/experimental_dtype_api.h b/numpy/core/include/numpy/experimental_dtype_api.h index 7d289d730..159e76f94 100644 --- a/numpy/core/include/numpy/experimental_dtype_api.h +++ b/numpy/core/include/numpy/experimental_dtype_api.h @@ -371,6 +371,61 @@ PyArray_GetDefaultDescr(PyArray_DTypeMeta *DType) } +typedef PyArray_DTypeMeta *get_builtin_dtype_from_typenum(int); +/* + * Helper to fetch a builtin NumPy DType using the type number API. + * This function cannot fail, but must only be used together with NPY_DOUBLE, + * etc. + * Eventually, we may expose these directly in the API + */ +#define PyArray_DTypeFromTypeNum \ + ((get_builtin_dtype_from_typenum *)(__experimental_dtype_api_table[7])) + + +/* + * NumPy's builtin DTypes: + * TODO: Should these be dereferenced: `(&(PyArray_DTypeMeta *)table[10]`? + */ +#define PyArray_BoolDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[10]) +/* Integers */ +#define PyArray_ByteDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[11]) +#define PyArray_UByteDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[12]) +#define PyArray_ShortDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[13]) +#define PyArray_UShortDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[14]) +#define PyArray_IntDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[15]) +#define PyArray_UIntDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[16]) +#define PyArray_LongDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[17]) +#define PyArray_ULongDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[18]) +#define PyArray_LongLongDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[19]) +#define PyArray_ULongLongDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[20]) +/* Integer aliases */ +#define PyArray_Int8Type ((PyArray_DTypeMeta *)__experimental_dtype_api_table[21]) +#define PyArray_UInt8DType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[22]) +#define PyArray_Int16DType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[23]) +#define PyArray_UInt16DType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[24]) +#define PyArray_Int32DType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[25]) +#define PyArray_UInt32DType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[26]) +#define PyArray_Int64DType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[27]) +#define PyArray_UInt64DType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[28]) +#define PyArray_IntpDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[29]) +#define PyArray_UIntpDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[30]) +/* Floats */ +#define PyArray_HalfType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[31]) +#define PyArray_FloatDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[32]) +#define PyArray_DoubleDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[33]) +#define PyArray_LongDoubleDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[34]) +/* Complex */ +#define PyArray_CFloatDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[35]) +#define PyArray_CDoubleDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[36]) +#define PyArray_CLongDoubleDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[37]) +/* String/Bytes */ +#define PyArray_StringDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[38]) +#define PyArray_UnicodeDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[39]) +/* Datetime/Timedelta */ +#define PyArray_DatetimeDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[40]) +#define PyArray_TimedeltaDType ((PyArray_DTypeMeta *)__experimental_dtype_api_table[41]) + + /* * ******************************** * Initialization diff --git a/numpy/core/src/multiarray/experimental_public_dtype_api.c b/numpy/core/src/multiarray/experimental_public_dtype_api.c index a603ea529..266553314 100644 --- a/numpy/core/src/multiarray/experimental_public_dtype_api.c +++ b/numpy/core/src/multiarray/experimental_public_dtype_api.c @@ -374,7 +374,7 @@ _PyArray_GetDefaultDescr(PyArray_DTypeMeta *DType) NPY_NO_EXPORT PyObject * _get_experimental_dtype_api(PyObject *NPY_UNUSED(mod), PyObject *arg) { - static void *experimental_api_table[] = { + static void *experimental_api_table[42] = { &PyUFunc_AddLoopFromSpec, &PyUFunc_AddPromoter, &PyArrayDTypeMeta_Type, @@ -383,7 +383,50 @@ _get_experimental_dtype_api(PyObject *NPY_UNUSED(mod), PyObject *arg) &PyArray_PromoteDTypeSequence, &_PyArray_GetDefaultDescr, NULL, + NULL, + NULL, + /* NumPy's builtin DTypes (starting at offset 10 going to 41) */ }; + if (experimental_api_table[10] == NULL) { + experimental_api_table[10] = PyArray_DTypeFromTypeNum(NPY_BOOL); + /* Integers */ + experimental_api_table[11] = PyArray_DTypeFromTypeNum(NPY_BYTE); + experimental_api_table[12] = PyArray_DTypeFromTypeNum(NPY_UBYTE); + experimental_api_table[13] = PyArray_DTypeFromTypeNum(NPY_SHORT); + experimental_api_table[14] = PyArray_DTypeFromTypeNum(NPY_USHORT); + experimental_api_table[15] = PyArray_DTypeFromTypeNum(NPY_INT); + experimental_api_table[16] = PyArray_DTypeFromTypeNum(NPY_UINT); + experimental_api_table[17] = PyArray_DTypeFromTypeNum(NPY_LONG); + experimental_api_table[18] = PyArray_DTypeFromTypeNum(NPY_ULONG); + experimental_api_table[19] = PyArray_DTypeFromTypeNum(NPY_LONGLONG); + experimental_api_table[20] = PyArray_DTypeFromTypeNum(NPY_ULONGLONG); + /* Integer aliases */ + experimental_api_table[21] = PyArray_DTypeFromTypeNum(NPY_INT8); + experimental_api_table[22] = PyArray_DTypeFromTypeNum(NPY_UINT8); + experimental_api_table[23] = PyArray_DTypeFromTypeNum(NPY_INT16); + experimental_api_table[24] = PyArray_DTypeFromTypeNum(NPY_UINT16); + experimental_api_table[25] = PyArray_DTypeFromTypeNum(NPY_INT32); + experimental_api_table[26] = PyArray_DTypeFromTypeNum(NPY_UINT32); + experimental_api_table[27] = PyArray_DTypeFromTypeNum(NPY_INT64); + experimental_api_table[28] = PyArray_DTypeFromTypeNum(NPY_UINT64); + experimental_api_table[29] = PyArray_DTypeFromTypeNum(NPY_INTP); + experimental_api_table[30] = PyArray_DTypeFromTypeNum(NPY_UINTP); + /* Floats */ + experimental_api_table[31] = PyArray_DTypeFromTypeNum(NPY_HALF); + experimental_api_table[32] = PyArray_DTypeFromTypeNum(NPY_FLOAT); + experimental_api_table[33] = PyArray_DTypeFromTypeNum(NPY_DOUBLE); + experimental_api_table[34] = PyArray_DTypeFromTypeNum(NPY_LONGDOUBLE); + /* Complex */ + experimental_api_table[35] = PyArray_DTypeFromTypeNum(NPY_CFLOAT); + experimental_api_table[36] = PyArray_DTypeFromTypeNum(NPY_CDOUBLE); + experimental_api_table[37] = PyArray_DTypeFromTypeNum(NPY_CLONGDOUBLE); + /* String/Bytes */ + experimental_api_table[38] = PyArray_DTypeFromTypeNum(NPY_STRING); + experimental_api_table[39] = PyArray_DTypeFromTypeNum(NPY_UNICODE); + /* Datetime/Timedelta */ + experimental_api_table[40] = PyArray_DTypeFromTypeNum(NPY_DATETIME); + experimental_api_table[41] = PyArray_DTypeFromTypeNum(NPY_TIMEDELTA); + } char *env = getenv("NUMPY_EXPERIMENTAL_DTYPE_API"); if (env == NULL || strcmp(env, "1") != 0) { |
