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:
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)});
}