zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

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:
Mlib/std/meta/trait.zig | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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)); +}