@@ -719,6 +719,81 @@ array_indexing(PyObject *NPY_UNUSED(self), PyObject *args)
719719 return NULL;
720720}
721721
722+ /*
723+ * Test C-api PyArray_AsCArray item getter
724+ */
725+ static PyObject *
726+ test_as_c_array(PyObject *NPY_UNUSED(self), PyObject *args)
727+ {
728+ PyArrayObject *array_obj;
729+ npy_intp dims[3]; // max 3-dim
730+ npy_intp i=0, j=0, k=0;
731+ npy_intp num_dims = 0;
732+ PyArray_Descr *descr = NULL;
733+ double *array1 = NULL;
734+ double **array2 = NULL;
735+ double ***array3 = NULL;
736+ double temp = 9999;
737+
738+ if (!PyArg_ParseTuple(args, "O!l|ll",
739+ &PyArray_Type, &array_obj,
740+ &i, &j, &k)) {
741+ return NULL;
742+ }
743+
744+ if (NULL == array_obj) {
745+ return NULL;
746+ }
747+
748+ num_dims = PyArray_NDIM(array_obj);
749+ descr = PyArray_DESCR(array_obj);
750+
751+ switch (num_dims) {
752+ case 1:
753+ if (PyArray_AsCArray(
754+ (PyObject **) &array_obj,
755+ (void *) &array1,
756+ dims,
757+ 1,
758+ descr) < 0) {
759+ PyErr_SetString(PyExc_RuntimeError, "error converting 1D array");
760+ return NULL;
761+ }
762+ temp = array1[i];
763+ PyArray_Free((PyObject *) array_obj, (void *) array1);
764+ break;
765+ case 2:
766+ if (PyArray_AsCArray(
767+ (PyObject **) &array_obj,
768+ (void **) &array2,
769+ dims,
770+ 2,
771+ descr) < 0) {
772+ PyErr_SetString(PyExc_RuntimeError, "error converting 2D array");
773+ return NULL;
774+ }
775+ temp = array2[i][j];
776+ PyArray_Free((PyObject *) array_obj, (void *) array2);
777+ break;
778+ case 3:
779+ if (PyArray_AsCArray(
780+ (PyObject **) &array_obj,
781+ (void ***) &array3,
782+ dims,
783+ 3,
784+ descr) < 0) {
785+ PyErr_SetString(PyExc_RuntimeError, "error converting 3D array");
786+ return NULL;
787+ }
788+ temp = array3[i][j][k];
789+ PyArray_Free((PyObject *) array_obj, (void *) array3);
790+ break;
791+ default:
792+ PyErr_SetString(PyExc_ValueError, "array.ndim not in [1, 3]");
793+ return NULL;
794+ }
795+ return Py_BuildValue("f", temp);
796+ }
722797
723798/*
724799 * Test nditer of too large arrays using remove axis, etc.
@@ -850,6 +925,9 @@ static PyMethodDef Multiarray_TestsMethods[] = {
850925 {"array_indexing",
851926 array_indexing,
852927 METH_VARARGS, NULL},
928+ {"test_as_c_array",
929+ test_as_c_array,
930+ METH_VARARGS, NULL},
853931 {"test_nditer_too_large",
854932 test_nditer_too_large,
855933 METH_VARARGS, NULL},
0 commit comments