commit 8f4bc772604e708a150b279ffbaff0076c4b212d (tree)
parent f9b220ec2c5203fc70bab3b872cf6cd100651357
Author: Andrew Kelley <andrew@ziglang.org>
Date: Mon, 1 Jun 2020 14:50:01 -0400
Merge pull request #5449 from data-man/more_traits
Add more traits
Diffstat:
1 file changed, 75 insertions(+), 0 deletions(-)
diff --git a/lib/std/meta/trait.zig b/lib/std/meta/trait.zig
@@ -341,3 +341,78 @@ test "std.meta.trait.isContainer" {
testing.expect(isContainer(TestEnum));
testing.expect(!isContainer(u8));
}
+
+pub fn hasDecls(comptime T: type, comptime names: var) bool {
+ inline for (names) |name| {
+ if (!@hasDecl(T, name))
+ return false;
+ }
+ return true;
+}
+
+test "std.meta.trait.hasDecls" {
+ const TestStruct1 = struct {};
+ const TestStruct2 = struct {
+ pub var a: u32;
+ pub var b: u32;
+ c: bool,
+ pub fn useless() void {}
+ };
+
+ const tuple = .{ "a", "b", "c" };
+
+ testing.expect(!hasDecls(TestStruct1, .{"a"}));
+ testing.expect(hasDecls(TestStruct2, .{ "a", "b" }));
+ testing.expect(hasDecls(TestStruct2, .{ "a", "b", "useless" }));
+ testing.expect(!hasDecls(TestStruct2, .{ "a", "b", "c" }));
+ testing.expect(!hasDecls(TestStruct2, tuple));
+}
+
+pub fn hasFields(comptime T: type, comptime names: var) bool {
+ inline for (names) |name| {
+ if (!@hasField(T, name))
+ return false;
+ }
+ return true;
+}
+
+test "std.meta.trait.hasFields" {
+ const TestStruct1 = struct {};
+ const TestStruct2 = struct {
+ a: u32,
+ b: u32,
+ c: bool,
+ pub fn useless() void {}
+ };
+
+ const tuple = .{ "a", "b", "c" };
+
+ testing.expect(!hasFields(TestStruct1, .{"a"}));
+ testing.expect(hasFields(TestStruct2, .{ "a", "b" }));
+ testing.expect(hasFields(TestStruct2, .{ "a", "b", "c" }));
+ testing.expect(hasFields(TestStruct2, tuple));
+ testing.expect(!hasFields(TestStruct2, .{ "a", "b", "useless" }));
+}
+
+pub fn hasFunctions(comptime T: type, comptime names: var) bool {
+ inline for (names) |name| {
+ if (!hasFn(name)(T))
+ return false;
+ }
+ return true;
+}
+
+test "std.meta.trait.hasFunctions" {
+ const TestStruct1 = struct {};
+ const TestStruct2 = struct {
+ pub fn a() void {}
+ fn b() void {}
+ };
+
+ const tuple = .{ "a", "b", "c" };
+
+ testing.expect(!hasFunctions(TestStruct1, .{"a"}));
+ testing.expect(hasFunctions(TestStruct2, .{ "a", "b" }));
+ testing.expect(!hasFunctions(TestStruct2, .{ "a", "b", "c" }));
+ testing.expect(!hasFunctions(TestStruct2, tuple));
+}