diff options
| author | Charles Harris <charlesr.harris@gmail.com> | 2009-07-25 23:10:27 +0000 |
|---|---|---|
| committer | Charles Harris <charlesr.harris@gmail.com> | 2009-07-25 23:10:27 +0000 |
| commit | 0a34a25112328173eed3dafe20bdb0ff7371d2fa (patch) | |
| tree | 13707a39454c362d6f0f7faa04b8b6eb24a841b0 | |
| parent | 56ba569132e1f5da6d06a3a9f989c37f43e75cc4 (diff) | |
| download | numpy-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.src | 245 |
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; |
