Commit 78a1f6976d

data-man <datamanrb@gmail.com>
2020-05-27 01:00:38
Add more traits
1 parent b6e1670
Changed files (1)
lib
std
lib/std/meta/trait.zig
@@ -345,3 +345,69 @@ 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 {}
+    };
+
+    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"}));
+}
+
+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 {}
+    };
+
+    testing.expect(!hasFields(TestStruct1, .{"a"}));
+    testing.expect(hasFields(TestStruct2, .{"a", "b"}));
+    testing.expect(hasFields(TestStruct2, .{"a", "b", "c"}));
+    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 {}
+    };
+
+    testing.expect(!hasFunctions(TestStruct1, .{"a"}));
+    testing.expect(hasFunctions(TestStruct2, .{"a", "b"}));
+    testing.expect(!hasFunctions(TestStruct2, .{"a", "b", "c"}));
+}