Index: third_party/cython/src/Cython/Includes/cpython/array.pxd |
diff --git a/third_party/cython/src/Cython/Includes/cpython/array.pxd b/third_party/cython/src/Cython/Includes/cpython/array.pxd |
new file mode 100644 |
index 0000000000000000000000000000000000000000..769e0fb4ea355bb86ef2ef14471a279d0730ea6d |
--- /dev/null |
+++ b/third_party/cython/src/Cython/Includes/cpython/array.pxd |
@@ -0,0 +1,161 @@ |
+""" |
+ array.pxd |
+ |
+ Cython interface to Python's array.array module. |
+ |
+ * 1D contiguous data view |
+ * tools for fast array creation, maximum C-speed and handiness |
+ * suitable as allround light weight auto-array within Cython code too |
+ |
+ Usage: |
+ |
+ >>> cimport array |
+ |
+ Usage through Cython buffer interface (Py2.3+): |
+ |
+ >>> def f(arg1, unsigned i, double dx) |
+ ... array.array[double] a = arg1 |
+ ... a[i] += dx |
+ |
+ Fast C-level new_array(_zeros), resize_array, copy_array, Py_SIZE(obj), |
+ zero_array |
+ |
+ cdef array.array[double] k = array.copy(d) |
+ cdef array.array[double] n = array.array(d, Py_SIZE(d) * 2 ) |
+ cdef array.array[double] m = array.zeros_like(FLOAT_TEMPLATE) |
+ array.resize(f, 200000) |
+ |
+ Zero overhead with naked data pointer views by union: |
+ _f, _d, _i, _c, _u, ... |
+ => Original C array speed + Python dynamic memory management |
+ |
+ cdef array.array a = inarray |
+ if |
+ a._d[2] += 0.66 # use as double array without extra casting |
+ |
+ float *subview = vector._f + 10 # starting from 10th element |
+ unsigned char *subview_buffer = vector._B + 4 |
+ |
+ Suitable as lightweight arrays intra Cython without speed penalty. |
+ Replacement for C stack/malloc arrays; no trouble with refcounting, |
+ mem.leaks; seamless Python compatibility, buffer() optional |
+ |
+ |
+ last changes: 2009-05-15 rk |
+ : 2009-12-06 bp |
+ : 2012-05-02 andreasvc |
+ : (see revision control) |
+""" |
+from libc.string cimport strcat, strncat, \ |
+ memset, memchr, memcmp, memcpy, memmove |
+ |
+from cpython.object cimport Py_SIZE |
+from cpython.ref cimport PyTypeObject, Py_TYPE |
+from cpython.exc cimport PyErr_BadArgument |
+from cpython.mem cimport PyMem_Malloc, PyMem_Free |
+ |
+cdef extern from *: # Hard-coded utility code hack. |
+ ctypedef class array.array [object arrayobject] |
+ ctypedef object GETF(array a, Py_ssize_t ix) |
+ ctypedef object SETF(array a, Py_ssize_t ix, object o) |
+ ctypedef struct arraydescr: # [object arraydescr]: |
+ int typecode |
+ int itemsize |
+ GETF getitem # PyObject * (*getitem)(struct arrayobject *, Py_ssize_t); |
+ SETF setitem # int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *); |
+ |
+ ctypedef union __data_union: |
+ # views of ob_item: |
+ float* as_floats # direct float pointer access to buffer |
+ double* as_doubles # double ... |
+ int* as_ints |
+ unsigned int *as_uints |
+ unsigned char *as_uchars |
+ signed char *as_schars |
+ char *as_chars |
+ unsigned long *as_ulongs |
+ long *as_longs |
+ short *as_shorts |
+ unsigned short *as_ushorts |
+ Py_UNICODE *as_pyunicodes |
+ void *as_voidptr |
+ |
+ ctypedef class array.array [object arrayobject]: |
+ cdef __cythonbufferdefaults__ = {'ndim' : 1, 'mode':'c'} |
+ |
+ cdef: |
+ Py_ssize_t ob_size |
+ arraydescr* ob_descr # struct arraydescr *ob_descr; |
+ __data_union data |
+ |
+ def __getbuffer__(self, Py_buffer* info, int flags): |
+ # This implementation of getbuffer is geared towards Cython |
+ # requirements, and does not yet fullfill the PEP. |
+ # In particular strided access is always provided regardless |
+ # of flags |
+ item_count = Py_SIZE(self) |
+ |
+ info.suboffsets = NULL |
+ info.buf = self.data.as_chars |
+ info.readonly = 0 |
+ info.ndim = 1 |
+ info.itemsize = self.ob_descr.itemsize # e.g. sizeof(float) |
+ info.len = info.itemsize * item_count |
+ |
+ info.shape = <Py_ssize_t*> PyMem_Malloc(sizeof(Py_ssize_t) + 2) |
+ if not info.shape: |
+ raise MemoryError() |
+ info.shape[0] = item_count # constant regardless of resizing |
+ info.strides = &info.itemsize |
+ |
+ info.format = <char*> (info.shape + 1) |
+ info.format[0] = self.ob_descr.typecode |
+ info.format[1] = 0 |
+ info.obj = self |
+ |
+ def __releasebuffer__(self, Py_buffer* info): |
+ PyMem_Free(info.shape) |
+ |
+ array newarrayobject(PyTypeObject* type, Py_ssize_t size, arraydescr *descr) |
+ |
+ # fast resize/realloc |
+ # not suitable for small increments; reallocation 'to the point' |
+ int resize(array self, Py_ssize_t n) except -1 |
+ # efficient for small increments (not in Py2.3-) |
+ int resize_smart(array self, Py_ssize_t n) except -1 |
+ |
+ |
+cdef inline array clone(array template, Py_ssize_t length, bint zero): |
+ """ fast creation of a new array, given a template array. |
+ type will be same as template. |
+ if zero is true, new array will be initialized with zeroes.""" |
+ op = newarrayobject(Py_TYPE(template), length, template.ob_descr) |
+ if zero and op is not None: |
+ memset(op.data.as_chars, 0, length * op.ob_descr.itemsize) |
+ return op |
+ |
+cdef inline array copy(array self): |
+ """ make a copy of an array. """ |
+ op = newarrayobject(Py_TYPE(self), Py_SIZE(self), self.ob_descr) |
+ memcpy(op.data.as_chars, self.data.as_chars, Py_SIZE(op) * op.ob_descr.itemsize) |
+ return op |
+ |
+cdef inline int extend_buffer(array self, char* stuff, Py_ssize_t n) except -1: |
+ """ efficent appending of new stuff of same type |
+ (e.g. of same array type) |
+ n: number of elements (not number of bytes!) """ |
+ cdef Py_ssize_t itemsize = self.ob_descr.itemsize |
+ cdef Py_ssize_t origsize = Py_SIZE(self) |
+ resize_smart(self, origsize + n) |
+ memcpy(self.data.as_chars + origsize * itemsize, stuff, n * itemsize) |
+ return 0 |
+ |
+cdef inline int extend(array self, array other) except -1: |
+ """ extend array with data from another array; types must match. """ |
+ if self.ob_descr.typecode != other.ob_descr.typecode: |
+ PyErr_BadArgument() |
+ return extend_buffer(self, other.data.as_chars, Py_SIZE(other)) |
+ |
+cdef inline void zero(array self): |
+ """ set all elements of array to zero. """ |
+ memset(self.data.as_chars, 0, Py_SIZE(self) * self.ob_descr.itemsize) |