summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
Diffstat (limited to 'numpy')
-rw-r--r--numpy/core/include/numpy/experimental_dtype_api.h55
-rw-r--r--numpy/core/src/multiarray/experimental_public_dtype_api.c45
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) {