#define SORT(x) \
do { \
int _nelems_ = ARRNELEMS(x); \
- if (_nelems_ > 1) \
- isort(ARRPTR(x), _nelems_); \
+ bool _ascending = true; \
+ isort(ARRPTR(x), _nelems_, &_ascending); \
} while(0)
/* sort the elements of the array and remove duplicates */
#define PREPAREARR(x) \
do { \
int _nelems_ = ARRNELEMS(x); \
- if (_nelems_ > 1) \
- if (isort(ARRPTR(x), _nelems_)) \
- (x) = _int_unique(x); \
+ bool _ascending = true; \
+ isort(ARRPTR(x), _nelems_, &_ascending); \
+ (x) = _int_unique(x); \
} while(0)
/* "wish" function */
/*
* useful functions
*/
-bool isort(int32 *a, int len);
+void isort(int32 *a, size_t len, void *arg);
ArrayType *new_intArrayType(int num);
ArrayType *copy_intArrayType(ArrayType *a);
ArrayType *resize_intArrayType(ArrayType *a, int num);
bool gin_bool_consistent(QUERYTYPE *query, bool *check);
bool query_has_required_values(QUERYTYPE *query);
-int compASC(const void *a, const void *b);
-int compDESC(const void *a, const void *b);
-
/* sort, either ascending or descending */
#define QSORT(a, direction) \
do { \
int _nelems_ = ARRNELEMS(a); \
- if (_nelems_ > 1) \
- qsort((void*) ARRPTR(a), _nelems_, sizeof(int32), \
- (direction) ? compASC : compDESC ); \
+ bool _ascending = (direction) ? true : false; \
+ isort(ARRPTR(a), _nelems_, &_ascending); \
} while(0)
#endif /* ___INT_H__ */
*size = (float) ARRNELEMS(a);
}
-/* qsort_arg comparison function for isort() */
-static int
+/* comparison function for isort() and _int_unique() */
+static inline int
isort_cmp(const void *a, const void *b, void *arg)
{
int32 aval = *((const int32 *) a);
int32 bval = *((const int32 *) b);
- if (aval < bval)
- return -1;
- if (aval > bval)
- return 1;
-
- /*
- * Report if we have any duplicates. If there are equal keys, qsort must
- * compare them at some point, else it wouldn't know whether one should go
- * before or after the other.
- */
- *((bool *) arg) = true;
+ if (*((bool *) arg))
+ {
+ /* compare for ascending order */
+ if (aval < bval)
+ return -1;
+ if (aval > bval)
+ return 1;
+ }
+ else
+ {
+ if (aval > bval)
+ return -1;
+ if (aval < bval)
+ return 1;
+ }
return 0;
}
-/* Sort the given data (len >= 2). Return true if any duplicates found */
-bool
-isort(int32 *a, int len)
-{
- bool r = false;
-
- qsort_arg(a, len, sizeof(int32), isort_cmp, &r);
- return r;
-}
+#define ST_SORT isort
+#define ST_ELEMENT_TYPE int32
+#define ST_COMPARE(a, b, ascending) isort_cmp(a, b, ascending)
+#define ST_COMPARE_ARG_TYPE void
+#define ST_SCOPE
+#define ST_DEFINE
+#include "lib/sort_template.h"
/* Create a new int array with room for "num" elements */
ArrayType *
_int_unique(ArrayType *r)
{
int num = ARRNELEMS(r);
- bool duplicates_found; /* not used */
+ bool ascending = true;
num = qunique_arg(ARRPTR(r), num, sizeof(int), isort_cmp,
- &duplicates_found);
+ &ascending);
return resize_intArrayType(r, num);
}
aa[0] = elem;
return result;
}
-
-int
-compASC(const void *a, const void *b)
-{
- return pg_cmp_s32(*(const int32 *) a, *(const int32 *) b);
-}
-
-int
-compDESC(const void *a, const void *b)
-{
- return pg_cmp_s32(*(const int32 *) b, *(const int32 *) a);
-}