Commit 62fefe8648

Andrew Kelley <andrew@ziglang.org>
2020-05-26 18:15:08
std.fmt: non-exhaustive enums: avoid the loop when it's not necessary
1 parent 5cdeac3
Changed files (1)
lib
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)});
 }