authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2022-09-22 02:44:22-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2022-10-11 19:51:03-04:00
log5c49341f097dc666eb4ad8c26c6b00fd2189a396
tree9d3df61233cc328d73c7f5d086fe112691398b81
parent7a89eebfc64fd81a504700e105bdc2609bb2a442

big.int: add support for non-comptime scalars


2 files changed, 32 insertions(+), 3 deletions(-)

lib/std/math/big/int.zig+20-2
......@@ -391,7 +391,16 @@ pub const Mutable = struct {
391391 /// Asserts the result fits in `r`. An upper bound on the number of limbs needed by
392392 /// r is `math.max(a.limbs.len, calcLimbLen(scalar)) + 1`.
393393 pub fn addScalar(r: *Mutable, a: Const, scalar: anytype) void {
394 var limbs: [calcLimbLen(scalar)]Limb = undefined;
394 const Scalar = @TypeOf(scalar);
395 const magnitude = switch (@typeInfo(Scalar)) {
396 .ComptimeInt => scalar,
397 .Int => |int| switch (int.signedness) {
398 .signed => minInt(Scalar),
399 .unsigned => maxInt(Scalar),
400 },
401 else => @compileError("expected scalar to be an int"),
402 };
403 var limbs: [calcLimbLen(magnitude)]Limb = undefined;
395404 const operand = init(&limbs, scalar).toConst();
396405 return add(r, a, operand);
397406 }
......@@ -2303,7 +2312,16 @@ pub const Const = struct {
23032312
23042313 /// Same as `order` but the right-hand operand is a primitive integer.
23052314 pub fn orderAgainstScalar(lhs: Const, scalar: anytype) math.Order {
2306 var limbs: [calcLimbLen(scalar)]Limb = undefined;
2315 const Scalar = @TypeOf(scalar);
2316 const magnitude = switch (@typeInfo(Scalar)) {
2317 .ComptimeInt => scalar,
2318 .Int => |int| switch (int.signedness) {
2319 .signed => minInt(Scalar),
2320 .unsigned => maxInt(Scalar),
2321 },
2322 else => @compileError("expected scalar to be an int"),
2323 };
2324 var limbs: [calcLimbLen(magnitude)]Limb = undefined;
23072325 const rhs = Mutable.init(&limbs, scalar);
23082326 return order(lhs, rhs.toConst());
23092327 }
lib/std/math/big/int_test.zig+12-1
......@@ -573,7 +573,7 @@ test "big.int add sign" {
573573 try testing.expect((try a.to(i32)) == -3);
574574}
575575
576test "big.int add scalar" {
576test "big.int add comptime scalar" {
577577 var a = try Managed.initSet(testing.allocator, 50);
578578 defer a.deinit();
579579
......@@ -584,6 +584,17 @@ test "big.int add scalar" {
584584 try testing.expect((try b.to(u32)) == 55);
585585}
586586
587test "big.int add scalar" {
588 var a = try Managed.initSet(testing.allocator, 123);
589 defer a.deinit();
590
591 var b = try Managed.init(testing.allocator);
592 defer b.deinit();
593 try b.addScalar(&a, @as(u32, 31));
594
595 try testing.expect((try b.to(u32)) == 154);
596}
597
587598test "big.int addWrap single-single, unsigned" {
588599 var a = try Managed.initSet(testing.allocator, maxInt(u17));
589600 defer a.deinit();