Spaces:
Runtime error
Runtime error
| /////////////// 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) | |
| // | |
| // 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 *); | |
| char *formats; | |
| } 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; | |
| unsigned long long *as_ulonglongs; | |
| long long *as_longlongs; | |
| 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 */ | |
| int ob_exports; /* Number of exported buffers */ | |
| }; | |
| // 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; | |
| __Pyx_SET_SIZE(op, 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; | |
| } | |
| PyObject* newarrayobject(PyTypeObject *type, Py_ssize_t size, | |
| struct arraydescr *descr); | |
| // 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; | |
| __Pyx_SET_SIZE(self, n); | |
| self->allocated = n; | |
| return 0; | |
| } | |
| // suitable for small increments; over allocation 50% ; | |
| 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 && n*4 > self->allocated) { | |
| __Pyx_SET_SIZE(self, n); | |
| return 0; | |
| } | |
| newsize = n + (n / 2) + 1; | |
| if (newsize <= n) { /* overflow */ | |
| PyErr_NoMemory(); | |
| return -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; | |
| __Pyx_SET_SIZE(self, n); | |
| self->allocated = newsize; | |
| return 0; | |
| } | |
| /* _ARRAYARRAY_H */ | |