Compare commits
1 commit
master
...
feature/te
| Author | SHA1 | Date | |
|---|---|---|---|
| 9e0e5ff8ea |
1 changed files with 74 additions and 1 deletions
|
|
@ -8,7 +8,13 @@ pub fn EnumFlags(comptime E: type) type {
|
||||||
|
|
||||||
mask: BackingInt,
|
mask: BackingInt,
|
||||||
|
|
||||||
pub const empty: Self = .{ .data = 0 };
|
pub const empty: Self = .{ .mask = 0 };
|
||||||
|
|
||||||
|
test empty {
|
||||||
|
const flags: EnumFlags(Enum) = .empty;
|
||||||
|
|
||||||
|
try std.testing.expectEqual(0b0000_0000, flags.mask);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn from(mask: BackingInt) Self {
|
pub fn from(mask: BackingInt) Self {
|
||||||
return .{
|
return .{
|
||||||
|
|
@ -16,6 +22,12 @@ pub fn EnumFlags(comptime E: type) type {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test from {
|
||||||
|
const flags: EnumFlags(Enum) = .from(0b0000_0001);
|
||||||
|
|
||||||
|
try std.testing.expectEqual(0b0000_0001, flags.mask);
|
||||||
|
}
|
||||||
|
|
||||||
pub fn contains(self: Self, flag: E) bool {
|
pub fn contains(self: Self, flag: E) bool {
|
||||||
return (self.mask & @intFromEnum(flag)) != 0;
|
return (self.mask & @intFromEnum(flag)) != 0;
|
||||||
}
|
}
|
||||||
|
|
@ -48,3 +60,64 @@ pub fn EnumFlags(comptime E: type) type {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Enum = enum(u8) {
|
||||||
|
a = 0b0000_0001,
|
||||||
|
b = 0b0000_0010,
|
||||||
|
c = 0b0000_0100,
|
||||||
|
};
|
||||||
|
|
||||||
|
test {
|
||||||
|
|
||||||
|
std.testing.refAllDecls(EnumFlags(Enum));
|
||||||
|
}
|
||||||
|
|
||||||
|
test "EnumFlags operations" {
|
||||||
|
var flags: EnumFlags(Enum) = .from(0b0000_0001);
|
||||||
|
|
||||||
|
try std.testing.expect(flags.contains(Enum.a));
|
||||||
|
|
||||||
|
flags.remove(Enum.a);
|
||||||
|
try std.testing.expect(!flags.contains(Enum.a));
|
||||||
|
|
||||||
|
flags.remove(Enum.a); // Removing twice should not enable the flag
|
||||||
|
try std.testing.expect(!flags.contains(Enum.a));
|
||||||
|
|
||||||
|
flags.insert(Enum.b);
|
||||||
|
try std.testing.expectEqual(0b0000_0010, flags.mask);
|
||||||
|
try std.testing.expect(flags.contains(Enum.b));
|
||||||
|
try std.testing.expect(!flags.contains(Enum.a));
|
||||||
|
|
||||||
|
flags.toggle(Enum.a);
|
||||||
|
try std.testing.expectEqual(0b0000_0011, flags.mask);
|
||||||
|
try std.testing.expect(flags.contains(Enum.a));
|
||||||
|
try std.testing.expect(flags.contains(Enum.b));
|
||||||
|
try std.testing.expect(!flags.contains(Enum.c));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn testFormat(expected: []const u8, flags: EnumFlags(Enum)) !void {
|
||||||
|
var out_buf: [1024]u8 = undefined;
|
||||||
|
var out: std.Io.Writer = .fixed(&out_buf);
|
||||||
|
|
||||||
|
try flags.format(&out);
|
||||||
|
|
||||||
|
try std.testing.expectEqualStrings(expected, out.buffered());
|
||||||
|
}
|
||||||
|
|
||||||
|
test "EnumFlags format" {
|
||||||
|
var flags: EnumFlags(Enum) = .empty;
|
||||||
|
|
||||||
|
flags.toggle(Enum.a);
|
||||||
|
flags.toggle(Enum.b);
|
||||||
|
flags.toggle(Enum.c);
|
||||||
|
try testFormat("a | b | c", flags);
|
||||||
|
|
||||||
|
flags.toggle(Enum.b);
|
||||||
|
try testFormat("a | c", flags);
|
||||||
|
|
||||||
|
flags.remove(Enum.c);
|
||||||
|
try testFormat("a", flags);
|
||||||
|
|
||||||
|
flags.insert(Enum.b);
|
||||||
|
try testFormat("a | b", flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue