Add command flag mixin for flag computations.

This commit is contained in:
InKryption
2022-06-03 13:52:58 +02:00
parent 05deff877b
commit be31203f2e

View File

@@ -923,6 +923,49 @@ fn Renderer(comptime WriterType: type) type {
} }
fn renderWrappers(self: *Self) !void { fn renderWrappers(self: *Self) !void {
try self.writer.writeAll(
\\pub fn CommandFlagsMixin(comptime CommandFlags: type) type {
\\ return struct {
\\ pub fn merge(lhs: CommandFlags, rhs: CommandFlags) CommandFlags {
\\ var result: CommandFlags = .{};
\\ inline for (@typeInfo(CommandFlags).Struct.fields) |field| {
\\ @field(result, field.name) = @field(lhs, field.name) or @field(rhs, field.name);
\\ }
\\ return result;
\\ }
\\ pub fn intersect(lhs: CommandFlags, rhs: CommandFlags) CommandFlags {
\\ var result: CommandFlags = .{};
\\ inline for (@typeInfo(CommandFlags).Struct.fields) |field| {
\\ @field(result, field.name) = @field(lhs, field.name) and @field(rhs, field.name);
\\ }
\\ return result;
\\ }
\\ pub fn complement(self: CommandFlags) CommandFlags {
\\ var result: CommandFlags = .{};
\\ inline for (@typeInfo(CommandFlags).Struct.fields) |field| {
\\ @field(result, field.name) = !@field(self, field.name);
\\ }
\\ return result;
\\ }
\\ pub fn subtract(lhs: CommandFlags, rhs: CommandFlags) CommandFlags {
\\ var result: CommandFlags = .{};
\\ inline for (@typeInfo(CommandFlags).Struct.fields) |field| {
\\ @field(result, field.name) = @field(lhs, field.name) and !@field(rhs, field.name);
\\ }
\\ return result;
\\ }
\\ pub fn contains(lhs: CommandFlags, rhs: CommandFlags) bool {
\\ inline for (@typeInfo(CommandFlags).Struct.fields) |field| {
\\ if (!@field(lhs, field.name) and @field(rhs, field.name)) {
\\ return false;
\\ }
\\ }
\\ return true;
\\ }
\\ };
\\}
\\
);
try self.renderWrappersOfDispatchType(.base); try self.renderWrappersOfDispatchType(.base);
try self.renderWrappersOfDispatchType(.instance); try self.renderWrappersOfDispatchType(.instance);
try self.renderWrappersOfDispatchType(.device); try self.renderWrappersOfDispatchType(.device);
@@ -951,8 +994,12 @@ fn Renderer(comptime WriterType: type) type {
try self.writer.writeAll(": bool = false,\n"); try self.writer.writeAll(": bool = false,\n");
} }
} }
// TODO: Add methods for merging/intersecting/etc the flag struct here
try self.writer.writeAll("};\n"); try self.writer.print(
\\ pub usingnamespace CommandFlagsMixin({s}CommandFlags);
\\}};
\\
, .{name});
try self.writer.print( try self.writer.print(
\\pub fn {0s}Wrapper(comptime cmds: {0s}CommandFlags) type {{ \\pub fn {0s}Wrapper(comptime cmds: {0s}CommandFlags) type {{