removed manual digit usage by recursive template trickz
This commit is contained in:
parent
c7fe2f0507
commit
cfc9a050e4
24
magyarsort.h
24
magyarsort.h
@ -34,13 +34,27 @@ namespace MagyarSort {
|
|||||||
return shifted & (DIGIT_RANGE - 1);
|
return shifted & (DIGIT_RANGE - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Functor: no class should be generated I think (compiler should be smart) */
|
||||||
|
template<int DIGIT>
|
||||||
|
struct OccurenceMagic : public OccurenceMagic<DIGIT - 1> {
|
||||||
|
inline OccurenceMagic(uint32_t arr[], size_t i, size_t *radicsOut) noexcept
|
||||||
|
: OccurenceMagic<DIGIT -1 >(arr, i, radicsOut) {
|
||||||
|
// parents run first so template recursion runs DIGIT=0 first...
|
||||||
|
++radicsOut[getDigit<DIGIT>(arr[i]) + DIGIT_RANGE * DIGIT];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
/** Ends template recursion */
|
||||||
|
template<>
|
||||||
|
struct OccurenceMagic<-1> {
|
||||||
|
inline OccurenceMagic(uint32_t arr[], size_t i, size_t *radicsOut) noexcept {
|
||||||
|
/* empty */
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static inline void calcOccurences(uint32_t arr[], size_t size, size_t *radicsOut) {
|
static inline void calcOccurences(uint32_t arr[], size_t size, size_t *radicsOut) {
|
||||||
for(size_t i = 0; i < size; ++i) {
|
for(size_t i = 0; i < size; ++i) {
|
||||||
// TODO: manual digits!
|
// Creates no object, struct is empty
|
||||||
++radicsOut[getDigit<0>(arr[i]) + DIGIT_RANGE * 0];
|
OccurenceMagic<DIGITS - 1>(arr, i, radicsOut);
|
||||||
++radicsOut[getDigit<1>(arr[i]) + DIGIT_RANGE * 1];
|
|
||||||
++radicsOut[getDigit<2>(arr[i]) + DIGIT_RANGE * 2];
|
|
||||||
++radicsOut[getDigit<3>(arr[i]) + DIGIT_RANGE * 3];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user