From e1980e2fe0d206942537cfb992c78e5800411846 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Thu, 4 Jun 2026 00:05:23 -0700 Subject: [PATCH] std.StaticStringMap: fix initEnum and usage --- lib/std/static_string_map.zig | 19 ++++++++++--------- src/main.zig | 6 +++--- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/lib/std/static_string_map.zig b/lib/std/static_string_map.zig index 0cb29d7a3789828b3054efffe7fdab2e2cf97672..f0bfc2adb75cb7b4852d2c0719b8761db0e38cf4 100644 --- a/lib/std/static_string_map.zig +++ b/lib/std/static_string_map.zig @@ -102,12 +102,12 @@ pub fn StaticStringMapWithEql( /// Returns a map backed by static, comptime allocated memory. /// - /// `V` must be `void`. The enum's tag names will be used as the keys. - pub inline fn initEnum(comptime E: type) Self { + /// `V` must be an enum. The enum's tag names will be used as the keys. + pub inline fn initEnum() Self { comptime { var self: Self = .{}; - const field_names = @typeInfo(E).@"enum".field_names; + const field_names = @typeInfo(V).@"enum".field_names; if (field_names.len == 0) return self; // Since the KVs are sorted, a linearly-growing bound will never @@ -116,7 +116,8 @@ pub fn StaticStringMapWithEql( @setEvalBranchQuota(10 * field_names.len * std.math.log2_int_ceil(usize, field_names.len)); var sorted_keys: [field_names.len][]const u8 = field_names[0..field_names.len].*; - var sorted_vals: [field_names.len]V = @splat({}); + var sorted_vals: [field_names.len]V = undefined; + for (&sorted_vals, @typeInfo(V).@"enum".field_values) |*x, i| x.* = @enumFromInt(i); for (field_names) |field_name| { self.min_len = @min(self.min_len, field_name.len); @@ -584,12 +585,12 @@ test "sorting kvs doesn't exceed eval branch quota" { test "initEnum" { const UnsortedEnum = enum { BB, A, CCC, DDD }; - const map = StaticStringMap(void).initEnum(UnsortedEnum); + const map = StaticStringMap(UnsortedEnum).initEnum(); try testing.expect(map.has("A")); try testing.expect(!map.has("a")); - try testing.expectEqual(0, map.getIndex("BB")); - try testing.expectEqual(1, map.getIndex("A")); - try testing.expectEqual(2, map.getIndex("CCC")); - try testing.expectEqual(3, map.getIndex("DDD")); + try testing.expectEqual(.BB, map.get("BB")); + try testing.expectEqual(.A, map.get("A")); + try testing.expectEqual(.CCC, map.get("CCC")); + try testing.expectEqual(.DDD, map.get("DDD")); try testing.expectEqual(null, map.getIndex("F")); } diff --git a/src/main.zig b/src/main.zig index 38edface403010cc9a95203fe650641caba0973d..09073eaa08283031212cf062f4b09019b3d4043f 100644 --- a/src/main.zig +++ b/src/main.zig @@ -229,7 +229,7 @@ pub fn main(init: std.process.Init.Minimal) anyerror!void { return mainArgs(gpa, arena, io, args, &environ_map); } -const cmd_map = std.StaticStringMap(void).initEnum(Cmd); +const cmd_map = std.StaticStringMap(Cmd).initEnum(); const Cmd = enum { @"build-exe", @@ -322,10 +322,10 @@ fn mainArgs( const cmd = args[1]; const cmd_args = args[2..]; - switch (@as(Cmd, @enumFromInt(cmd_map.getIndex(cmd) orelse { + switch (cmd_map.get(cmd) orelse { std.log.info("{s}", .{usage}); fatal("unknown command: {s}", .{args[1]}); - }))) { + }) { .@"build-exe" => { dev.check(.build_exe_command); return buildOutputType(gpa, arena, io, args, .{ .build = .Exe }, environ_map); -- 2.54.0