14#define DC_MATH_IS_POWER_OF_2(x) ((x) != 0 && ((x) & ((x) - 1)) == 0)
16#if defined DC_GENERIC_KEYWORD_SUPPORTED
17 #define DC_MATH_MSB_INDEX(x) \
20 uint8_t: (7u - (uint32_t)__builtin_clz((uint32_t)((x)) << 24u)), \
21 uint16_t: (15u - (uint32_t)__builtin_clz((uint32_t)((x)) << 16u)), \
22 uint32_t: (31u - (uint32_t)__builtin_clz((uint32_t)(x))), \
23 uint64_t: (63u - (uint32_t)__builtin_clzll((uint64_t)(x)))))
26 #include <type_traits>
30template <
typename T>
constexpr unsigned msb_index(T x)
noexcept {
31 static_assert(std::is_unsigned_v<T>,
"DC_MATH_MSB_INDEX requires an unsigned integer type");
37 constexpr unsigned bits =
sizeof(T) * 8U;
38 return bits - 1U - std::countl_zero(x);
43 #define DC_MATH_MSB_INDEX(x) ::dc::math::msb_index(x)
55#if SIZE_MAX > 0xFFFFFFFF
64 return index & (capacity - 1);
70 return ((uintptr_t)ptr & (alignment - 1)) == 0;
#define DC_MATH_IS_POWER_OF_2(x)
static DC_PUBLIC bool DC_INLINE DC_CONST dc_math_is_aligned_pow2(const void *ptr, unsigned alignment)
static DC_PUBLIC size_t DC_INLINE DC_CONST dc_math_modulus_power_of_2_capacity(size_t index, size_t capacity)
static DC_INLINE DC_CONST size_t dc_math_next_power_of_2(size_t x)
constexpr unsigned msb_index(T x) noexcept
#define DC_ASSUME(expr,...)