summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wiebe <mwiebe@enthought.com>2011-06-21 13:07:40 -0500
committerMark Wiebe <mwiebe@enthought.com>2011-06-21 13:07:40 -0500
commit70de35b64bfafd534b7f817bc2033bd443742c96 (patch)
treeb507537efd885c9e908b412c871c862a39ca97c5
parentd82752c2411e5cda1b4fb4e67d3dea7cdd6c1852 (diff)
downloadnumpy-70de35b64bfafd534b7f817bc2033bd443742c96.tar.gz
ENH: dtype: Use PyDataType_HASFIELDS, add a flag constant for aligned struct
-rw-r--r--numpy/core/include/numpy/ndarraytypes.h3
-rw-r--r--numpy/core/src/multiarray/arraytypes.c.src18
-rw-r--r--numpy/core/src/multiarray/descriptor.c77
-rw-r--r--numpy/core/src/multiarray/getset.c2
-rw-r--r--numpy/core/src/multiarray/mapping.c8
-rw-r--r--numpy/core/src/multiarray/methods.c4
-rw-r--r--numpy/core/src/multiarray/scalarapi.c2
-rw-r--r--numpy/core/src/multiarray/scalartypes.c.src2
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 */