removed manual digit usage by recursive template trickz

This commit is contained in:
Richard Thier 2021-03-11 22:34:44 +01:00
parent c7fe2f0507
commit cfc9a050e4

View File

@ -34,13 +34,27 @@ namespace MagyarSort {
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) {
for(size_t i = 0; i < size; ++i) {
// TODO: manual digits!
++radicsOut[getDigit<0>(arr[i]) + DIGIT_RANGE * 0];
++radicsOut[getDigit<1>(arr[i]) + DIGIT_RANGE * 1];
++radicsOut[getDigit<2>(arr[i]) + DIGIT_RANGE * 2];
++radicsOut[getDigit<3>(arr[i]) + DIGIT_RANGE * 3];
// Creates no object, struct is empty
OccurenceMagic<DIGITS - 1>(arr, i, radicsOut);
}
}