summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Harris <charlesr.harris@gmail.com>2009-07-25 23:10:27 +0000
committerCharles Harris <charlesr.harris@gmail.com>2009-07-25 23:10:27 +0000
commit0a34a25112328173eed3dafe20bdb0ff7371d2fa (patch)
tree13707a39454c362d6f0f7faa04b8b6eb24a841b0
parent56ba569132e1f5da6d06a3a9f989c37f43e75cc4 (diff)
downloadnumpy-0a34a25112328173eed3dafe20bdb0ff7371d2fa.tar.gz
Strange things going on with git/svn interaction. Let's see if they go.
-rw-r--r--numpy/core/src/_sortmodule.c.src245
1 files changed, 110 insertions, 135 deletions
diff --git a/numpy/core/src/_sortmodule.c.src b/numpy/core/src/_sortmodule.c.src
index c8466cf69..a72435c79 100644
--- a/numpy/core/src/_sortmodule.c.src
+++ b/numpy/core/src/_sortmodule.c.src
@@ -36,11 +36,7 @@
#define SMALL_QUICKSORT 15
#define SMALL_MERGESORT 20
#define SMALL_STRING 16
-#define SWAP(a,b) {SWAP_temp = (b); (b)=(a); (a) = SWAP_temp;}
-#define STRING_LT(pa, pb, len) (compare_string(pa, pb, len) < 0)
-#define STRING_LE(pa, pb, len) (compare_string(pa, pb, len) <= 0)
-#define UNICODE_LT(pa, pb, len) (compare_ucs4(pa, pb, len) < 0)
-#define UNICODE_LE(pa, pb, len) (compare_ucs4(pa, pb, len) <= 0)
+#define SWAP(a,b) {typeof(b) tmp = (b); (b)=(a); (a) = tmp;}
/*
@@ -52,77 +48,60 @@
/**begin repeat
*
+ * #TYPE = BOOL, BYTE, UBYTE, SHORT, USHORT, INT, UINT, LONG, ULONG,
+ * LONGLONG, ULONGLONG#
* #type = Bool, byte, ubyte, short, ushort, int, uint, long, ulong,
* longlong, ulonglong#
*/
-
NPY_INLINE static int
-@type@_lt(@type@ a, @type@ b)
+@TYPE@_LT(@type@ a, @type@ b)
{
return a < b;
}
-
-NPY_INLINE static int
-@type@_le(@type@ a, @type@ b)
-{
- return a <= b;
-}
-
/**end repeat**/
/**begin repeat
*
+ * #TYPE = FLOAT, DOUBLE, LONGDOUBLE#
* #type = float, double, longdouble#
*/
-
NPY_INLINE static int
-@type@_lt(@type@ a, @type@ b)
+@TYPE@_LT(@type@ a, @type@ b)
{
return a < b;
}
-
-NPY_INLINE static int
-@type@_le(@type@ a, @type@ b)
-{
- return a <= b;
-}
-
/**end repeat**/
/**begin repeat
*
+ * #TYPE = CFLOAT, CDOUBLE, CLONGDOUBLE#
* #type = cfloat, cdouble, clongdouble#
*/
-
NPY_INLINE static int
-@type@_lt(@type@ a, @type@ b)
+@TYPE@_LT(@type@ a, @type@ b)
{
return a.real < b.real || (a.real == b.real && a.imag < b.imag);
}
-
-NPY_INLINE static int
-@type@_le(@type@ a, @type@ b)
-{
- return a.real < b.real || (a.real == b.real && a.imag <= b.imag);
-}
-
/**end repeat**/
/* The PyObject functions are stubs for later use */
NPY_INLINE static int
-PyObject_lt(PyObject *pa, PyObject *pb)
+PyObject_LT(PyObject *pa, PyObject *pb)
{
return 0;
}
-NPY_INLINE static int
-PyObject_le(PyObject *pa, PyObject *pb)
+#define copy_string memcpy
+
+NPY_INLINE static void
+STRING_COPY(char *s1, char *s2, size_t len)
{
- return 0;
+ memcpy(s1, s2, len);
}
+
NPY_INLINE static void
-swap_string(char *s1, char *s2, size_t len)
+STRING_SWAP(char *s1, char *s2, size_t len)
{
while(len--) {
const char t = *s1;
@@ -133,23 +112,25 @@ swap_string(char *s1, char *s2, size_t len)
NPY_INLINE static int
-compare_string(char *s1, char *s2, size_t len)
+STRING_LT(char *s1, char *s2, size_t len)
{
const unsigned char *c1 = (unsigned char *)s1;
const unsigned char *c2 = (unsigned char *)s2;
size_t i;
+ int ret = 0;
for (i = 0; i < len; ++i) {
if (c1[i] != c2[i]) {
- return (c1[i] > c2[i]) ? 1 : -1;
+ ret = c1[i] < c2[i];
+ break;
}
}
- return 0;
+ return ret;
}
NPY_INLINE static void
-copy_ucs4(npy_ucs4 *s1, npy_ucs4 *s2, size_t len)
+UNICODE_COPY(npy_ucs4 *s1, npy_ucs4 *s2, size_t len)
{
while(len--) {
*s1++ = *s2++;
@@ -158,7 +139,7 @@ copy_ucs4(npy_ucs4 *s1, npy_ucs4 *s2, size_t len)
NPY_INLINE static void
-swap_ucs4(npy_ucs4 *s1, npy_ucs4 *s2, size_t len)
+UNICODE_SWAP(npy_ucs4 *s1, npy_ucs4 *s2, size_t len)
{
while(len--) {
const npy_ucs4 t = *s1;
@@ -169,16 +150,18 @@ swap_ucs4(npy_ucs4 *s1, npy_ucs4 *s2, size_t len)
NPY_INLINE static int
-compare_ucs4(npy_ucs4 *s1, npy_ucs4 *s2, size_t len)
+UNICODE_LT(npy_ucs4 *s1, npy_ucs4 *s2, size_t len)
{
size_t i;
+ int ret = 0;
for (i = 0; i < len; ++i) {
if (s1[i] != s2[i]) {
- return (s1[i] > s2[i]) ? 1 : -1;
+ ret = s1[i] < s2[i];
+ break;
}
}
- return 0;
+ return ret;
}
@@ -205,23 +188,23 @@ static int
{
@type@ *pl = start;
@type@ *pr = start + num - 1;
- @type@ vp, SWAP_temp;
+ @type@ vp;
@type@ *stack[PYA_QS_STACK], **sptr = stack, *pm, *pi, *pj, *pk;
for (;;) {
while ((pr - pl) > SMALL_QUICKSORT) {
/* quicksort partition */
pm = pl + ((pr - pl) >> 1);
- if (@type@_lt(*pm, *pl)) SWAP(*pm, *pl);
- if (@type@_lt(*pr, *pm)) SWAP(*pr, *pm);
- if (@type@_lt(*pm, *pl)) SWAP(*pm, *pl);
+ if (@TYPE@_LT(*pm, *pl)) SWAP(*pm, *pl);
+ if (@TYPE@_LT(*pr, *pm)) SWAP(*pr, *pm);
+ if (@TYPE@_LT(*pm, *pl)) SWAP(*pm, *pl);
vp = *pm;
pi = pl;
pj = pr - 1;
SWAP(*pm, *pj);
for (;;) {
- do ++pi; while (@type@_lt(*pi, vp));
- do --pj; while (@type@_lt(vp, *pj));
+ do ++pi; while (@TYPE@_LT(*pi, vp));
+ do --pj; while (@TYPE@_LT(vp, *pj));
if (pi >= pj) {
break;
}
@@ -247,7 +230,7 @@ static int
vp = *pi;
pj = pi;
pk = pi - 1;
- while (pj > pl && @type@_lt(vp, *pk)) {
+ while (pj > pl && @TYPE@_LT(vp, *pk)) {
*pj-- = *pk--;
}
*pj = vp;
@@ -266,7 +249,7 @@ static int
@TYPE@_aquicksort(@type@ *v, npy_intp* tosort, npy_intp num, void *NOT_USED)
{
@type@ vp;
- npy_intp *pl, *pr, SWAP_temp;
+ npy_intp *pl, *pr;
npy_intp *stack[PYA_QS_STACK], **sptr=stack, *pm, *pi, *pj, *pk, vi;
pl = tosort;
@@ -276,16 +259,16 @@ static int
while ((pr - pl) > SMALL_QUICKSORT) {
/* quicksort partition */
pm = pl + ((pr - pl) >> 1);
- if (@type@_lt(v[*pm],v[*pl])) SWAP(*pm,*pl);
- if (@type@_lt(v[*pr],v[*pm])) SWAP(*pr,*pm);
- if (@type@_lt(v[*pm],v[*pl])) SWAP(*pm,*pl);
+ if (@TYPE@_LT(v[*pm],v[*pl])) SWAP(*pm,*pl);
+ if (@TYPE@_LT(v[*pr],v[*pm])) SWAP(*pr,*pm);
+ if (@TYPE@_LT(v[*pm],v[*pl])) SWAP(*pm,*pl);
vp = v[*pm];
pi = pl;
pj = pr - 1;
SWAP(*pm,*pj);
for (;;) {
- do ++pi; while (@type@_lt(v[*pi],vp));
- do --pj; while (@type@_lt(vp,v[*pj]));
+ do ++pi; while (@TYPE@_LT(v[*pi],vp));
+ do --pj; while (@TYPE@_LT(vp,v[*pj]));
if (pi >= pj) {
break;
}
@@ -312,7 +295,7 @@ static int
vp = v[vi];
pj = pi;
pk = pi - 1;
- while (pj > pl && @type@_lt(vp, v[*pk])) {
+ while (pj > pl && @TYPE@_LT(vp, v[*pk])) {
*pj-- = *pk--;
}
*pj = vi;
@@ -340,10 +323,10 @@ static int
for (l = n>>1; l > 0; --l) {
tmp = a[l];
for (i = l, j = l<<1; j <= n;) {
- if (j < n && @type@_lt(a[j], a[j+1])) {
+ if (j < n && @TYPE@_LT(a[j], a[j+1])) {
j += 1;
}
- if (@type@_lt(tmp, a[j])) {
+ if (@TYPE@_LT(tmp, a[j])) {
a[i] = a[j];
i = j;
j += j;
@@ -360,10 +343,10 @@ static int
a[n] = a[1];
n -= 1;
for (i = 1, j = 2; j <= n;) {
- if (j < n && @type@_lt(a[j], a[j+1])) {
+ if (j < n && @TYPE@_LT(a[j], a[j+1])) {
j++;
}
- if (@type@_lt(tmp, a[j])) {
+ if (@TYPE@_LT(tmp, a[j])) {
a[i] = a[j];
i = j;
j += j;
@@ -388,10 +371,10 @@ static int
for (l = n>>1; l > 0; --l) {
tmp = a[l];
for (i = l, j = l<<1; j <= n;) {
- if (j < n && @type@_lt(v[a[j]], v[a[j+1]])) {
+ if (j < n && @TYPE@_LT(v[a[j]], v[a[j+1]])) {
j += 1;
}
- if (@type@_lt(v[tmp], v[a[j]])) {
+ if (@TYPE@_LT(v[tmp], v[a[j]])) {
a[i] = a[j];
i = j;
j += j;
@@ -408,10 +391,10 @@ static int
a[n] = a[1];
n -= 1;
for (i = 1, j = 2; j <= n;) {
- if (j < n && @type@_lt(v[a[j]], v[a[j+1]])) {
+ if (j < n && @TYPE@_LT(v[a[j]], v[a[j+1]])) {
j++;
}
- if (@type@_lt(v[tmp], v[a[j]])) {
+ if (@TYPE@_LT(v[tmp], v[a[j]])) {
a[i] = a[j];
i = j;
j += j;
@@ -442,11 +425,11 @@ static void
pj = pw;
pk = pl;
while (pj < pi && pm < pr) {
- if (@type@_le(*pj,*pm)) {
- *pk = *pj++;
+ if (@TYPE@_LT(*pm,*pj)) {
+ *pk = *pm++;
}
else {
- *pk = *pm++;
+ *pk = *pj++;
}
pk++;
}
@@ -460,7 +443,7 @@ static void
vp = *pi;
pj = pi;
pk = pi -1;
- while (pj > pl && @type@_lt(vp, *pk)) {
+ while (pj > pl && @TYPE@_LT(vp, *pk)) {
*pj-- = *pk--;
}
*pj = vp;
@@ -501,14 +484,14 @@ static void
*pi = *pj;
}
for (pk = pw, pm = pl; pk < pi && pj <= pr; ++pm) {
- if (@type@_le(v[*pk],v[*pj])) {
- *pm = *pk;
- ++pk;
- }
- else {
+ if (@TYPE@_LT(v[*pj],v[*pk])) {
*pm = *pj;
++pj;
}
+ else {
+ *pm = *pk;
+ ++pk;
+ }
}
for (; pk < pi; ++pm, ++pk) {
*pm = *pk;
@@ -519,7 +502,7 @@ static void
for (pi = pl + 1; pi <= pr; ++pi) {
vi = *pi;
vp = v[vi];
- for (pj = pi, pk = pi - 1; pj > pl && @type@_lt(vp, v[*pk]); --pj, --pk) {
+ for (pj = pi, pk = pi - 1; pj > pl && @TYPE@_LT(vp, v[*pk]); --pj, --pk) {
*pj = *pk;
}
*pj = vi;
@@ -556,18 +539,10 @@ static int
*/
-#define copy_string memcpy
-
-
-
/**begin repeat
*
* #TYPE = STRING, UNICODE#
* #type = char, PyArray_UCS4#
- * #lessthan = STRING_LT, UNICODE_LT#
- * #lessequal = STRING_LE, UNICODE_LE#
- * #swap = swap_string, swap_ucs4#
- * #copy = copy_string, copy_ucs4#
*/
static void
@@ -580,35 +555,35 @@ static void
pm = pl + (((pr - pl)/len) >> 1)*len;
@TYPE@_mergesort0(pl, pm, pw, vp, len);
@TYPE@_mergesort0(pm, pr, pw, vp, len);
- @copy@(pw, pl, pm - pl);
+ @TYPE@_COPY(pw, pl, pm - pl);
pi = pw + (pm - pl);
pj = pw;
pk = pl;
while (pj < pi && pm < pr) {
- if (@lessequal@(pj, pm, len)) {
- @copy@(pk, pj, len);
- pj += len;
+ if (@TYPE@_LT(pm, pj, len)) {
+ @TYPE@_COPY(pk, pm, len);
+ pm += len;
}
else {
- @copy@(pk, pm, len);
- pm += len;
+ @TYPE@_COPY(pk, pj, len);
+ pj += len;
}
pk += len;
}
- @copy@(pk, pj, pi - pj);
+ @TYPE@_COPY(pk, pj, pi - pj);
}
else {
/* insertion sort */
for (pi = pl + len; pi < pr; pi += len) {
- @copy@(vp, pi, len);
+ @TYPE@_COPY(vp, pi, len);
pj = pi;
pk = pi - len;
- while (pj > pl && @lessthan@(vp, pk, len)) {
- @copy@(pj, pk, len);
+ while (pj > pl && @TYPE@_LT(vp, pk, len)) {
+ @TYPE@_COPY(pj, pk, len);
pj -= len;
pk -= len;
}
- @copy@(pj, vp, len);
+ @TYPE@_COPY(pj, vp, len);
}
}
}
@@ -657,23 +632,23 @@ static int
while ((size_t)(pr - pl) > SMALL_QUICKSORT*len) {
/* quicksort partition */
pm = pl + (((pr - pl)/len) >> 1)*len;
- if (@lessthan@(pm, pl, len)) @swap@(pm, pl, len);
- if (@lessthan@(pr, pm, len)) @swap@(pr, pm, len);
- if (@lessthan@(pm, pl, len)) @swap@(pm, pl, len);
- @copy@(vp, pm, len);
+ if (@TYPE@_LT(pm, pl, len)) @TYPE@_SWAP(pm, pl, len);
+ if (@TYPE@_LT(pr, pm, len)) @TYPE@_SWAP(pr, pm, len);
+ if (@TYPE@_LT(pm, pl, len)) @TYPE@_SWAP(pm, pl, len);
+ @TYPE@_COPY(vp, pm, len);
pi = pl;
pj = pr - len;
- @swap@(pm, pj, len);
+ @TYPE@_SWAP(pm, pj, len);
for (;;) {
- do pi += len; while (@lessthan@(pi, vp, len));
- do pj -= len; while (@lessthan@(vp, pj, len));
+ do pi += len; while (@TYPE@_LT(pi, vp, len));
+ do pj -= len; while (@TYPE@_LT(vp, pj, len));
if (pi >= pj) {
break;
}
- @swap@(pi, pj, len);
+ @TYPE@_SWAP(pi, pj, len);
}
pk = pr - len;
- @swap@(pi, pk, len);
+ @TYPE@_SWAP(pi, pk, len);
/* push largest partition on stack */
if (pi - pl < pr - pi) {
*sptr++ = pi + len;
@@ -689,15 +664,15 @@ static int
/* insertion sort */
for (pi = pl + len; pi <= pr; pi += len) {
- @copy@(vp, pi, len);
+ @TYPE@_COPY(vp, pi, len);
pj = pi;
pk = pi - len;
- while (pj > pl && @lessthan@(vp, pk, len)) {
- @copy@(pj, pk, len);
+ while (pj > pl && @TYPE@_LT(vp, pk, len)) {
+ @TYPE@_COPY(pj, pk, len);
pj -= len;
pk -= len;
}
- @copy@(pj, vp, len);
+ @TYPE@_COPY(pj, vp, len);
}
if (sptr == stack) {
break;
@@ -720,12 +695,12 @@ static int
npy_intp i,j,l;
for (l = n>>1; l > 0; --l) {
- @copy@(tmp, a + l*len, len);
+ @TYPE@_COPY(tmp, a + l*len, len);
for (i = l, j = l<<1; j <= n;) {
- if (j < n && @lessthan@(a + j*len, a + (j+1)*len, len))
+ if (j < n && @TYPE@_LT(a + j*len, a + (j+1)*len, len))
j += 1;
- if (@lessthan@(tmp, a + j*len, len)) {
- @copy@(a + i*len, a + j*len, len);
+ if (@TYPE@_LT(tmp, a + j*len, len)) {
+ @TYPE@_COPY(a + i*len, a + j*len, len);
i = j;
j += j;
}
@@ -733,18 +708,18 @@ static int
break;
}
}
- @copy@(a + i*len, tmp, len);
+ @TYPE@_COPY(a + i*len, tmp, len);
}
for (; n > 1;) {
- @copy@(tmp, a + n*len, len);
- @copy@(a + n*len, a + len, len);
+ @TYPE@_COPY(tmp, a + n*len, len);
+ @TYPE@_COPY(a + n*len, a + len, len);
n -= 1;
for (i = 1, j = 2; j <= n;) {
- if (j < n && @lessthan@(a + j*len, a + (j+1)*len, len))
+ if (j < n && @TYPE@_LT(a + j*len, a + (j+1)*len, len))
j++;
- if (@lessthan@(tmp, a + j*len, len)) {
- @copy@(a + i*len, a + j*len, len);
+ if (@TYPE@_LT(tmp, a + j*len, len)) {
+ @TYPE@_COPY(a + i*len, a + j*len, len);
i = j;
j += j;
}
@@ -752,7 +727,7 @@ static int
break;
}
}
- @copy@(a + i*len, tmp, len);
+ @TYPE@_COPY(a + i*len, tmp, len);
}
free(tmp);
@@ -772,9 +747,9 @@ static int
for (l = n>>1; l > 0; --l) {
tmp = a[l];
for (i = l, j = l<<1; j <= n;) {
- if (j < n && @lessthan@(v + a[j]*len, v + a[j+1]*len, len))
+ if (j < n && @TYPE@_LT(v + a[j]*len, v + a[j+1]*len, len))
j += 1;
- if (@lessthan@(v + tmp*len, v + a[j]*len, len)) {
+ if (@TYPE@_LT(v + tmp*len, v + a[j]*len, len)) {
a[i] = a[j];
i = j;
j += j;
@@ -791,9 +766,9 @@ static int
a[n] = a[1];
n -= 1;
for (i = 1, j = 2; j <= n;) {
- if (j < n && @lessthan@(v + a[j]*len, v + a[j+1]*len, len))
+ if (j < n && @TYPE@_LT(v + a[j]*len, v + a[j+1]*len, len))
j++;
- if (@lessthan@(v + tmp*len, v + a[j]*len, len)) {
+ if (@TYPE@_LT(v + tmp*len, v + a[j]*len, len)) {
a[i] = a[j];
i = j;
j += j;
@@ -818,22 +793,22 @@ static int
npy_intp *pr = tosort + num - 1;
npy_intp *stack[PYA_QS_STACK];
npy_intp **sptr=stack;
- npy_intp *pm, *pi, *pj, *pk, vi, SWAP_temp;
+ npy_intp *pm, *pi, *pj, *pk, vi;
for (;;) {
while ((pr - pl) > SMALL_QUICKSORT) {
/* quicksort partition */
pm = pl + ((pr - pl) >> 1);
- if (@lessthan@(v + (*pm)*len, v + (*pl)*len, len)) SWAP(*pm, *pl);
- if (@lessthan@(v + (*pr)*len, v + (*pm)*len, len)) SWAP(*pr, *pm);
- if (@lessthan@(v + (*pm)*len, v + (*pl)*len, len)) SWAP(*pm, *pl);
+ if (@TYPE@_LT(v + (*pm)*len, v + (*pl)*len, len)) SWAP(*pm, *pl);
+ if (@TYPE@_LT(v + (*pr)*len, v + (*pm)*len, len)) SWAP(*pr, *pm);
+ if (@TYPE@_LT(v + (*pm)*len, v + (*pl)*len, len)) SWAP(*pm, *pl);
vp = v + (*pm)*len;
pi = pl;
pj = pr - 1;
SWAP(*pm,*pj);
for (;;) {
- do ++pi; while (@lessthan@(v + (*pi)*len, vp, len));
- do --pj; while (@lessthan@(vp, v + (*pj)*len, len));
+ do ++pi; while (@TYPE@_LT(v + (*pi)*len, vp, len));
+ do --pj; while (@TYPE@_LT(vp, v + (*pj)*len, len));
if (pi >= pj) {
break;
}
@@ -860,7 +835,7 @@ static int
vp = v + vi*len;
pj = pi;
pk = pi - 1;
- while (pj > pl && @lessthan@(vp, v + (*pk)*len, len)) {
+ while (pj > pl && @TYPE@_LT(vp, v + (*pk)*len, len)) {
*pj-- = *pk--;
}
*pj = vi;
@@ -893,10 +868,10 @@ static void
pj = pw;
pk = pl;
while (pj < pi && pm < pr) {
- if (@lessequal@(v + (*pj)*len, v + (*pm)*len, len)) {
- *pk = *pj++;
- } else {
+ if (@TYPE@_LT(v + (*pm)*len, v + (*pj)*len, len)) {
*pk = *pm++;
+ } else {
+ *pk = *pj++;
}
pk++;
}
@@ -910,7 +885,7 @@ static void
vp = v + vi*len;
pj = pi;
pk = pi -1;
- while (pj > pl && @lessthan@(vp, v + (*pk)*len, len)) {
+ while (pj > pl && @TYPE@_LT(vp, v + (*pk)*len, len)) {
*pj-- = *pk--;
}
*pj = vi;