|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _ARRAYARRAY_H |
|
|
#define _ARRAYARRAY_H |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct arraydescr { |
|
|
int typecode; |
|
|
int itemsize; |
|
|
PyObject * (*getitem)(struct arrayobject *, Py_ssize_t); |
|
|
int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *); |
|
|
#if PY_MAJOR_VERSION >= 3 |
|
|
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; |
|
|
#if PY_MAJOR_VERSION >= 3 |
|
|
unsigned long long *as_ulonglongs; |
|
|
long long *as_longlongs; |
|
|
#endif |
|
|
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; |
|
|
#if PY_MAJOR_VERSION >= 3 |
|
|
int ob_exports; |
|
|
#endif |
|
|
}; |
|
|
|
|
|
#ifndef NO_NEWARRAY_INLINE |
|
|
|
|
|
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; |
|
|
|
|
|
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; |
|
|
} |
|
|
#else |
|
|
PyObject* newarrayobject(PyTypeObject *type, Py_ssize_t size, |
|
|
struct arraydescr *descr); |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
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; |
|
|
} |
|
|
|
|
|
|
|
|
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) { |
|
|
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; |
|
|
} |
|
|
|
|
|
#endif |
|
|
|
|
|
|