diff options
author | est31 <MTest31@outlook.com> | 2016-02-29 06:51:19 +0100 |
---|---|---|
committer | est31 <MTest31@outlook.com> | 2016-02-29 06:51:19 +0100 |
commit | 0b24a13fa0116e63a70b6ccbd77c75fcb31c21eb (patch) | |
tree | b0af1395691ae496ef80f55de031361e11c35d6b | |
parent | 96b60c281fcaee977b1116dfa0ca8c3064fefa36 (diff) |
Fix bug with nearest_power_of_2_templated
We have to shift log(num of bits) many times not num of bytes many.
-rw-r--r-- | core/typedefs.h | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/core/typedefs.h b/core/typedefs.h index 48acca326e..eab0ebc545 100644 --- a/core/typedefs.h +++ b/core/typedefs.h @@ -188,13 +188,22 @@ static _FORCE_INLINE_ unsigned int nearest_power_of_2(unsigned int x) { return ++x; } +// We need this definition inside the function below. +static inline int get_shift_from_power_of_2(unsigned int p_pixel); + template<class T> static _FORCE_INLINE_ T nearest_power_of_2_templated(T x) { --x; + + // The number of operations on x is the base two logarithm + // of the p_number of bits in the type. Add three to account + // for sizeof(T) being in bytes. + size_t num = get_shift_from_power_of_2(sizeof(T)) + 3; + // If the compiler is smart, it unrolls this loop // If its dumb, this is a bit slow. - for (size_t i = 0; i < sizeof(T); i++) + for (size_t i = 0; i < num; i++) x |= x >> (1 << i); return ++x; |