authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-10-19 09:45:35+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-10-20 23:23:43+03:00
log90f7034b69e59c3deac4fc8850682b2d750793a4
treeb26be587e0812a7e1d24f7dad2a2afdca129212c
parenta12337814117243e20b5482f1ba9d5963678695b

std: Implement featureSetHasAny/featureSetHasAll

Introduce two helper functions to avoid writing short novels only to check for more than a single feature.

2 files changed, 24 insertions(+), 0 deletions(-)

lib/std/target.zig+19
......@@ -637,9 +637,28 @@ pub const Target = struct {
637637 return x;
638638 }
639639
640 /// Returns true if the specified feature is enabled.
640641 pub fn featureSetHas(set: Set, feature: F) bool {
641642 return set.isEnabled(@enumToInt(feature));
642643 }
644
645 /// Returns true if any specified feature is enabled.
646 pub fn featureSetHasAny(set: Set, features: anytype) bool {
647 comptime std.debug.assert(std.meta.trait.isIndexable(@TypeOf(features)));
648 inline for (features) |feature| {
649 if (set.isEnabled(@enumToInt(@as(F, feature)))) return true;
650 }
651 return false;
652 }
653
654 /// Returns true if every specified feature is enabled.
655 pub fn featureSetHasAll(set: Set, features: anytype) bool {
656 comptime std.debug.assert(std.meta.trait.isIndexable(@TypeOf(features)));
657 inline for (features) |feature| {
658 if (!set.isEnabled(@enumToInt(@as(F, feature)))) return false;
659 }
660 return true;
661 }
643662 };
644663 }
645664 };
lib/std/zig/cross_target.zig+5
......@@ -827,6 +827,11 @@ test "CrossTarget.parse" {
827827 std.testing.expect(Target.x86.featureSetHas(target.cpu.features, .cmov));
828828 std.testing.expect(Target.x86.featureSetHas(target.cpu.features, .fxsr));
829829
830 std.testing.expect(Target.x86.featureSetHasAny(target.cpu.features, .{ .sse, .avx, .cmov }));
831 std.testing.expect(!Target.x86.featureSetHasAny(target.cpu.features, .{ .sse, .avx }));
832 std.testing.expect(Target.x86.featureSetHasAll(target.cpu.features, .{ .mmx, .x87 }));
833 std.testing.expect(!Target.x86.featureSetHasAll(target.cpu.features, .{ .mmx, .x87, .sse }));
834
830835 const text = try cross_target.zigTriple(std.testing.allocator);
831836 defer std.testing.allocator.free(text);
832837 std.testing.expectEqualSlices(u8, "x86_64-linux-gnu", text);