6#ifndef JLM_UTIL_MATH_HPP
7#define JLM_UTIL_MATH_HPP
30 static_assert(std::is_integral_v<T>,
"T must be integral type");
57 return T(1) << (
log2Floor(value - 1) + 1);
77 const auto miss = value % multiple;
82 return value + multiple - miss;
99 using UnsignedT = std::make_unsigned_t<T>;
100 return log2Floor(
static_cast<UnsignedT
>(value)) + 1;
112 static_assert(std::is_enum_v<T>,
"BitWidthOfEnum only takes enums");
114 using UnderlyingT = std::underlying_type_t<T>;
137 const auto extendBits = 64 - keepBits;
140 return (value << extendBits) >> extendBits;
159 const auto extendBits = 64 - keepBits;
162 return (
static_cast<uint64_t
>(value) << extendBits) >> extendBits;
static constexpr T RoundUpToMultipleOf(T value, T multiple)
static constexpr T RoundUpToPowerOf2(T value)
static constexpr int BitsRequiredToRepresent(T value)
int64_t truncateAndZeroExtend(int64_t value, uint64_t keepBits)
static constexpr int BitWidthOfEnum(T endValue)
int64_t truncateAndSignExtend(int64_t value, uint64_t keepBits)
static constexpr int log2Floor(T value)