Parse access flags
This commit is contained in:
parent
1e6be5588a
commit
7d7df22df3
5 changed files with 147 additions and 14 deletions
44
src/EnumFlags.zig
Normal file
44
src/EnumFlags.zig
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue