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);
|
||||
}
|
||||
|
||||
/** 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user