32 return align > 0 && (align & (align - 1)) == 0;
38inline constexpr T
AlignUp(T value, T align)
noexcept
41 return (value + align - 1) & ~(align - 1);
53 constexpr std::size_t maxBits =
sizeof(T) * 8;
54 static_assert(std::is_integral_v<T> && (maxBits == 32 || maxBits == 64));
60 unsigned long idx = 0;
61 [[maybe_unused]]
unsigned char nonZero;
62 if constexpr (maxBits == 32) {
63 nonZero = _BitScanReverse(&idx,
x);
67 nonZero = _BitScanReverse64(&idx,
x);
70 std::uint32_t low = (
x & 0xFFFF'FFFF);
71 std::uint32_t high = (
x >> 32) & 0xFFFF'FFFF;
72 unsigned long lowIdx, highIdx;
73 unsigned char lowNonZero = _BitScanReverse(&lowIdx, low);
74 unsigned char highNonZero = _BitScanReverse(&highIdx, high);
75 assert(lowNonZero | highNonZero);
80 return static_cast<std::size_t
>(idx);
89 return static_cast<std::size_t
>(maxBits - 1 - idx);
91 if constexpr (maxBits == 32) {
92 return static_cast<std::size_t
>(__builtin_clz(
x));
94 return static_cast<std::size_t
>(__builtin_clzl(
x));
108 constexpr std::size_t maxBits =
sizeof(T) * 8;
109 static_assert(std::is_integral_v<T> && (maxBits == 32 || maxBits == 64));
115 unsigned long idx = 0;
116 [[maybe_unused]]
unsigned char nonZero;
117 if constexpr (maxBits == 32) {
118 nonZero = _BitScanForward(&idx,
x);
122 nonZero = _BitScanForward64(&idx,
x);
125 std::uint32_t low = (
x & 0xFFFF'FFFF);
126 std::uint32_t high = (
x >> 32) & 0xFFFF'FFFF;
127 unsigned long lowIdx, highIdx;
128 unsigned char lowNonZero = _BitScanForward(&lowIdx, low);
129 unsigned char highNonZero = _BitScanForward(&highIdx, high);
130 nonZero = lowNonZero | highNonZero;
141 return static_cast<std::size_t
>(idx);
143 if constexpr (maxBits == 32) {
144 return static_cast<std::size_t
>(__builtin_ctz(
x));
146 return static_cast<std::size_t
>(__builtin_ctzl(
x));
std::size_t LeadingZeroes(T x)
Given an integer x, returns the number of leading 0-bits starting at the most significant bit positio...
constexpr T AlignUp(T value, T align) noexcept
Round value up to the next multiple of align.
std::size_t TrailingZeroes(T x)
Given an integer x, returns the number of trailing 0-bits starting at the least significant bit posit...
constexpr bool IsValidAlignment(std::size_t align) noexcept
Return true if align is a valid C++ alignment value: strictly positive and a power of two.