Parse access flags

This commit is contained in:
ktkk 2026-06-19 11:35:45 +00:00
parent 1e6be5588a
commit 7d7df22df3
5 changed files with 147 additions and 14 deletions

44
src/EnumFlags.zig Normal file
View file

@ -0,0 +1,44 @@
const std = @import("std");
pub fn EnumFlags(comptime E: type) type {
return packed struct {
const Self = @This();
const BackingInt = @typeInfo(E).@"enum".tag_type;
mask: BackingInt,
pub const empty: Self = .{ .data = 0 };
pub fn contains(self: Self, flag: E) bool {
return (self.mask & @intFromEnum(flag)) != 0;
}
pub fn insert(self: *Self, flag: E) void {
self.mask |= @intFromEnum(flag);
}
pub fn remove(self: *Self, flag: E) void {
self.mask &= ~@intFromEnum(flag);
}
pub fn toggle(self: *Self, flag: E) void {
self.mask ^= @intFromEnum(flag);
}
pub fn format(self: *const Self, w: *std.Io.Writer) std.Io.Writer.Error!void {
var index: usize = 0;
inline for (std.meta.fields(E)) |field| {
const key = @field(E, field.name);
if (self.contains(key)) {
if (index > 0) {
_ = try w.write(" | ");
}
try w.print("{s}", .{ field.name });
index += 1;
}
}
}
};
}