Index: third_party/cython/src/Cython/Utility/arrayarray.h |
diff --git a/third_party/cython/src/Cython/Utility/arrayarray.h b/third_party/cython/src/Cython/Utility/arrayarray.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e79a06ab6197c18d55e6f57016ee74d455aec49f |
--- /dev/null |
+++ b/third_party/cython/src/Cython/Utility/arrayarray.h |
@@ -0,0 +1,144 @@ |
+/////////////// ArrayAPI.proto /////////////// |
+ |
+// arrayarray.h |
+// |
+// Artificial C-API for Python's <array.array> type, |
+// used by array.pxd |
+// |
+// last changes: 2009-05-15 rk |
+// 2012-05-02 andreasvc |
+// (see revision control) |
+// |
+ |
+#ifndef _ARRAYARRAY_H |
+#define _ARRAYARRAY_H |
+ |
+// These two forward declarations are explicitly handled in the type |
+// declaration code, as including them here is too late for cython-defined |
+// types to use them. |
+// struct arrayobject; |
+// typedef struct arrayobject arrayobject; |
+ |
+// All possible arraydescr values are defined in the vector "descriptors" |
+// below. That's defined later because the appropriate get and set |
+// functions aren't visible yet. |
+typedef struct arraydescr { |
+ int typecode; |
+ int itemsize; |
+ PyObject * (*getitem)(struct arrayobject *, Py_ssize_t); |
+ int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *); |
+#if PY_VERSION_HEX >= 0x03000000 |
+ char *formats; |
+#endif |
+} arraydescr; |
+ |
+ |
+struct arrayobject { |
+ PyObject_HEAD |
+ Py_ssize_t ob_size; |
+ union { |
+ char *ob_item; |
+ float *as_floats; |
+ double *as_doubles; |
+ 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; |
+ } data; |
+ Py_ssize_t allocated; |
+ struct arraydescr *ob_descr; |
+ PyObject *weakreflist; /* List of weak references */ |
+#if PY_VERSION_HEX >= 0x03000000 |
+ int ob_exports; /* Number of exported buffers */ |
+#endif |
+}; |
+ |
+#ifndef NO_NEWARRAY_INLINE |
+// fast creation of a new array |
+static CYTHON_INLINE PyObject * newarrayobject(PyTypeObject *type, Py_ssize_t size, |
+ struct arraydescr *descr) { |
+ arrayobject *op; |
+ size_t nbytes; |
+ |
+ if (size < 0) { |
+ PyErr_BadInternalCall(); |
+ return NULL; |
+ } |
+ |
+ nbytes = size * descr->itemsize; |
+ // Check for overflow |
+ if (nbytes / descr->itemsize != (size_t)size) { |
+ return PyErr_NoMemory(); |
+ } |
+ op = (arrayobject *) type->tp_alloc(type, 0); |
+ if (op == NULL) { |
+ return NULL; |
+ } |
+ op->ob_descr = descr; |
+ op->allocated = size; |
+ op->weakreflist = NULL; |
+ op->ob_size = size; |
+ if (size <= 0) { |
+ op->data.ob_item = NULL; |
+ } |
+ else { |
+ op->data.ob_item = PyMem_NEW(char, nbytes); |
+ if (op->data.ob_item == NULL) { |
+ Py_DECREF(op); |
+ return PyErr_NoMemory(); |
+ } |
+ } |
+ return (PyObject *) op; |
+} |
+#else |
+PyObject* newarrayobject(PyTypeObject *type, Py_ssize_t size, |
+ struct arraydescr *descr); |
+#endif /* ifndef NO_NEWARRAY_INLINE */ |
+ |
+// fast resize (reallocation to the point) |
+// not designed for filing small increments (but for fast opaque array apps) |
+static CYTHON_INLINE int resize(arrayobject *self, Py_ssize_t n) { |
+ void *items = (void*) self->data.ob_item; |
+ PyMem_Resize(items, char, (size_t)(n * self->ob_descr->itemsize)); |
+ if (items == NULL) { |
+ PyErr_NoMemory(); |
+ return -1; |
+ } |
+ self->data.ob_item = (char*) items; |
+ self->ob_size = n; |
+ self->allocated = n; |
+ return 0; |
+} |
+ |
+// suitable for small increments; over allocation 50% ; |
+// Remains non-smart in Python 2.3- ; but exists for compatibility |
+static CYTHON_INLINE int resize_smart(arrayobject *self, Py_ssize_t n) { |
+ void *items = (void*) self->data.ob_item; |
+ Py_ssize_t newsize; |
+ if (n < self->allocated) { |
+ if (n*4 > self->allocated) { |
+ self->ob_size = n; |
+ return 0; |
+ } |
+ } |
+ newsize = n * 3 / 2 + 1; |
+ PyMem_Resize(items, char, (size_t)(newsize * self->ob_descr->itemsize)); |
+ if (items == NULL) { |
+ PyErr_NoMemory(); |
+ return -1; |
+ } |
+ self->data.ob_item = (char*) items; |
+ self->ob_size = n; |
+ self->allocated = newsize; |
+ return 0; |
+} |
+ |
+#endif |
+/* _ARRAYARRAY_H */ |