Merge pull request #5449 from data-man/more_traits

Add more traits
This commit is contained in:
Andrew Kelley 2020-06-01 14:50:01 -04:00 committed by GitHub
commit 8f4bc77260
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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));
}