From 4fdf3969cfbb26fcb16b1107f25c679441eb47f9 Mon Sep 17 00:00:00 2001 From: Jimmi Holst Christensen Date: Fri, 8 Nov 2024 15:50:45 +0100 Subject: WIP: zig-clap v2 --- clap/types.zig | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 clap/types.zig (limited to 'clap/types.zig') diff --git a/clap/types.zig b/clap/types.zig new file mode 100644 index 0000000..926659a --- /dev/null +++ b/clap/types.zig @@ -0,0 +1,59 @@ +pub fn isArrayListUnmanaged(comptime T: type) bool { + if (@typeInfo(T) != .@"struct" or !@hasDecl(T, "Slice")) + return false; + + const ptr_info = switch (@typeInfo(T.Slice)) { + .pointer => |info| info, + else => return false, + }; + + return T == std.ArrayListAlignedUnmanaged(ptr_info.child, null) or + T == std.ArrayListAlignedUnmanaged(ptr_info.child, ptr_info.alignment); +} + +test isArrayListUnmanaged { + try std.testing.expect(!isArrayListUnmanaged(u8)); + try std.testing.expect(!isArrayListUnmanaged([]const u8)); + try std.testing.expect(!isArrayListUnmanaged(struct { + pub const Slice = []const u8; + })); + try std.testing.expect(isArrayListUnmanaged(std.ArrayListUnmanaged(u8))); +} + +pub fn allFieldsHaveDefaults(comptime T: type) bool { + const info = switch (@typeInfo(T)) { + .@"struct" => |s| s, + else => return false, + }; + + inline for (info.fields) |field| { + if (field.default_value == null) + return false; + } + + return true; +} + +test allFieldsHaveDefaults { + try std.testing.expect(!allFieldsHaveDefaults(u8)); + try std.testing.expect(!allFieldsHaveDefaults([]const u8)); + try std.testing.expect(allFieldsHaveDefaults(struct {})); + try std.testing.expect(allFieldsHaveDefaults(struct { + a: u8 = 0, + })); + try std.testing.expect(!allFieldsHaveDefaults(struct { + a: u8, + })); + try std.testing.expect(!allFieldsHaveDefaults(struct { + a: u8, + b: u8 = 0, + c: u8, + })); + try std.testing.expect(allFieldsHaveDefaults(struct { + a: u8 = 1, + b: u8 = 0, + c: u8 = 3, + })); +} + +const std = @import("std"); -- cgit v1.2.3