36 lines
1.2 KiB
Zig
36 lines
1.2 KiB
Zig
const std = @import("std");
|
|
|
|
pub fn structToBitFields(comptime IntType: type, comptime EnumDataType: type, flags: anytype) IntType {
|
|
var value: IntType = 0;
|
|
inline for (comptime std.meta.fieldNames(EnumDataType)) |field_name| {
|
|
if (@field(flags, field_name)) {
|
|
value |= @enumToInt(@field(EnumDataType, field_name));
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
|
|
pub fn bitFieldsToStruct(comptime StructType: type, comptime EnumDataType: type, flags: anytype) StructType {
|
|
var value = std.mem.zeroes(StructType);
|
|
inline for (comptime std.meta.fieldNames(EnumDataType)) |field_name| {
|
|
if (flags & (@enumToInt(@field(EnumDataType, field_name))) != 0) {
|
|
@field(value, field_name) = true;
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
|
|
pub fn refAllDecls(comptime T: type) void {
|
|
@setEvalBranchQuota(10000);
|
|
inline for (comptime std.meta.declarations(T)) |decl| {
|
|
if (decl.is_pub) {
|
|
if (@TypeOf(@field(T, decl.name)) == type) {
|
|
switch (@typeInfo(@field(T, decl.name))) {
|
|
.Struct, .Enum, .Union, .Opaque => refAllDecls(@field(T, decl.name)),
|
|
else => {},
|
|
}
|
|
}
|
|
_ = @field(T, decl.name);
|
|
}
|
|
}
|
|
}
|