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(
102102
103103 /// Returns a map backed by static, comptime allocated memory.
104104 ///
105 /// `V` must be `void`. The enum's tag names will be used as the keys.
106 pub inline fn initEnum(comptime E: type) Self {
105 /// `V` must be an enum. The enum's tag names will be used as the keys.
106 pub inline fn initEnum() Self {
107107 comptime {
108108 var self: Self = .{};
109109
110 const field_names = @typeInfo(E).@"enum".field_names;
110 const field_names = @typeInfo(V).@"enum".field_names;
111111 if (field_names.len == 0) return self;
112112
113113 // Since the KVs are sorted, a linearly-growing bound will never
......@@ -116,7 +116,8 @@ pub fn StaticStringMapWithEql(
116116 @setEvalBranchQuota(10 * field_names.len * std.math.log2_int_ceil(usize, field_names.len));
117117
118118 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
121122 for (field_names) |field_name| {
122123 self.min_len = @min(self.min_len, field_name.len);
......@@ -584,12 +585,12 @@ test "sorting kvs doesn't exceed eval branch quota" {
584585
585586test "initEnum" {
586587 const UnsortedEnum = enum { BB, A, CCC, DDD };
587 const map = StaticStringMap(void).initEnum(UnsortedEnum);
588 const map = StaticStringMap(UnsortedEnum).initEnum();
588589 try testing.expect(map.has("A"));
589590 try testing.expect(!map.has("a"));
590 try testing.expectEqual(0, map.getIndex("BB"));
591 try testing.expectEqual(1, map.getIndex("A"));
592 try testing.expectEqual(2, map.getIndex("CCC"));
593 try testing.expectEqual(3, map.getIndex("DDD"));
591 try testing.expectEqual(.BB, map.get("BB"));
592 try testing.expectEqual(.A, map.get("A"));
593 try testing.expectEqual(.CCC, map.get("CCC"));
594 try testing.expectEqual(.DDD, map.get("DDD"));
594595 try testing.expectEqual(null, map.getIndex("F"));
595596}
src/main.zig+3-3
......@@ -229,7 +229,7 @@ pub fn main(init: std.process.Init.Minimal) anyerror!void {
229229 return mainArgs(gpa, arena, io, args, &environ_map);
230230}
231231
232const cmd_map = std.StaticStringMap(void).initEnum(Cmd);
232const cmd_map = std.StaticStringMap(Cmd).initEnum();
233233
234234const Cmd = enum {
235235 @"build-exe",
......@@ -322,10 +322,10 @@ fn mainArgs(
322322
323323 const cmd = args[1];
324324 const cmd_args = args[2..];
325 switch (@as(Cmd, @enumFromInt(cmd_map.getIndex(cmd) orelse {
325 switch (cmd_map.get(cmd) orelse {
326326 std.log.info("{s}", .{usage});
327327 fatal("unknown command: {s}", .{args[1]});
328 }))) {
328 }) {
329329 .@"build-exe" => {
330330 dev.check(.build_exe_command);
331331 return buildOutputType(gpa, arena, io, args, .{ .build = .Exe }, environ_map);