Commit 52721d3a7e
Changed files (2)
lib
std
math
lib/std/math/big/int_test.zig
@@ -4,6 +4,7 @@ const testing = std.testing;
const Managed = std.math.big.int.Managed;
const Mutable = std.math.big.int.Mutable;
const Limb = std.math.big.Limb;
+const SignedLimb = std.math.big.SignedLimb;
const DoubleLimb = std.math.big.DoubleLimb;
const SignedDoubleLimb = std.math.big.SignedDoubleLimb;
const maxInt = std.math.maxInt;
@@ -575,6 +576,102 @@ test "big.int add scalar" {
try testing.expect((try b.to(u32)) == 55);
}
+test "big.int addWrap single-single, unsigned" {
+ var a = try Managed.initSet(testing.allocator, maxInt(u17));
+ defer a.deinit();
+
+ var b = try Managed.initSet(testing.allocator, 10);
+ defer b.deinit();
+
+ try a.addWrap(a.toConst(), b.toConst(), .unsigned, 17);
+
+ try testing.expect((try a.to(u17)) == 9);
+}
+
+test "big.int subWrap single-single, unsigned" {
+ var a = try Managed.initSet(testing.allocator, 0);
+ defer a.deinit();
+
+ var b = try Managed.initSet(testing.allocator, maxInt(u17));
+ defer b.deinit();
+
+ try a.subWrap(a.toConst(), b.toConst(), .unsigned, 17);
+
+ try testing.expect((try a.to(u17)) == 1);
+}
+
+test "big.int addWrap multi-multi, unsigned, limb aligned" {
+ var a = try Managed.initSet(testing.allocator, maxInt(DoubleLimb));
+ defer a.deinit();
+
+ var b = try Managed.initSet(testing.allocator, maxInt(DoubleLimb));
+ defer b.deinit();
+
+ try a.addWrap(a.toConst(), b.toConst(), .unsigned, @bitSizeOf(DoubleLimb));
+
+ try testing.expect((try a.to(DoubleLimb)) == maxInt(DoubleLimb) - 1);
+}
+
+test "big.int subWrap single-multi, unsigned, limb aligned" {
+ var a = try Managed.initSet(testing.allocator, 10);
+ defer a.deinit();
+
+ var b = try Managed.initSet(testing.allocator, maxInt(DoubleLimb) + 100);
+ defer b.deinit();
+
+ try a.subWrap(a.toConst(), b.toConst(), .unsigned, @bitSizeOf(DoubleLimb));
+
+ try testing.expect((try a.to(DoubleLimb)) == maxInt(DoubleLimb) - 88);
+}
+
+test "big.int addWrap single-single, signed" {
+ var a = try Managed.initSet(testing.allocator, maxInt(i21));
+ defer a.deinit();
+
+ var b = try Managed.initSet(testing.allocator, 1 + 1 + maxInt(u21));
+ defer b.deinit();
+
+ try a.addWrap(a.toConst(), b.toConst(), .signed, @bitSizeOf(i21));
+
+ try testing.expect((try a.to(i21)) == minInt(i21));
+}
+
+test "big.int subWrap single-single, signed" {
+ var a = try Managed.initSet(testing.allocator, minInt(i21));
+ defer a.deinit();
+
+ var b = try Managed.initSet(testing.allocator, 1);
+ defer b.deinit();
+
+ try a.subWrap(a.toConst(), b.toConst(), .signed, @bitSizeOf(i21));
+
+ try testing.expect((try a.to(i21)) == maxInt(i21));
+}
+
+test "big.int addWrap multi-multi, signed, limb aligned" {
+ var a = try Managed.initSet(testing.allocator, maxInt(SignedDoubleLimb));
+ defer a.deinit();
+
+ var b = try Managed.initSet(testing.allocator, maxInt(SignedDoubleLimb));
+ defer b.deinit();
+
+ try a.addWrap(a.toConst(), b.toConst(), .signed, @bitSizeOf(SignedDoubleLimb));
+
+ try testing.expect((try a.to(SignedDoubleLimb)) == -2);
+}
+
+test "big.int subWrap single-multi, signed, limb aligned" {
+ var a = try Managed.initSet(testing.allocator, minInt(SignedDoubleLimb));
+ defer a.deinit();
+
+ var b = try Managed.initSet(testing.allocator, 1);
+ defer b.deinit();
+
+ try a.subWrap(a.toConst(), b.toConst(), .signed, @bitSizeOf(SignedDoubleLimb));
+
+ try testing.expect((try a.to(SignedDoubleLimb)) == maxInt(SignedDoubleLimb));
+}
+
test "big.int sub single-single" {
var a = try Managed.initSet(testing.allocator, 50);
defer a.deinit();
lib/std/math/big.zig
@@ -5,6 +5,7 @@ pub const Rational = @import("big/rational.zig").Rational;
pub const int = @import("big/int.zig");
pub const Limb = usize;
const limb_info = @typeInfo(Limb).Int;
+pub const SignedLimb = std.meta.Int(.signed, limb_info.bits);
pub const DoubleLimb = std.meta.Int(.unsigned, 2 * limb_info.bits);
pub const SignedDoubleLimb = std.meta.Int(.signed, 2 * limb_info.bits);
pub const Log2Limb = std.math.Log2Int(Limb);
@@ -19,6 +20,7 @@ test {
_ = int;
_ = Rational;
_ = Limb;
+ _ = SignedLimb;
_ = DoubleLimb;
_ = SignedDoubleLimb;
_ = Log2Limb;