diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-08-19 17:09:18 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-08-19 17:09:18 -0700 |
| commit | 6926e6e705b7d1c0a69ec20b6b0e1ea280f036d1 (patch) | |
| tree | bccebf1e310cc17a63318f1906f996143fc2c0e7 /lib/std | |
| parent | 87d5db057b53fc643ac0c316653a46ada54b3c91 (diff) | |
| parent | df10e998ee4a935f49943fb5c0ef134f336c6ee3 (diff) | |
| download | zig-6926e6e705b7d1c0a69ec20b6b0e1ea280f036d1.tar.gz zig-6926e6e705b7d1c0a69ec20b6b0e1ea280f036d1.zip | |
Merge remote-tracking branch 'origin/master' into llvm13
Diffstat (limited to 'lib/std')
| -rw-r--r-- | lib/std/fmt.zig | 7 | ||||
| -rw-r--r-- | lib/std/rand.zig | 30 |
2 files changed, 37 insertions, 0 deletions
diff --git a/lib/std/fmt.zig b/lib/std/fmt.zig index 9ab111496c..5cbdc57832 100644 --- a/lib/std/fmt.zig +++ b/lib/std/fmt.zig @@ -544,6 +544,13 @@ pub fn formatType( return formatText(value, actual_fmt, options, writer); } } + if (comptime std.meta.trait.isZigString(info.child)) { + for (value) |item, i| { + if (i != 0) try formatText(", ", actual_fmt, options, writer); + try formatText(item, actual_fmt, options, writer); + } + return; + } @compileError("Unknown format string: '" ++ actual_fmt ++ "' for type '" ++ @typeName(T) ++ "'"); }, .Enum, .Union, .Struct => { diff --git a/lib/std/rand.zig b/lib/std/rand.zig index 66f758cb48..7d967d3715 100644 --- a/lib/std/rand.zig +++ b/lib/std/rand.zig @@ -47,6 +47,19 @@ pub const Random = struct { return r.int(u1) != 0; } + /// Returns a random value from an enum, evenly distributed. + pub fn enumValue(r: *Random, comptime EnumType: type) EnumType { + if (comptime !std.meta.trait.is(.Enum)(EnumType)) { + @compileError("Random.enumValue requires an enum type, not a " ++ @typeName(EnumType)); + } + + // We won't use int -> enum casting because enum elements can have + // arbitrary values. Instead we'll randomly pick one of the type's values. + const values = std.enums.values(EnumType); + const index = r.uintLessThan(usize, values.len); + return values[index]; + } + /// Returns a random int `i` such that `0 <= i <= maxInt(T)`. /// `i` is evenly distributed. pub fn int(r: *Random, comptime T: type) T { @@ -377,6 +390,23 @@ fn testRandomBoolean() !void { try expect(r.random.boolean() == true); } +test "Random enum" { + try testRandomEnumValue(); + comptime try testRandomEnumValue(); +} +fn testRandomEnumValue() !void { + const TestEnum = enum { + First, + Second, + Third, + }; + var r = SequentialPrng.init(); + r.next_value = 0; + try expect(r.random.enumValue(TestEnum) == TestEnum.First); + try expect(r.random.enumValue(TestEnum) == TestEnum.First); + try expect(r.random.enumValue(TestEnum) == TestEnum.First); +} + test "Random intLessThan" { @setEvalBranchQuota(10000); try testRandomIntLessThan(); |
