big ints: Make calcLimbLen always work at comptime, even if parameter is runtime

This commit is contained in:
Robin Voetter 2021-10-24 02:44:47 +02:00
parent c905ceb23c
commit 83bdbb2abb

View file

@ -18,11 +18,14 @@ const debug_safety = false;
/// Returns the number of limbs needed to store `scalar`, which must be a
/// primitive integer value.
pub fn calcLimbLen(scalar: anytype) usize {
if (scalar == 0) {
return 1;
}
const T = @TypeOf(scalar);
const max_scalar = switch (@typeInfo(T)) {
.Int => maxInt(T),
.ComptimeInt => scalar,
else => @compileError("parameter must be a primitive integer type"),
};
const w_value = std.math.absCast(scalar);
const w_value = std.math.absCast(max_scalar);
return @divFloor(@intCast(Limb, math.log2(w_value)), limb_bits) + 1;
}