zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 62fefe864840e4d2c8bf4d6ad5509bcac141e7c3 (tree)
parent 5cdeac3b0eaf61bc07e45012d9c335a74f437276
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Tue, 26 May 2020 12:15:08 -0400

std.fmt: non-exhaustive enums: avoid the loop when it's not necessary

Diffstat:
Mlib/std/fmt.zig | 50++++++++++++++++++--------------------------------
1 file changed, 18 insertions(+), 32 deletions(-)

diff --git a/lib/std/fmt.zig b/lib/std/fmt.zig @@ -359,38 +359,24 @@ pub fn formatType( }, .Enum => |enumInfo| { try out_stream.writeAll(@typeName(T)); - - var has_name: bool = undefined; if (enumInfo.is_exhaustive) { - has_name = true; - } else { - has_name = false; - // Use @tagName only if value is one of known fields - inline for (enumInfo.fields) |enumField| { - if (@enumToInt(value) == enumField.value) { - has_name = true; - break; - } - } + try out_stream.writeAll("."); + try out_stream.writeAll(@tagName(value)); + return; } - var use_name = has_name; - if (comptime std.mem.eql(u8, fmt, "x") or - comptime std.mem.eql(u8, fmt, "X") or - comptime std.mem.eql(u8, fmt, "d") or - comptime std.mem.eql(u8, fmt, "b")) - { - use_name = false; + // Use @tagName only if value is one of known fields + inline for (enumInfo.fields) |enumField| { + if (@enumToInt(value) == enumField.value) { + try out_stream.writeAll("."); + try out_stream.writeAll(@tagName(value)); + return; + } } - if (use_name) { - try out_stream.writeAll("."); - try out_stream.writeAll(@tagName(value)); - } else { - try out_stream.writeAll("("); - try formatType(@enumToInt(value), fmt, options, out_stream, max_depth); - try out_stream.writeAll(")"); - } + try out_stream.writeAll("("); + try formatType(@enumToInt(value), fmt, options, out_stream, max_depth); + try out_stream.writeAll(")"); }, .Union => { try out_stream.writeAll(@typeName(T)); @@ -1331,8 +1317,8 @@ test "enum" { const value = Enum.Two; try testFmt("enum: Enum.Two\n", "enum: {}\n", .{value}); try testFmt("enum: Enum.Two\n", "enum: {}\n", .{&value}); - try testFmt("enum: Enum(0)\n", "enum: {x}\n", .{Enum.One}); - try testFmt("enum: Enum(1)\n", "enum: {X}\n", .{Enum.Two}); + try testFmt("enum: Enum.One\n", "enum: {x}\n", .{Enum.One}); + try testFmt("enum: Enum.Two\n", "enum: {X}\n", .{Enum.Two}); } test "non-exhaustive enum" { @@ -1344,9 +1330,9 @@ test "non-exhaustive enum" { try testFmt("enum: Enum.One\n", "enum: {}\n", .{Enum.One}); try testFmt("enum: Enum.Two\n", "enum: {}\n", .{Enum.Two}); try testFmt("enum: Enum(4660)\n", "enum: {}\n", .{@intToEnum(Enum, 0x1234)}); - try testFmt("enum: Enum(f)\n", "enum: {x}\n", .{Enum.One}); - try testFmt("enum: Enum(beef)\n", "enum: {x}\n", .{Enum.Two}); - try testFmt("enum: Enum(BEEF)\n", "enum: {X}\n", .{Enum.Two}); + try testFmt("enum: Enum.One\n", "enum: {x}\n", .{Enum.One}); + try testFmt("enum: Enum.Two\n", "enum: {x}\n", .{Enum.Two}); + try testFmt("enum: Enum.Two\n", "enum: {X}\n", .{Enum.Two}); try testFmt("enum: Enum(1234)\n", "enum: {x}\n", .{@intToEnum(Enum, 0x1234)}); }