From 6d7d14a3e29418b8bb25ce8f1bd7a28b0c88d896 Mon Sep 17 00:00:00 2001 From: Jamie Reece Wilson Date: Sun, 7 Jan 2024 03:40:04 +0000 Subject: [PATCH] [*] Fixup AuRoundUpPow2 to not round up when the value is already a pow of 2 [+] AuIsPow2 [+] AuNextPow2 --- Include/auROXTL/auNumberUtils.hpp | 32 +++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/Include/auROXTL/auNumberUtils.hpp b/Include/auROXTL/auNumberUtils.hpp index 48cf90d..3d07a2b 100644 --- a/Include/auROXTL/auNumberUtils.hpp +++ b/Include/auROXTL/auNumberUtils.hpp @@ -42,10 +42,33 @@ constexpr const T AuPageRound(const T value, const T pageSize) // TODO: out of order #include "auBitsUtils.hpp" +template +const bool AuIsPow2(const T value) +{ + return (value) && (value & (value - 1) == 0); +} + +template +const T AuNextPow2(const T value) +{ + if constexpr (AuIsSame_v || + AuIsSame_v) + { + return AuNextPow2(value); + } + else + { + AuUInt8 ret; + AuBitScanReverse(ret, value); + return T(1) << (T(ret) + T(1)); + } +} + template const T AuRoundUpPow2(const T value) { - if constexpr (AuIsSame_v) + if constexpr (AuIsSame_v || + AuIsSame_v) { return AuRoundUpPow2(value); } @@ -53,14 +76,15 @@ const T AuRoundUpPow2(const T value) { AuUInt8 ret; AuBitScanReverse(ret, value); - return T(1) << (ret + T(1)); + return T(1) << (T(ret) + T(T(1) << T(ret) == value ? 0 : 1)); } } template const T AuRoundDownPow2(const T value) { - if constexpr (AuIsSame_v) + if constexpr (AuIsSame_v || + AuIsSame_v) { return AuRoundDownPow2(value); } @@ -68,6 +92,6 @@ const T AuRoundDownPow2(const T value) { AuUInt8 ret; AuBitScanReverse(ret, value); - return T(1) << ret; + return T(1) << T(ret); } } \ No newline at end of file