ndarrayobject.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. /*
  2. * DON'T INCLUDE THIS DIRECTLY.
  3. */
  4. #ifndef NPY_NDARRAYOBJECT_H
  5. #define NPY_NDARRAYOBJECT_H
  6. #ifdef __cplusplus
  7. #define CONFUSE_EMACS {
  8. #define CONFUSE_EMACS2 }
  9. extern "C" CONFUSE_EMACS
  10. #undef CONFUSE_EMACS
  11. #undef CONFUSE_EMACS2
  12. /* ... otherwise a semi-smart identer (like emacs) tries to indent
  13. everything when you're typing */
  14. #endif
  15. #include <Python.h>
  16. #include "ndarraytypes.h"
  17. /* Includes the "function" C-API -- these are all stored in a
  18. list of pointers --- one for each file
  19. The two lists are concatenated into one in multiarray.
  20. They are available as import_array()
  21. */
  22. #include "__multiarray_api.h"
  23. /* C-API that requries previous API to be defined */
  24. #define PyArray_DescrCheck(op) (((PyObject*)(op))->ob_type==&PyArrayDescr_Type)
  25. #define PyArray_Check(op) PyObject_TypeCheck(op, &PyArray_Type)
  26. #define PyArray_CheckExact(op) (((PyObject*)(op))->ob_type == &PyArray_Type)
  27. #define PyArray_HasArrayInterfaceType(op, type, context, out) \
  28. ((((out)=PyArray_FromStructInterface(op)) != Py_NotImplemented) || \
  29. (((out)=PyArray_FromInterface(op)) != Py_NotImplemented) || \
  30. (((out)=PyArray_FromArrayAttr(op, type, context)) != \
  31. Py_NotImplemented))
  32. #define PyArray_HasArrayInterface(op, out) \
  33. PyArray_HasArrayInterfaceType(op, NULL, NULL, out)
  34. #define PyArray_IsZeroDim(op) (PyArray_Check(op) && \
  35. (PyArray_NDIM((PyArrayObject *)op) == 0))
  36. #define PyArray_IsScalar(obj, cls) \
  37. (PyObject_TypeCheck(obj, &Py##cls##ArrType_Type))
  38. #define PyArray_CheckScalar(m) (PyArray_IsScalar(m, Generic) || \
  39. PyArray_IsZeroDim(m))
  40. #if PY_MAJOR_VERSION >= 3
  41. #define PyArray_IsPythonNumber(obj) \
  42. (PyFloat_Check(obj) || PyComplex_Check(obj) || \
  43. PyLong_Check(obj) || PyBool_Check(obj))
  44. #define PyArray_IsIntegerScalar(obj) (PyLong_Check(obj) \
  45. || PyArray_IsScalar((obj), Integer))
  46. #define PyArray_IsPythonScalar(obj) \
  47. (PyArray_IsPythonNumber(obj) || PyBytes_Check(obj) || \
  48. PyUnicode_Check(obj))
  49. #else
  50. #define PyArray_IsPythonNumber(obj) \
  51. (PyInt_Check(obj) || PyFloat_Check(obj) || PyComplex_Check(obj) || \
  52. PyLong_Check(obj) || PyBool_Check(obj))
  53. #define PyArray_IsIntegerScalar(obj) (PyInt_Check(obj) \
  54. || PyLong_Check(obj) \
  55. || PyArray_IsScalar((obj), Integer))
  56. #define PyArray_IsPythonScalar(obj) \
  57. (PyArray_IsPythonNumber(obj) || PyString_Check(obj) || \
  58. PyUnicode_Check(obj))
  59. #endif
  60. #define PyArray_IsAnyScalar(obj) \
  61. (PyArray_IsScalar(obj, Generic) || PyArray_IsPythonScalar(obj))
  62. #define PyArray_CheckAnyScalar(obj) (PyArray_IsPythonScalar(obj) || \
  63. PyArray_CheckScalar(obj))
  64. #define PyArray_GETCONTIGUOUS(m) (PyArray_ISCONTIGUOUS(m) ? \
  65. Py_INCREF(m), (m) : \
  66. (PyArrayObject *)(PyArray_Copy(m)))
  67. #define PyArray_SAMESHAPE(a1,a2) ((PyArray_NDIM(a1) == PyArray_NDIM(a2)) && \
  68. PyArray_CompareLists(PyArray_DIMS(a1), \
  69. PyArray_DIMS(a2), \
  70. PyArray_NDIM(a1)))
  71. #define PyArray_SIZE(m) PyArray_MultiplyList(PyArray_DIMS(m), PyArray_NDIM(m))
  72. #define PyArray_NBYTES(m) (PyArray_ITEMSIZE(m) * PyArray_SIZE(m))
  73. #define PyArray_FROM_O(m) PyArray_FromAny(m, NULL, 0, 0, 0, NULL)
  74. #define PyArray_FROM_OF(m,flags) PyArray_CheckFromAny(m, NULL, 0, 0, flags, \
  75. NULL)
  76. #define PyArray_FROM_OT(m,type) PyArray_FromAny(m, \
  77. PyArray_DescrFromType(type), 0, 0, 0, NULL)
  78. #define PyArray_FROM_OTF(m, type, flags) \
  79. PyArray_FromAny(m, PyArray_DescrFromType(type), 0, 0, \
  80. (((flags) & NPY_ARRAY_ENSURECOPY) ? \
  81. ((flags) | NPY_ARRAY_DEFAULT) : (flags)), NULL)
  82. #define PyArray_FROMANY(m, type, min, max, flags) \
  83. PyArray_FromAny(m, PyArray_DescrFromType(type), min, max, \
  84. (((flags) & NPY_ARRAY_ENSURECOPY) ? \
  85. (flags) | NPY_ARRAY_DEFAULT : (flags)), NULL)
  86. #define PyArray_ZEROS(m, dims, type, is_f_order) \
  87. PyArray_Zeros(m, dims, PyArray_DescrFromType(type), is_f_order)
  88. #define PyArray_EMPTY(m, dims, type, is_f_order) \
  89. PyArray_Empty(m, dims, PyArray_DescrFromType(type), is_f_order)
  90. #define PyArray_FILLWBYTE(obj, val) memset(PyArray_DATA(obj), val, \
  91. PyArray_NBYTES(obj))
  92. #define PyArray_REFCOUNT(obj) (((PyObject *)(obj))->ob_refcnt)
  93. #define NPY_REFCOUNT PyArray_REFCOUNT
  94. #define NPY_MAX_ELSIZE (2 * NPY_SIZEOF_LONGDOUBLE)
  95. #define PyArray_ContiguousFromAny(op, type, min_depth, max_depth) \
  96. PyArray_FromAny(op, PyArray_DescrFromType(type), min_depth, \
  97. max_depth, NPY_ARRAY_DEFAULT, NULL)
  98. #define PyArray_EquivArrTypes(a1, a2) \
  99. PyArray_EquivTypes(PyArray_DESCR(a1), PyArray_DESCR(a2))
  100. #define PyArray_EquivByteorders(b1, b2) \
  101. (((b1) == (b2)) || (PyArray_ISNBO(b1) == PyArray_ISNBO(b2)))
  102. #define PyArray_SimpleNew(nd, dims, typenum) \
  103. PyArray_New(&PyArray_Type, nd, dims, typenum, NULL, NULL, 0, 0, NULL)
  104. #define PyArray_SimpleNewFromData(nd, dims, typenum, data) \
  105. PyArray_New(&PyArray_Type, nd, dims, typenum, NULL, \
  106. data, 0, NPY_ARRAY_CARRAY, NULL)
  107. #define PyArray_SimpleNewFromDescr(nd, dims, descr) \
  108. PyArray_NewFromDescr(&PyArray_Type, descr, nd, dims, \
  109. NULL, NULL, 0, NULL)
  110. #define PyArray_ToScalar(data, arr) \
  111. PyArray_Scalar(data, PyArray_DESCR(arr), (PyObject *)arr)
  112. /* These might be faster without the dereferencing of obj
  113. going on inside -- of course an optimizing compiler should
  114. inline the constants inside a for loop making it a moot point
  115. */
  116. #define PyArray_GETPTR1(obj, i) ((void *)(PyArray_BYTES(obj) + \
  117. (i)*PyArray_STRIDES(obj)[0]))
  118. #define PyArray_GETPTR2(obj, i, j) ((void *)(PyArray_BYTES(obj) + \
  119. (i)*PyArray_STRIDES(obj)[0] + \
  120. (j)*PyArray_STRIDES(obj)[1]))
  121. #define PyArray_GETPTR3(obj, i, j, k) ((void *)(PyArray_BYTES(obj) + \
  122. (i)*PyArray_STRIDES(obj)[0] + \
  123. (j)*PyArray_STRIDES(obj)[1] + \
  124. (k)*PyArray_STRIDES(obj)[2]))
  125. #define PyArray_GETPTR4(obj, i, j, k, l) ((void *)(PyArray_BYTES(obj) + \
  126. (i)*PyArray_STRIDES(obj)[0] + \
  127. (j)*PyArray_STRIDES(obj)[1] + \
  128. (k)*PyArray_STRIDES(obj)[2] + \
  129. (l)*PyArray_STRIDES(obj)[3]))
  130. static NPY_INLINE void
  131. PyArray_XDECREF_ERR(PyArrayObject *arr)
  132. {
  133. if (arr != NULL) {
  134. if (PyArray_FLAGS(arr) & NPY_ARRAY_UPDATEIFCOPY) {
  135. PyArrayObject *base = (PyArrayObject *)PyArray_BASE(arr);
  136. PyArray_ENABLEFLAGS(base, NPY_ARRAY_WRITEABLE);
  137. PyArray_CLEARFLAGS(arr, NPY_ARRAY_UPDATEIFCOPY);
  138. }
  139. Py_DECREF(arr);
  140. }
  141. }
  142. #define PyArray_DESCR_REPLACE(descr) do { \
  143. PyArray_Descr *_new_; \
  144. _new_ = PyArray_DescrNew(descr); \
  145. Py_XDECREF(descr); \
  146. descr = _new_; \
  147. } while(0)
  148. /* Copy should always return contiguous array */
  149. #define PyArray_Copy(obj) PyArray_NewCopy(obj, NPY_CORDER)
  150. #define PyArray_FromObject(op, type, min_depth, max_depth) \
  151. PyArray_FromAny(op, PyArray_DescrFromType(type), min_depth, \
  152. max_depth, NPY_ARRAY_BEHAVED | \
  153. NPY_ARRAY_ENSUREARRAY, NULL)
  154. #define PyArray_ContiguousFromObject(op, type, min_depth, max_depth) \
  155. PyArray_FromAny(op, PyArray_DescrFromType(type), min_depth, \
  156. max_depth, NPY_ARRAY_DEFAULT | \
  157. NPY_ARRAY_ENSUREARRAY, NULL)
  158. #define PyArray_CopyFromObject(op, type, min_depth, max_depth) \
  159. PyArray_FromAny(op, PyArray_DescrFromType(type), min_depth, \
  160. max_depth, NPY_ARRAY_ENSURECOPY | \
  161. NPY_ARRAY_DEFAULT | \
  162. NPY_ARRAY_ENSUREARRAY, NULL)
  163. #define PyArray_Cast(mp, type_num) \
  164. PyArray_CastToType(mp, PyArray_DescrFromType(type_num), 0)
  165. #define PyArray_Take(ap, items, axis) \
  166. PyArray_TakeFrom(ap, items, axis, NULL, NPY_RAISE)
  167. #define PyArray_Put(ap, items, values) \
  168. PyArray_PutTo(ap, items, values, NPY_RAISE)
  169. /* Compatibility with old Numeric stuff -- don't use in new code */
  170. #define PyArray_FromDimsAndData(nd, d, type, data) \
  171. PyArray_FromDimsAndDataAndDescr(nd, d, PyArray_DescrFromType(type), \
  172. data)
  173. /*
  174. Check to see if this key in the dictionary is the "title"
  175. entry of the tuple (i.e. a duplicate dictionary entry in the fields
  176. dict.
  177. */
  178. #define NPY_TITLE_KEY(key, value) ((PyTuple_GET_SIZE((value))==3) && \
  179. (PyTuple_GET_ITEM((value), 2) == (key)))
  180. #define DEPRECATE(msg) PyErr_WarnEx(PyExc_DeprecationWarning,msg,1)
  181. #define DEPRECATE_FUTUREWARNING(msg) PyErr_WarnEx(PyExc_FutureWarning,msg,1)
  182. #ifdef __cplusplus
  183. }
  184. #endif
  185. #endif /* NPY_NDARRAYOBJECT_H */