From cfc9a050e418a9b77a3bffe932b0344f35cbddc9 Mon Sep 17 00:00:00 2001 From: Richard Thier Date: Thu, 11 Mar 2021 22:34:44 +0100 Subject: [PATCH] removed manual digit usage by recursive template trickz --- magyarsort.h | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) 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); } }