| 1 | /*************** Csort H Declares Source Code File (.H) ****************/ |
| 2 | /* Name: CSORT.H Version 1.2 */ |
| 3 | /* */ |
| 4 | /* (C) Copyright to the author Olivier BERTRAND 2000-2012 */ |
| 5 | /* */ |
| 6 | /* This file contains the CSORT class declares (not 64-bits ready) */ |
| 7 | /* */ |
| 8 | /* Note on use of this class: This class is meant to be used as a */ |
| 9 | /* base class by the calling class. This is because the comparison */ |
| 10 | /* routine must belong to both CSORT and the calling class. */ |
| 11 | /* This avoids to pass explicitly to it the calling "this" pointer. */ |
| 12 | /***********************************************************************/ |
| 13 | #if !defined(CSORT_DEFINED) |
| 14 | #define CSORT_DEFINED |
| 15 | |
| 16 | #include <math.h> /* Required for log function */ |
| 17 | #undef DOMAIN // Was defined in math.h |
| 18 | |
| 19 | /***********************************************************************/ |
| 20 | /* Constant and external definitions. */ |
| 21 | /***********************************************************************/ |
| 22 | #define THRESH 4 /* Threshold for insertion (was 4) */ |
| 23 | #define MTHRESH 6 /* Threshold for median */ |
| 24 | |
| 25 | //extern FILE *debug; /* Debug file */ |
| 26 | |
| 27 | typedef int* const CPINT; |
| 28 | |
| 29 | /***********************************************************************/ |
| 30 | /* This is the CSORT base class declaration. */ |
| 31 | /***********************************************************************/ |
| 32 | class DllExport CSORT { |
| 33 | public: |
| 34 | // Constructor |
| 35 | CSORT(bool cns, int th = THRESH, int mth = MTHRESH); |
| 36 | virtual ~CSORT() {} |
| 37 | protected: |
| 38 | // Implementation |
| 39 | /*********************************************************************/ |
| 40 | /* qsortx/qstx are NOT conservative but use less storage space. */ |
| 41 | /* qsortc/qstc ARE conservative but use more storage space. */ |
| 42 | /*********************************************************************/ |
| 43 | int Qsortx(void); /* Index quick/insert sort */ |
| 44 | void Qstx(int *base, int *max); /* Preliminary quick sort */ |
| 45 | int Qsortc(void); /* Conservative q/ins sort */ |
| 46 | void Qstc(int *base, int *max); /* Preliminary quick sort */ |
| 47 | void Istc(int *base, int *hi, int *max); /* Insertion sort routine */ |
| 48 | |
| 49 | public: |
| 50 | // Methods |
| 51 | int Qsort(PGLOBAL g, int n); /* Sort calling routine */ |
| 52 | //virtual void Printf(PGLOBAL g, FILE *f, uint n); |
| 53 | //virtual void Prints(PGLOBAL g, char *ps, uint z); |
| 54 | #ifdef DEBTRACE |
| 55 | int GetNcmp(void) {return num_comp;} |
| 56 | #endif |
| 57 | |
| 58 | protected: |
| 59 | // Overridable |
| 60 | virtual int Qcompare(int *, int *) = 0; /* Item compare routine */ |
| 61 | #ifdef DEBTRACE |
| 62 | virtual void DebugSort(int ph, int n, int *base, int *mid, int *tmp); |
| 63 | #endif |
| 64 | |
| 65 | public: |
| 66 | // Utility |
| 67 | static void SetCmpNum(void) |
| 68 | {for (int i = 1; i < 1000; i++) Cpn[i] = Cmpnum(i); Limit = 1000;} |
| 69 | protected: |
| 70 | static size_t Cmpnum(int n) |
| 71 | #if defined(AIX) |
| 72 | {return (n < Limit) ? Cpn[n] |
| 73 | : (size_t)round(1.0 + (double)n * (log2((double)n) - 1.0));} |
| 74 | #else // !AIX |
| 75 | {return (n < Limit) ? Cpn[n] |
| 76 | : (size_t)(1.5 + (double)n * (log((double)n)/Lg2 - 1.0));} |
| 77 | #endif // !AIX |
| 78 | |
| 79 | |
| 80 | // Members |
| 81 | static int Limit; /* Size of precalculated array */ |
| 82 | static size_t Cpn[1000]; /* Precalculated cmpnum values */ |
| 83 | static double Lg2; /* Precalculated log(2) value */ |
| 84 | PGLOBAL G; |
| 85 | PDBUSER Dup; /* Used for progress info */ |
| 86 | bool Cons; /* true for conservative sort */ |
| 87 | int Thresh; /* Threshold for using qsort */ |
| 88 | int Mthresh; /* Threshold for median find */ |
| 89 | int Nitem; /* Number of items to sort */ |
| 90 | MBLOCK Index; /* Index allocation block */ |
| 91 | MBLOCK Offset; /* Offset allocation block */ |
| 92 | CPINT &Pex; /* Reference to sort index */ |
| 93 | CPINT &Pof; /* Reference to offset array */ |
| 94 | int *Swix; /* Pointer on EQ/GT work area */ |
| 95 | int Savmax; /* Saved ProgMax value */ |
| 96 | int Savcur; /* Saved ProgCur value */ |
| 97 | LPCSTR Savstep; /* Saved progress step */ |
| 98 | #ifdef DEBTRACE |
| 99 | int num_comp; /* Number of quick sort calls */ |
| 100 | #endif |
| 101 | }; // end of class CSORT |
| 102 | |
| 103 | #endif // CSORT_DEFINED |
| 104 | |
| 105 | |