55 using namespace Opcode;
57 #define INVALIDATE_RANKS mCurrentSize|=0x80000000
58 #define VALIDATE_RANKS mCurrentSize&=0x7fffffff
59 #define CURRENT_SIZE (mCurrentSize&0x7fffffff)
60 #define INVALID_RANKS (mCurrentSize&0x80000000)
62 #define CHECK_RESIZE(n) \
63 if(n!=mPreviousSize) \
65 if(n>mCurrentSize) Resize(n); \
70 #define CREATE_HISTOGRAMS(type, buffer) \
72 ZeroMemory(mHistogram, 256*4*sizeof(udword)); \
75 ubyte* p = (ubyte*)input; \
76 ubyte* pe = &p[nb*4]; \
77 udword* h0= &mHistogram[0]; \
78 udword* h1= &mHistogram[256]; \
79 udword* h2= &mHistogram[512]; \
80 udword* h3= &mHistogram[768]; \
82 bool AlreadySorted = true; \
87 type* Running = (type*)buffer; \
88 type PrevVal = *Running; \
93 type Val = *Running++; \
95 if(Val<PrevVal) { AlreadySorted = false; break; } \
100 h0[*p++]++; h1[*p++]++; h2[*p++]++; h3[*p++]++; \
109 for(udword i=0;i<nb;i++) mRanks[i] = i; \
116 udword* Indices = mRanks; \
117 type PrevVal = (type)buffer[*Indices]; \
122 type Val = (type)buffer[*Indices++]; \
124 if(Val<PrevVal) { AlreadySorted = false; break; } \
129 h0[*p++]++; h1[*p++]++; h2[*p++]++; h3[*p++]++; \
135 if(AlreadySorted) { mNbHits++; return *this; } \
142 h0[*p++]++; h1[*p++]++; h2[*p++]++; h3[*p++]++; \
145 #define CHECK_PASS_VALIDITY(pass) \
147 udword* CurCount = &mHistogram[pass<<8]; \
150 bool PerformPass = true; \
161 ubyte UniqueVal = *(((ubyte*)input)+pass); \
164 if(CurCount[UniqueVal]==nb) PerformPass=false;
173 #ifndef RADIX_LOCAL_RAM
175 mHistogram =
new udword[256*4];
176 mOffset =
new udword[256];
190 #ifndef RADIX_LOCAL_RAM
204 bool RadixSort::Resize(
udword nb)
223 if(nb>CurSize) Resize(nb);
242 if(!input || !nb || nb&0x80000000)
return *
this;
250 #ifdef RADIX_LOCAL_RAM
266 udword NbNegativeValues = 0;
272 udword* h3= &mHistogram[768];
273 for(
udword i=128;
i<256;
i++) NbNegativeValues += h3[i];
294 for(
udword i=1;
i<256;
i++) mLink[i] = mLink[i-1] + CurCount[i-1];
303 mLink[0] = &mRanks2[NbNegativeValues];
305 for(i=1;i<128;i++) mLink[i] = mLink[i-1] + CurCount[i-1];
309 mLink[128] = mRanks2;
311 for(i=129;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1];
320 for(
udword i=0;i<nb;i++) *mLink[InputBytes[i<<2]]++ = i;
326 udword* IndicesEnd = &mRanks[nb];
327 while(Indices!=IndicesEnd)
331 *mLink[InputBytes[
id<<2]]++ = id;
336 udword* Tmp = mRanks; mRanks = mRanks2; mRanks2 = Tmp;
355 if(!input2 || !nb || nb&0x80000000)
return *
this;
365 #ifdef RADIX_LOCAL_RAM
383 udword NbNegativeValues = 0;
387 udword* h3= &mHistogram[768];
389 for(i=128;i<256;i++) NbNegativeValues += h3[i];
406 for(
udword i=1;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1];
414 for(
udword i=0;i<nb;i++) *mLink[InputBytes[i<<2]]++ = i;
420 udword* IndicesEnd = &mRanks[nb];
421 while(Indices!=IndicesEnd)
425 *mLink[InputBytes[
id<<2]]++ = id;
430 udword* Tmp = mRanks; mRanks = mRanks2; mRanks2 = Tmp;
442 mLink[0] = &mRanks2[NbNegativeValues];
444 for(i=1;i<128;i++) mLink[i] = mLink[i-1] + CurCount[i-1];
448 mLink[255] = mRanks2;
450 for(i=0;i<127;i++) mLink[254-i] = mLink[255-i] + CurCount[255-i];
452 for(i=128;i<256;i++) mLink[i] += CurCount[i];
459 udword Radix = input[i]>>24;
463 if(Radix<128) *mLink[Radix]++ = i;
464 else *(--mLink[Radix]) = i;
472 udword Radix = input[mRanks[i]]>>24;
476 if(Radix<128) *mLink[Radix]++ = mRanks[i];
477 else *(--mLink[Radix]) = mRanks[i];
481 udword* Tmp = mRanks; mRanks = mRanks2; mRanks2 = Tmp;
491 for(
udword i=0;i<nb;i++) mRanks2[i] = nb-i-1;
496 for(
udword i=0;i<nb;i++) mRanks2[i] = mRanks[nb-i-1];
500 udword* Tmp = mRanks; mRanks = mRanks2; mRanks2 = Tmp;
517 #ifndef RADIX_LOCAL_RAM
518 UsedRam += 256*4*
sizeof(
udword);
519 UsedRam += 256*
sizeof(
udword);