java-class-parser/src/EnumFlags.zig
2026-07-14 10:13:26 +00:00

50 lines
1.3 KiB
Zig

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 from(mask: BackingInt) Self {
return .{
.mask = mask,
};
}
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;
}
}
}
};
}