diff options
Diffstat (limited to 'numpy')
-rw-r--r-- | numpy/doc/swig/numpy.i | 14 | ||||
-rw-r--r-- | numpy/doc/swig/pyfragments.swg | 213 |
2 files changed, 225 insertions, 2 deletions
diff --git a/numpy/doc/swig/numpy.i b/numpy/doc/swig/numpy.i index 18749e54b..dbfb00e9d 100644 --- a/numpy/doc/swig/numpy.i +++ b/numpy/doc/swig/numpy.i @@ -318,8 +318,8 @@ int require_size(PyArrayObject* ary, npy_intp* size, int n) { /* %numpy_typemaps() macro * - * This macro defines a family of typemaps that allow pure input C - * arguments of the form + * This macro defines a family of 23 typemaps that allow C arguments + * of the form * * (DATA_TYPE IN_ARRAY1[ANY]) * (DATA_TYPE* IN_ARRAY1, DIM_TYPE DIM1) @@ -329,6 +329,10 @@ int require_size(PyArrayObject* ary, npy_intp* size, int n) { * (DATA_TYPE* IN_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) * (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* IN_ARRAY2) * + * (DATA_TYPE IN_ARRAY3[ANY][ANY][ANY]) + * (DATA_TYPE* IN_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) + * (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* IN_ARRAY3) + * * (DATA_TYPE INPLACE_ARRAY1[ANY]) * (DATA_TYPE* INPLACE_ARRAY1, DIM_TYPE DIM1) * (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1) @@ -337,12 +341,18 @@ int require_size(PyArrayObject* ary, npy_intp* size, int n) { * (DATA_TYPE* INPLACE_ARRAY2, DIM_TYPE DIM1, DIM_TYPE DIM2) * (DIM_TYPE DIM1, DIM_TYPE DIM2, DATA_TYPE* INPLACE_ARRAY2) * + * (DATA_TYPE INPLACE_ARRAY3[ANY][ANY][ANY]) + * (DATA_TYPE* INPLACE_ARRAY3, DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3) + * (DIM_TYPE DIM1, DIM_TYPE DIM2, DIM_TYPE DIM3, DATA_TYPE* INPLACE_ARRAY3) + * * (DATA_TYPE ARGOUT_ARRAY1[ANY]) * (DATA_TYPE* ARGOUT_ARRAY1, DIM_TYPE DIM1) * (DIM_TYPE DIM1, DATA_TYPE* ARGOUT_ARRAY1) * * (DATA_TYPE ARGOUT_ARRAY2[ANY][ANY]) * + * (DATA_TYPE ARGOUT_ARRAY3[ANY][ANY][ANY]) + * * where "DATA_TYPE" is any type supported by the NumPy module, and * "DIM_TYPE" is any int-like type suitable for specifying dimensions. * In python, the dimensions will not need to be specified (except for diff --git a/numpy/doc/swig/pyfragments.swg b/numpy/doc/swig/pyfragments.swg new file mode 100644 index 000000000..8a21c131e --- /dev/null +++ b/numpy/doc/swig/pyfragments.swg @@ -0,0 +1,213 @@ +// Override the SWIG_AsVal_frag(long) fragment so that it also checks +// for numpy scalar array types. The code through the %#endif is +// essentially cut-and-paste from pyprimtype.swg + +%fragment(SWIG_AsVal_frag(long), "header", + fragment="SWIG_CanCastAsInteger") +{ + SWIGINTERN int + SWIG_AsVal_dec(long)(PyObject * obj, long * val) + { + if (PyInt_Check(obj)) { + if (val) *val = PyInt_AsLong(obj); + return SWIG_OK; + } else if (PyLong_Check(obj)) { + long v = PyLong_AsLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_OK; + } else { + PyErr_Clear(); + } + } +%#ifdef SWIG_PYTHON_CAST_MODE + { + int dispatch = 0; + long v = PyInt_AsLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_AddCast(SWIG_OK); + } else { + PyErr_Clear(); + } + if (!dispatch) { + double d; + int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) { + if (val) *val = (long)(d); + return res; + } + } + } +%#endif + if (!PyArray_CheckScalar(obj)) return SWIG_TypeError; + int dataType = PyArray_TYPE(obj); + switch (dataType) + { + case NPY_BYTE: + { + char data = *((char*)PyArray_DATA(obj)); + if (val) *val = %numeric_cast(data, long); + break; + } + case NPY_UBYTE: + { + unsigned char data = *((unsigned char*)PyArray_DATA(obj)); + if (val) *val = %numeric_cast(data, long); + break; + } + case NPY_SHORT: + { + short data = *((short*)PyArray_DATA(obj)); + if (val) *val = %numeric_cast(data, long); + break; + } + case NPY_USHORT: + { + unsigned short data = *((unsigned short*)PyArray_DATA(obj)); + if (val) *val = %numeric_cast(data, long); + break; + } + case NPY_INT: + { + int data = *((int*)PyArray_DATA(obj)); + if (val) *val = %numeric_cast(data, long); + break; + } + case NPY_UINT: + { + unsigned int data = *((unsigned int*)PyArray_DATA(obj)); + if (data > NPY_MAX_LONG) return SWIG_OverflowError; + if (val) *val = %numeric_cast(data, long); + break; + } + case NPY_LONG: + { + *val = *((long*)PyArray_DATA(obj)); + break; + } + case NPY_ULONG: + { + unsigned long data = *((unsigned long*)PyArray_DATA(obj)); + if (data > NPY_MAX_LONG) return SWIG_OverflowError; + if (val) *val = %numeric_cast(data, long); + break; + } + default: + return SWIG_TypeError; + } + return SWIG_OK; + } +} + + + + +// Override the SWIG_AsVal_frag(unsigned long) fragment so that it +// also checks for numpy scalar array types. The code through the +// %#endif is essentially cut-and-paste from pyprimtype.swg + +%fragment(SWIG_AsVal_frag(unsigned long),"header", + fragment="SWIG_CanCastAsInteger") +{ + SWIGINTERN int + SWIG_AsVal_dec(unsigned long)(PyObject *obj, unsigned long *val) + { + if (PyInt_Check(obj)) { + long v = PyInt_AsLong(obj); + if (v >= 0) { + if (val) *val = v; + return SWIG_OK; + } else { + return SWIG_OverflowError; + } + } else if (PyLong_Check(obj)) { + unsigned long v = PyLong_AsUnsignedLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_OK; + } else { + PyErr_Clear(); + } + } +%#ifdef SWIG_PYTHON_CAST_MODE + { + int dispatch = 0; + unsigned long v = PyLong_AsUnsignedLong(obj); + if (!PyErr_Occurred()) { + if (val) *val = v; + return SWIG_AddCast(SWIG_OK); + } else { + PyErr_Clear(); + } + if (!dispatch) { + double d; + int res = SWIG_AddCast(SWIG_AsVal(double)(obj,&d)); + if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, ULONG_MAX)) { + if (val) *val = (unsigned long)(d); + return res; + } + } + } +%#endif + if (!PyArray_CheckScalar(obj)) return SWIG_TypeError; + int dataType = PyArray_TYPE(obj); + switch (dataType) + { + case NPY_BYTE: + { + char data = *((char*)PyArray_DATA(obj)); + if (data < 0) return SWIG_OverflowError; + if (val) *val = %numeric_cast(data, unsigned long); + break; + } + case NPY_UBYTE: + { + unsigned char data = *((unsigned char*)PyArray_DATA(obj)); + if (val) *val = %numeric_cast(data, unsigned long); + break; + } + case NPY_SHORT: + { + short data = *((short*)PyArray_DATA(obj)); + if (data < 0) return SWIG_OverflowError; + if (val) *val = %numeric_cast(data, unsigned long); + break; + } + case NPY_USHORT: + { + unsigned short data = *((unsigned short*)PyArray_DATA(obj)); + if (val) *val = %numeric_cast(data, unsigned long); + break; + } + case NPY_INT: + { + int data = *((int*)PyArray_DATA(obj)); + if (data < 0) return SWIG_OverflowError; + if (val) *val = %numeric_cast(data, unsigned long); + break; + } + case NPY_UINT: + { + unsigned int data = *((unsigned int*)PyArray_DATA(obj)); + if (val) *val = %numeric_cast(data, unsigned long); + break; + } + case NPY_LONG: + { + long data = *((long*)PyArray_DATA(obj)); + if (data < 0) return SWIG_OverflowError; + if (val) *val = %numeric_cast(data, unsigned long); + break; + } + case NPY_ULONG: + { + *val = *((unsigned long*)PyArray_DATA(obj)); + break; + } + default: + return SWIG_TypeError; + } + return SWIG_OK; + } +} |