authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-06-04 00:05:23-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-06-04 00:06:17-07:00
loge1980e2fe0d206942537cfb992c78e5800411846
treef5c3bcf8db357c7edbb551fd6aa9c66739bff7cf
parentac9f020c878c6397cee0f476b0afd5ce38178374

std.StaticStringMap: fix initEnum and usage


2 files changed, 13 insertions(+), 12 deletions(-)

lib/std/static_string_map.zig+10-9
...@@ -102,12 +102,12 @@ pub fn StaticStringMapWithEql(...@@ -102,12 +102,12 @@ pub fn StaticStringMapWithEql(
102102
103 /// Returns a map backed by static, comptime allocated memory.103 /// Returns a map backed by static, comptime allocated memory.
104 ///104 ///
105 /// `V` must be `void`. The enum's tag names will be used as the keys.105 /// `V` must be an enum. The enum's tag names will be used as the keys.
106 pub inline fn initEnum(comptime E: type) Self {106 pub inline fn initEnum() Self {
107 comptime {107 comptime {
108 var self: Self = .{};108 var self: Self = .{};
109109
110 const field_names = @typeInfo(E).@"enum".field_names;110 const field_names = @typeInfo(V).@"enum".field_names;
111 if (field_names.len == 0) return self;111 if (field_names.len == 0) return self;
112112
113 // Since the KVs are sorted, a linearly-growing bound will never113 // Since the KVs are sorted, a linearly-growing bound will never
...@@ -116,7 +116,8 @@ pub fn StaticStringMapWithEql(...@@ -116,7 +116,8 @@ pub fn StaticStringMapWithEql(
116 @setEvalBranchQuota(10 * field_names.len * std.math.log2_int_ceil(usize, field_names.len));116 @setEvalBranchQuota(10 * field_names.len * std.math.log2_int_ceil(usize, field_names.len));
117117
118 var sorted_keys: [field_names.len][]const u8 = field_names[0..field_names.len].*;118 var sorted_keys: [field_names.len][]const u8 = field_names[0..field_names.len].*;
119 var sorted_vals: [field_names.len]V = @splat({});119 var sorted_vals: [field_names.len]V = undefined;
120 for (&sorted_vals, @typeInfo(V).@"enum".field_values) |*x, i| x.* = @enumFromInt(i);
120121
121 for (field_names) |field_name| {122 for (field_names) |field_name| {
122 self.min_len = @min(self.min_len, field_name.len);123 self.min_len = @min(self.min_len, field_name.len);
...@@ -584,12 +585,12 @@ test "sorting kvs doesn't exceed eval branch quota" {...@@ -584,12 +585,12 @@ test "sorting kvs doesn't exceed eval branch quota" {
584585
585test "initEnum" {586test "initEnum" {
586 const UnsortedEnum = enum { BB, A, CCC, DDD };587 const UnsortedEnum = enum { BB, A, CCC, DDD };
587 const map = StaticStringMap(void).initEnum(UnsortedEnum);588 const map = StaticStringMap(UnsortedEnum).initEnum();
588 try testing.expect(map.has("A"));589 try testing.expect(map.has("A"));
589 try testing.expect(!map.has("a"));590 try testing.expect(!map.has("a"));
590 try testing.expectEqual(0, map.getIndex("BB"));591 try testing.expectEqual(.BB, map.get("BB"));
591 try testing.expectEqual(1, map.getIndex("A"));592 try testing.expectEqual(.A, map.get("A"));
592 try testing.expectEqual(2, map.getIndex("CCC"));593 try testing.expectEqual(.CCC, map.get("CCC"));
593 try testing.expectEqual(3, map.getIndex("DDD"));594 try testing.expectEqual(.DDD, map.get("DDD"));
594 try testing.expectEqual(null, map.getIndex("F"));595 try testing.expectEqual(null, map.getIndex("F"));
595}596}
src/main.zig+3-3
...@@ -229,7 +229,7 @@ pub fn main(init: std.process.Init.Minimal) anyerror!void {...@@ -229,7 +229,7 @@ pub fn main(init: std.process.Init.Minimal) anyerror!void {
229 return mainArgs(gpa, arena, io, args, &environ_map);229 return mainArgs(gpa, arena, io, args, &environ_map);
230}230}
231231
232const cmd_map = std.StaticStringMap(void).initEnum(Cmd);232const cmd_map = std.StaticStringMap(Cmd).initEnum();
233233
234const Cmd = enum {234const Cmd = enum {
235 @"build-exe",235 @"build-exe",
...@@ -322,10 +322,10 @@ fn mainArgs(...@@ -322,10 +322,10 @@ fn mainArgs(
322322
323 const cmd = args[1];323 const cmd = args[1];
324 const cmd_args = args[2..];324 const cmd_args = args[2..];
325 switch (@as(Cmd, @enumFromInt(cmd_map.getIndex(cmd) orelse {325 switch (cmd_map.get(cmd) orelse {
326 std.log.info("{s}", .{usage});326 std.log.info("{s}", .{usage});
327 fatal("unknown command: {s}", .{args[1]});327 fatal("unknown command: {s}", .{args[1]});
328 }))) {328 }) {
329 .@"build-exe" => {329 .@"build-exe" => {
330 dev.check(.build_exe_command);330 dev.check(.build_exe_command);
331 return buildOutputType(gpa, arena, io, args, .{ .build = .Exe }, environ_map);331 return buildOutputType(gpa, arena, io, args, .{ .build = .Exe }, environ_map);