30 return (
v & (
v - 1)) == 0;
47 return (
value + align - 1) & ~(align - 1);
52template <std::
size_t AlignT>
66 constexpr std::size_t maxBits =
sizeof(T) * 8;
67 static_assert(std::is_integral_v<T> && (maxBits == 32 || maxBits == 64));
73 unsigned long idx = 0;
74 [[maybe_unused]]
unsigned char nonZero;
75 if constexpr (maxBits == 32) {
76 nonZero = _BitScanReverse(&idx,
x);
80 nonZero = _BitScanReverse64(&idx,
x);
83 std::uint32_t low = (
x & 0xFFFF'FFFF);
84 std::uint32_t high = (
x >> 32) & 0xFFFF'FFFF;
85 unsigned long lowIdx, highIdx;
86 unsigned char lowNonZero = _BitScanReverse(&lowIdx, low);
87 unsigned char highNonZero = _BitScanReverse(&highIdx, high);
88 assert(lowNonZero | highNonZero);
93 return static_cast<std::size_t
>(idx);
102 return static_cast<std::size_t
>(maxBits - 1 - idx);
104 if constexpr (maxBits == 32) {
105 return static_cast<std::size_t
>(__builtin_clz(
x));
107 return static_cast<std::size_t
>(__builtin_clzl(
x));
121 constexpr std::size_t maxBits =
sizeof(T) * 8;
122 static_assert(std::is_integral_v<T> && (maxBits == 32 || maxBits == 64));
128 unsigned long idx = 0;
129 [[maybe_unused]]
unsigned char nonZero;
130 if constexpr (maxBits == 32) {
131 nonZero = _BitScanForward(&idx,
x);
135 nonZero = _BitScanForward64(&idx,
x);
138 std::uint32_t low = (
x & 0xFFFF'FFFF);
139 std::uint32_t high = (
x >> 32) & 0xFFFF'FFFF;
140 unsigned long lowIdx, highIdx;
141 unsigned char lowNonZero = _BitScanForward(&lowIdx, low);
142 unsigned char highNonZero = _BitScanForward(&highIdx, high);
143 nonZero = lowNonZero | highNonZero;
154 return static_cast<std::size_t
>(idx);
156 if constexpr (maxBits == 32) {
157 return static_cast<std::size_t
>(__builtin_ctz(
x));
159 return static_cast<std::size_t
>(__builtin_ctzl(
x));
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
std::size_t LeadingZeroes(T x)
Given an integer x, returns the number of leading 0-bits starting at the most significant bit positio...
bool IsPowerOfTwo(std::uint64_t v)
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.
Storage type whose alignment matches AlignT bytes.