From c4ad6be0023ad351a59f53cab7c59fccecb6f82d Mon Sep 17 00:00:00 2001 From: Christofer Nolander Date: Thu, 28 Sep 2023 23:48:39 +0200 Subject: [PATCH] Allow empty `enum` to be used in `EnumSet`/`EnumMap` Moves the check for empty fields before any access to those fields. --- lib/std/enums.zig | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/std/enums.zig b/lib/std/enums.zig index 8cfba1f802..4caf78f869 100644 --- a/lib/std/enums.zig +++ b/lib/std/enums.zig @@ -980,6 +980,17 @@ test "pure EnumSet fns" { try testing.expect(full.differenceWith(black).eql(red)); } +test "std.enums.EnumSet empty" { + const E = enum {}; + const empty = EnumSet(E).initEmpty(); + const full = EnumSet(E).initFull(); + + try std.testing.expect(empty.eql(full)); + try std.testing.expect(empty.complement().eql(full)); + try std.testing.expect(empty.complement().eql(full.complement())); + try std.testing.expect(empty.eql(full.complement())); +} + test "std.enums.EnumSet const iterator" { const Direction = enum { up, down, left, right }; const diag_move = init: { @@ -1296,9 +1307,8 @@ pub fn EnumIndexer(comptime E: type) type { const const_fields = std.meta.fields(E); var fields = const_fields[0..const_fields.len].*; - const min = fields[0].value; - const max = fields[fields.len - 1].value; const fields_len = fields.len; + if (fields_len == 0) { return struct { pub const Key = E; @@ -1314,6 +1324,9 @@ pub fn EnumIndexer(comptime E: type) type { }; } + const min = fields[0].value; + const max = fields[fields.len - 1].value; + const SortContext = struct { fields: []EnumField, @@ -1424,3 +1437,11 @@ test "std.enums.EnumIndexer sparse" { try testing.expectEqual(E.b, Indexer.keyForIndex(1)); try testing.expectEqual(E.c, Indexer.keyForIndex(2)); } + +test "std.enums.EnumIndexer empty" { + const E = enum {}; + const Indexer = EnumIndexer(E); + ensureIndexer(Indexer); + try testing.expectEqual(E, Indexer.Key); + try testing.expectEqual(@as(usize, 0), Indexer.count); +}