diff --git a/magyarsort.h b/magyarsort.h index 21a28b5..b8be2a9 100644 --- a/magyarsort.h +++ b/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 + struct OccurenceMagic : public OccurenceMagic { + inline OccurenceMagic(uint32_t arr[], size_t i, size_t *radicsOut) noexcept + : OccurenceMagic(arr, i, radicsOut) { + // parents run first so template recursion runs DIGIT=0 first... + ++radicsOut[getDigit(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(arr, i, radicsOut); } }