23#include "rawspeedconfig.h"
43constexpr unsigned RAWSPEED_READNONE
bitwidth([[maybe_unused]]
T unused = {}) {
44 return CHAR_BIT *
sizeof(T);
48 requires std::unsigned_integral<T>
50 using SignedT = std::make_signed_t<T>;
51 return static_cast<SignedT
>(v) < 0 ? std::countl_one(v) : std::countl_zero(v);
57 return bitwidth(v) - std::countl_zero(v);
67 requires std::unsigned_integral<T>
74 requires std::is_arithmetic_v<T>
75constexpr auto RAWSPEED_READNONE
clampBits(
T value,
unsigned int nBits) {
86 requires std::is_arithmetic_v<T>
87constexpr bool RAWSPEED_READNONE
isIntN(
T value,
unsigned int nBits) {
89 using UnsignedT = std::make_unsigned_t<T>;
90 const auto highBits =
static_cast<UnsignedT
>(value) >> nBits;
95 requires std::unsigned_integral<T>
100 unsigned numHighPaddingBits =
bitwidth<T>() - nBits;
103 value <<= numHighPaddingBits;
104 value >>= numHighPaddingBits;
109 requires std::unsigned_integral<T>
119 requires std::is_unsigned_v<T>
121 T value,
unsigned nBits,
unsigned effectiveBitwidth =
bitwidth<T>()) {
124 auto numLowBitsToSkip = effectiveBitwidth - nBits;
126 return value >> numLowBitsToSkip;
130 requires std::is_unsigned_v<T>
131constexpr typename std::make_signed_t<T>
133 invariant(nBits != 0 &&
"Only valid for non-zero bit count.");
135 using SignedT = std::make_signed_t<T>;
136 return static_cast<SignedT
>(value << SpareSignBits) >> SpareSignBits;
140 requires std::same_as<T, uint8_t>
142#if __has_builtin(__builtin_bitreverse8)
143 return __builtin_bitreverse8(v);
148 return uint8_t((uint8_t(v) * 0x0202020202ULL & 0x010884422010ULL) % 1023);
151#if __has_builtin(__builtin_bitreverse32)
153 requires std::same_as<T, uint32_t>
155 return __builtin_bitreverse32(v);
160 requires std::same_as<T, uint8_t>
162#if !__has_builtin(__builtin_bitreverse32)
167 std::memcpy(&tmp,
x.data(),
sizeof(
uint32_t));
169 tmp = __builtin_bswap32(tmp);
170 std::memcpy(
x.data(), &tmp,
sizeof(
uint32_t));
std::array< T, 4 > bitreverse_each(std::array< T, 4 > x)
constexpr RAWSPEED_READNONE Ttgt implicit_cast(Tsrc value)
constexpr RAWSPEED_READNONE T extractLowBitsSafe(T value, unsigned nBits)
unsigned numSignificantBits(const T v)
constexpr bool RAWSPEED_READNONE isIntN(T value, unsigned int nBits)
unsigned numActiveBits(const T v)
constexpr bool RAWSPEED_READNONE isPowerOfTwo(T val)
constexpr unsigned RAWSPEED_READNONE bitwidth(T unused={})
constexpr std::make_signed_t< T > RAWSPEED_READNONE signExtend(T value, unsigned int nBits)
unsigned numSignBits(const T v)
constexpr RAWSPEED_READNONE T extractHighBits(T value, unsigned nBits, unsigned effectiveBitwidth=bitwidth< T >())
constexpr RAWSPEED_READNONE T extractLowBits(T value, unsigned nBits)
constexpr auto RAWSPEED_READNONE clampBits(T value, unsigned int nBits)