diff options
author | Mark Wiebe <mwiebe@enthought.com> | 2011-06-21 13:07:40 -0500 |
---|---|---|
committer | Mark Wiebe <mwiebe@enthought.com> | 2011-06-21 13:07:40 -0500 |
commit | 70de35b64bfafd534b7f817bc2033bd443742c96 (patch) | |
tree | b507537efd885c9e908b412c871c862a39ca97c5 | |
parent | d82752c2411e5cda1b4fb4e67d3dea7cdd6c1852 (diff) | |
download | numpy-70de35b64bfafd534b7f817bc2033bd443742c96.tar.gz |
ENH: dtype: Use PyDataType_HASFIELDS, add a flag constant for aligned struct
-rw-r--r-- | numpy/core/include/numpy/ndarraytypes.h | 3 | ||||
-rw-r--r-- | numpy/core/src/multiarray/arraytypes.c.src | 18 | ||||
-rw-r--r-- | numpy/core/src/multiarray/descriptor.c | 77 | ||||
-rw-r--r-- | numpy/core/src/multiarray/getset.c | 2 | ||||
-rw-r--r-- | numpy/core/src/multiarray/mapping.c | 8 | ||||
-rw-r--r-- | numpy/core/src/multiarray/methods.c | 4 | ||||
-rw-r--r-- | numpy/core/src/multiarray/scalarapi.c | 2 | ||||
-rw-r--r-- | numpy/core/src/multiarray/scalartypes.c.src | 2 |
8 files changed, 81 insertions, 35 deletions
diff --git a/numpy/core/include/numpy/ndarraytypes.h b/numpy/core/include/numpy/ndarraytypes.h index 701afee82..7c8824794 100644 --- a/numpy/core/include/numpy/ndarraytypes.h +++ b/numpy/core/include/numpy/ndarraytypes.h @@ -502,7 +502,8 @@ typedef struct { #define NPY_USE_GETITEM 0x20 /* Use f.setitem when setting creating 0-d array from this data-type.*/ #define NPY_USE_SETITEM 0x40 -/* define NPY_IS_COMPLEX */ +/* A sticky flag specifically for structured arrays */ +#define NPY_ALIGNED_STRUCT 0x80 /* *These are inherited for global data-type if any data-types in the diff --git a/numpy/core/src/multiarray/arraytypes.c.src b/numpy/core/src/multiarray/arraytypes.c.src index 28ce33605..3a0f22743 100644 --- a/numpy/core/src/multiarray/arraytypes.c.src +++ b/numpy/core/src/multiarray/arraytypes.c.src @@ -544,7 +544,7 @@ VOID_getitem(char *ip, PyArrayObject *ap) int itemsize; descr = ap->descr; - if (descr->names != NULL) { + if (PyDataType_HASFIELDS(descr)) { PyObject *key; PyObject *names; int i, n; @@ -3302,10 +3302,14 @@ static PyArray_ArrFuncs _Py@NAME@_ArrFuncs = { (PyArray_FillWithScalarFunc*)NULL, #if @sort@ { - quicksort_@suff@, heapsort_@suff@, mergesort_@suff@ + (PyArray_SortFunc *)quicksort_@suff@, + (PyArray_SortFunc *)heapsort_@suff@, + (PyArray_SortFunc *)mergesort_@suff@ }, { - aquicksort_@suff@, aheapsort_@suff@, amergesort_@suff@ + (PyArray_ArgSortFunc *)aquicksort_@suff@, + (PyArray_ArgSortFunc *)aheapsort_@suff@, + (PyArray_ArgSortFunc *)amergesort_@suff@ }, #else { @@ -3406,10 +3410,14 @@ static PyArray_ArrFuncs _Py@NAME@_ArrFuncs = { (PyArray_FillWithScalarFunc*)@from@_fillwithscalar, #if @sort@ { - quicksort_@suff@, heapsort_@suff@, mergesort_@suff@ + (PyArray_SortFunc *)quicksort_@suff@, + (PyArray_SortFunc *)heapsort_@suff@, + (PyArray_SortFunc *)mergesort_@suff@ }, { - aquicksort_@suff@, aheapsort_@suff@, amergesort_@suff@ + (PyArray_ArgSortFunc *)aquicksort_@suff@, + (PyArray_ArgSortFunc *)aheapsort_@suff@, + (PyArray_ArgSortFunc *)amergesort_@suff@ }, #else { diff --git a/numpy/core/src/multiarray/descriptor.c b/numpy/core/src/multiarray/descriptor.c index 601691711..e4f9e6ee5 100644 --- a/numpy/core/src/multiarray/descriptor.c +++ b/numpy/core/src/multiarray/descriptor.c @@ -641,7 +641,7 @@ _use_inherit(PyArray_Descr *type, PyObject *newobj, int *errflag) goto fail; } new->elsize = conv->elsize; - if (conv->names) { + if (PyDataType_HASFIELDS(conv)) { new->fields = conv->fields; Py_XINCREF(new->fields); new->names = conv->names; @@ -1453,7 +1453,7 @@ arraydescr_protocol_descr_get(PyArray_Descr *self) PyObject *dobj, *res; PyObject *_numpy_internal; - if (self->names == NULL) { + if (!PyDataType_HASFIELDS(self)) { /* get default */ dobj = PyTuple_New(2); if (dobj == NULL) { @@ -1501,7 +1501,7 @@ arraydescr_isbuiltin_get(PyArray_Descr *self) static int _arraydescr_isnative(PyArray_Descr *self) { - if (self->names == NULL) { + if (!PyDataType_HASFIELDS(self)) { return PyArray_ISNBO(self->byteorder); } else { @@ -1548,7 +1548,7 @@ arraydescr_isnative_get(PyArray_Descr *self) static PyObject * arraydescr_fields_get(PyArray_Descr *self) { - if (self->names == NULL) { + if (!PyDataType_HASFIELDS(self)) { Py_INCREF(Py_None); return Py_None; } @@ -1579,7 +1579,7 @@ arraydescr_hasobject_get(PyArray_Descr *self) static PyObject * arraydescr_names_get(PyArray_Descr *self) { - if (self->names == NULL) { + if (!PyDataType_HASFIELDS(self)) { Py_INCREF(Py_None); return Py_None; } @@ -1594,7 +1594,7 @@ arraydescr_names_set(PyArray_Descr *self, PyObject *val) int i; PyObject *new_names; PyObject *new_fields; - if (self->names == NULL) { + if (!PyDataType_HASFIELDS(self)) { PyErr_SetString(PyExc_ValueError, "there are no fields defined"); return -1; @@ -1926,7 +1926,7 @@ arraydescr_reduce(PyArray_Descr *self, PyObject *NPY_UNUSED(args)) PyTuple_SET_ITEM(state, 1, PyUString_FromFormat("%c", endian)); PyTuple_SET_ITEM(state, 2, arraydescr_subdescr_get(self)); - if (self->names) { + if (PyDataType_HASFIELDS(self)) { Py_INCREF(self->names); Py_INCREF(self->fields); PyTuple_SET_ITEM(state, 3, self->names); @@ -2366,7 +2366,7 @@ PyArray_DescrNewByteorder(PyArray_Descr *self, char newendian) new->byteorder = newendian; } } - if (new->names) { + if (PyDataType_HASFIELDS(new)) { PyObject *newfields; PyObject *key, *value; PyObject *newvalue; @@ -2448,7 +2448,7 @@ arraydescr_str(PyArray_Descr *self) { PyObject *sub; - if (self->names) { + if (PyDataType_HASFIELDS(self)) { PyObject *lst; lst = arraydescr_protocol_descr_get(self); if (!lst) { @@ -2478,7 +2478,8 @@ arraydescr_str(PyArray_Descr *self) PyObject *t = PyUString_FromString("("); PyObject *sh; p = arraydescr_str(self->subarray->base); - if (!self->subarray->base->names && !self->subarray->base->subarray) { + if (!PyDataType_HASFIELDS(self->subarray->base) && + !self->subarray->base->subarray) { PyObject *tmp=PyUString_FromString("'"); PyUString_Concat(&p, tmp); PyUString_ConcatAndDel(&tmp, p); @@ -2511,27 +2512,61 @@ arraydescr_str(PyArray_Descr *self) return sub; } +/* + * The dtype repr function specifically for structured arrays. + */ static PyObject * -arraydescr_repr(PyArray_Descr *self) +arraydescr_struct_repr(PyArray_Descr *self) { - PyObject *sub, *s; + PyObject *sub, *s, *t; + s = PyUString_FromString("dtype("); sub = arraydescr_str(self); if (sub == NULL) { - return sub; - } - if (!self->names && !self->subarray) { - PyObject *t=PyUString_FromString("'"); - PyUString_Concat(&sub, t); - PyUString_ConcatAndDel(&t, sub); - sub = t; + return NULL; } + + t=PyUString_FromString("'"); + PyUString_Concat(&sub, t); + PyUString_ConcatAndDel(&t, sub); + sub = t; + PyUString_ConcatAndDel(&s, sub); sub = PyUString_FromString(")"); PyUString_ConcatAndDel(&s, sub); return s; } +/* + * The general dtype repr function. + */ +static PyObject * +arraydescr_repr(PyArray_Descr *self) +{ + PyObject *sub, *s; + + if (PyDataType_HASFIELDS(self)) { + return arraydescr_struct_repr(self); + } + else { + s = PyUString_FromString("dtype("); + sub = arraydescr_str(self); + if (sub == NULL) { + return NULL; + } + if (!self->subarray) { + PyObject *t=PyUString_FromString("'"); + PyUString_Concat(&sub, t); + PyUString_ConcatAndDel(&t, sub); + sub = t; + } + PyUString_ConcatAndDel(&s, sub); + sub = PyUString_FromString(")"); + PyUString_ConcatAndDel(&s, sub); + return s; + } +} + static PyObject * arraydescr_richcompare(PyArray_Descr *self, PyObject *other, int cmp_op) { @@ -2611,7 +2646,7 @@ descr_length(PyObject *self0) { PyArray_Descr *self = (PyArray_Descr *)self0; - if (self->names) { + if (PyDataType_HASFIELDS(self)) { return PyTuple_GET_SIZE(self->names); } else { @@ -2642,7 +2677,7 @@ descr_subscript(PyArray_Descr *self, PyObject *op) { PyObject *retval; - if (!self->names) { + if (!PyDataType_HASFIELDS(self)) { PyObject *astr = arraydescr_str(self); #if defined(NPY_PY3K) PyObject *bstr = PyUnicode_AsUnicodeEscapeString(astr); diff --git a/numpy/core/src/multiarray/getset.c b/numpy/core/src/multiarray/getset.c index 3d2b6975e..7f78b2dd1 100644 --- a/numpy/core/src/multiarray/getset.c +++ b/numpy/core/src/multiarray/getset.c @@ -550,7 +550,7 @@ array_struct_get(PyArrayObject *self) inter->strides = NULL; } inter->data = self->data; - if (self->descr->names) { + if (PyDataType_HASFIELDS(self->descr)) { inter->descr = arraydescr_protocol_descr_get(self->descr); if (inter->descr == NULL) { PyErr_Clear(); diff --git a/numpy/core/src/multiarray/mapping.c b/numpy/core/src/multiarray/mapping.c index 31472333d..3f1d2957e 100644 --- a/numpy/core/src/multiarray/mapping.c +++ b/numpy/core/src/multiarray/mapping.c @@ -545,7 +545,7 @@ array_subscript(PyArrayObject *self, PyObject *op) if (PyString_Check(op) || PyUnicode_Check(op)) { PyObject *temp; - if (self->descr->names) { + if (PyDataType_HASFIELDS(self->descr)) { obj = PyDict_GetItem(self->descr->fields, op); if (obj != NULL) { PyArray_Descr *descr; @@ -573,7 +573,9 @@ array_subscript(PyArrayObject *self, PyObject *op) } /* Check for multiple field access */ - if (self->descr->names && PySequence_Check(op) && !PyTuple_Check(op)) { + if (PyDataType_HASFIELDS(self->descr) && + PySequence_Check(op) && + !PyTuple_Check(op)) { int seqlen, i; seqlen = PySequence_Size(op); for (i = 0; i < seqlen; i++) { @@ -797,7 +799,7 @@ array_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op) } if (PyString_Check(index) || PyUnicode_Check(index)) { - if (self->descr->names) { + if (PyDataType_HASFIELDS(self->descr)) { PyObject *obj; obj = PyDict_GetItem(self->descr->fields, index); diff --git a/numpy/core/src/multiarray/methods.c b/numpy/core/src/multiarray/methods.c index 9502bc9f0..08a82c2e8 100644 --- a/numpy/core/src/multiarray/methods.c +++ b/numpy/core/src/multiarray/methods.c @@ -1144,7 +1144,7 @@ array_sort(PyArrayObject *self, PyObject *args, PyObject *kwds) PyObject *new_name; PyObject *_numpy_internal; saved = self->descr; - if (saved->names == NULL) { + if (!PyDataType_HASFIELDS(saved)) { PyErr_SetString(PyExc_ValueError, "Cannot specify " \ "order when the array has no fields."); return NULL; @@ -1198,7 +1198,7 @@ array_argsort(PyArrayObject *self, PyObject *args, PyObject *kwds) PyObject *new_name; PyObject *_numpy_internal; saved = self->descr; - if (saved->names == NULL) { + if (!PyDataType_HASFIELDS(saved)) { PyErr_SetString(PyExc_ValueError, "Cannot specify " \ "order when the array has no fields."); return NULL; diff --git a/numpy/core/src/multiarray/scalarapi.c b/numpy/core/src/multiarray/scalarapi.c index d4ccc42c8..4607c2904 100644 --- a/numpy/core/src/multiarray/scalarapi.c +++ b/numpy/core/src/multiarray/scalarapi.c @@ -757,7 +757,7 @@ PyArray_Scalar(void *data, PyArray_Descr *descr, PyObject *base) Py_SIZE(vobj) = itemsize; vobj->flags = BEHAVED | OWNDATA; swap = 0; - if (descr->names) { + if (PyDataType_HASFIELDS(descr)) { if (base) { Py_INCREF(base); vobj->base = base; diff --git a/numpy/core/src/multiarray/scalartypes.c.src b/numpy/core/src/multiarray/scalartypes.c.src index 380ec3493..a0c08dcbf 100644 --- a/numpy/core/src/multiarray/scalartypes.c.src +++ b/numpy/core/src/multiarray/scalartypes.c.src @@ -1955,7 +1955,7 @@ static PyMethodDef @name@type_methods[] = { static Py_ssize_t voidtype_length(PyVoidScalarObject *self) { - if (!self->descr->names) { + if (!PyDataType_HASFIELDS(self->descr)) { return 0; } else { /* return the number of fields */ |