diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 18:00:34 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 18:00:34 +0000 |
commit | 3f619478f796eddbba6e39502fe941b285dd97b1 (patch) | |
tree | e2c7b5777f728320e5b5542b6213fd3591ba51e2 /storage/connect/csort.h | |
parent | Initial commit. (diff) | |
download | mariadb-upstream.tar.xz mariadb-upstream.zip |
Adding upstream version 1:10.11.6.upstream/1%10.11.6upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'storage/connect/csort.h')
-rw-r--r-- | storage/connect/csort.h | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/storage/connect/csort.h b/storage/connect/csort.h new file mode 100644 index 00000000..cce01df4 --- /dev/null +++ b/storage/connect/csort.h @@ -0,0 +1,104 @@ +/*************** Csort H Declares Source Code File (.H) ****************/ +/* Name: CSORT.H Version 1.2 */ +/* */ +/* (C) Copyright to the author Olivier BERTRAND 2000-2012 */ +/* */ +/* This file contains the CSORT class declares (not 64-bits ready) */ +/* */ +/* Note on use of this class: This class is meant to be used as a */ +/* base class by the calling class. This is because the comparison */ +/* routine must belong to both CSORT and the calling class. */ +/* This avoids to pass explicitly to it the calling "this" pointer. */ +/***********************************************************************/ +#if !defined(CSORT_DEFINED) +#define CSORT_DEFINED + +#include <math.h> /* Required for log function */ +#undef DOMAIN // Was defined in math.h + +/***********************************************************************/ +/* Constant and external definitions. */ +/***********************************************************************/ +#define THRESH 4 /* Threshold for insertion (was 4) */ +#define MTHRESH 6 /* Threshold for median */ + +//extern FILE *debug; /* Debug file */ + +typedef int* const CPINT; + +/***********************************************************************/ +/* This is the CSORT base class declaration. */ +/***********************************************************************/ +class DllExport CSORT { + public: + // Constructor + CSORT(bool cns, int th = THRESH, int mth = MTHRESH); + virtual ~CSORT() = default; + protected: + // Implementation + /*********************************************************************/ + /* qsortx/qstx are NOT conservative but use less storage space. */ + /* qsortc/qstc ARE conservative but use more storage space. */ + /*********************************************************************/ + int Qsortx(void); /* Index quick/insert sort */ + void Qstx(int *base, int *max); /* Preliminary quick sort */ + int Qsortc(void); /* Conservative q/ins sort */ + void Qstc(int *base, int *max); /* Preliminary quick sort */ + void Istc(int *base, int *hi, int *max); /* Insertion sort routine */ + + public: + // Methods + int Qsort(PGLOBAL g, int n); /* Sort calling routine */ +//virtual void Printf(PGLOBAL g, FILE *f, uint n); +//virtual void Prints(PGLOBAL g, char *ps, uint z); +#ifdef DEBTRACE + int GetNcmp(void) {return num_comp;} +#endif + + protected: + // Overridable + virtual int Qcompare(int *, int *) = 0; /* Item compare routine */ +#ifdef DEBTRACE + virtual void DebugSort(int ph, int n, int *base, int *mid, int *tmp); +#endif + + public: + // Utility + static void SetCmpNum(void) + {for (int i = 1; i < 1000; i++) Cpn[i] = Cmpnum(i); Limit = 1000;} + protected: + static size_t Cmpnum(int n) +#if defined(AIX) + {return (n < Limit) ? Cpn[n] + : (size_t)round(1.0 + (double)n * (log2((double)n) - 1.0));} +#else // !AIX + {return (n < Limit) ? Cpn[n] + : (size_t)(1.5 + (double)n * (log((double)n)/Lg2 - 1.0));} +#endif // !AIX + + + // Members + static int Limit; /* Size of precalculated array */ + static size_t Cpn[1000]; /* Precalculated cmpnum values */ + static double Lg2; /* Precalculated log(2) value */ + PGLOBAL G; + PDBUSER Dup; /* Used for progress info */ + bool Cons; /* true for conservative sort */ + int Thresh; /* Threshold for using qsort */ + int Mthresh; /* Threshold for median find */ + int Nitem; /* Number of items to sort */ + MBLOCK Index; /* Index allocation block */ + MBLOCK Offset; /* Offset allocation block */ + CPINT &Pex; /* Reference to sort index */ + CPINT &Pof; /* Reference to offset array */ + int *Swix; /* Pointer on EQ/GT work area */ + int Savmax; /* Saved ProgMax value */ + int Savcur; /* Saved ProgCur value */ + LPCSTR Savstep; /* Saved progress step */ +#ifdef DEBTRACE + int num_comp; /* Number of quick sort calls */ +#endif + }; // end of class CSORT + +#endif // CSORT_DEFINED + |