| author | |
| committer | |
| log | 90f7034b69e59c3deac4fc8850682b2d750793a4 |
| tree | b26be587e0812a7e1d24f7dad2a2afdca129212c |
| parent | a12337814117243e20b5482f1ba9d5963678695b |
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 { | ... | @@ -637,9 +637,28 @@ pub const Target = struct { |
| 637 | return x; | 637 | return x; |
| 638 | } | 638 | } |
| 639 | 639 | ||
| 640 | /// Returns true if the specified feature is enabled. | ||
| 640 | pub fn featureSetHas(set: Set, feature: F) bool { | 641 | pub fn featureSetHas(set: Set, feature: F) bool { |
| 641 | return set.isEnabled(@enumToInt(feature)); | 642 | return set.isEnabled(@enumToInt(feature)); |
| 642 | } | 643 | } |
| 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 | } | ||
| 643 | }; | 662 | }; |
| 644 | } | 663 | } |
| 645 | }; | 664 | }; |
lib/std/zig/cross_target.zig+5| ... | @@ -827,6 +827,11 @@ test "CrossTarget.parse" { | ... | @@ -827,6 +827,11 @@ test "CrossTarget.parse" { |
| 827 | std.testing.expect(Target.x86.featureSetHas(target.cpu.features, .cmov)); | 827 | std.testing.expect(Target.x86.featureSetHas(target.cpu.features, .cmov)); |
| 828 | std.testing.expect(Target.x86.featureSetHas(target.cpu.features, .fxsr)); | 828 | std.testing.expect(Target.x86.featureSetHas(target.cpu.features, .fxsr)); |
| 829 | 829 | ||
| 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 | |||
| 830 | const text = try cross_target.zigTriple(std.testing.allocator); | 835 | const text = try cross_target.zigTriple(std.testing.allocator); |
| 831 | defer std.testing.allocator.free(text); | 836 | defer std.testing.allocator.free(text); |
| 832 | std.testing.expectEqualSlices(u8, "x86_64-linux-gnu", text); | 837 | std.testing.expectEqualSlices(u8, "x86_64-linux-gnu", text); |