00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef __UT_QuickSort__
00016 #define __UT_QuickSort__
00017
00018 #include "UT_API.h"
00019 #include <stddef.h>
00020 #include "UT_IntArray.h"
00021
00022
00023
00024
00025
00026
00027
00028
00029 UT_API void UTquickSelect(void *base, size_t nel, size_t nth, size_t width,
00030 int (*compar)(const void *, const void *));
00031 UT_API void UTquickSelect(int *base, size_t nel, size_t nth,
00032 int (*compar)(int, int));
00033
00034
00035 #if 0
00036 typedef int UTcompareFunc(void * , const void *, const void *);
00037 #endif
00038
00039
00040
00041 class UT_API UT_QuickSort
00042 {
00043 public:
00044 UT_QuickSort();
00045 virtual ~UT_QuickSort();
00046
00047
00048
00049
00050
00051
00052
00053 UT_QuickSort& sort(unsigned int *input, unsigned int nb,
00054 int useindex = 1,
00055 bool signedvalues=true);
00056 UT_QuickSort& sort(fpreal32 *input, unsigned int nb,
00057 int useindex = 1);
00058 UT_QuickSort& sort(fpreal64 *input, unsigned int nb,
00059 int useindex = 1);
00060
00061
00062 enum compareType {
00063 COMPARE_INT,
00064 COMPARE_UINT,
00065 COMPARE_FLOAT
00066 };
00067
00068
00069
00070
00071 UT_QuickSort& sort(void *input, size_t size, unsigned int nb,
00072 compareType type);
00073
00074 #if 0
00075
00076 static void sort(void *input, size_t size, unsigned int nb,
00077 void *userdata, UTcompareFunc *cmp);
00078 #endif
00079
00080
00081
00082 int* getIndices() { return &myIndices(0); }
00083
00084 int operator()(int idx) { return myIndices((unsigned)idx); }
00085
00086
00087
00088
00089
00090 UT_QuickSort& resetIndices() { myIndices.resize(0); return *this; }
00091
00092
00093 int64 getUsedRam() const
00094 { return myIndices.getMemoryUsage(); }
00095 protected:
00096 UT_IntArray myIndices;
00097
00098
00099
00100
00101
00102 static void uisort(unsigned int *input, int *index, int len);
00103 static void sisort(int *input, int *index, int len);
00104 static void fisort(fpreal32 *input, int *index, int len);
00105 static void fisort(fpreal32 *input, int len);
00106 static void disort(fpreal64 *input, int *index, int len);
00107 static void disort(fpreal64 *input, int len);
00108 static void sisort(int *input, int len);
00109 static void uisort(unsigned int *input, int len);
00110 static void disort(void *input, size_t size, int len, char *tinput);
00111 static void fisort(void *input, size_t size, int len, char *tinput);
00112 static void sisort(void *input, size_t size, int len, char *tinput);
00113 static void uisort(void *input, size_t size, int len, char *tinput);
00114
00115
00116 static void urecurse(unsigned int *input, int *index, int len);
00117 static void srecurse(int *input, int *index, int len);
00118 static void frecurse(fpreal32 *input, int *index, int len);
00119 static void drecurse(fpreal64 *input, int *index, int len);
00120
00121 static void frecurse(fpreal32 *input, int len);
00122 static void drecurse(fpreal64 *input, int len);
00123 static void srecurse(int *input, int len);
00124 static void urecurse(unsigned int *input, int len);
00125
00126 static void drecurse(void *input, size_t size, int len,
00127 char *tinput);
00128 static void frecurse(void *input, size_t size, int len,
00129 char *tinput);
00130 static void srecurse(void *input, size_t size, int len,
00131 char *tinput);
00132 static void urecurse(void *input, size_t size, int len,
00133 char *tinput);
00134 };
00135
00136 #endif