Add union support to mapping helpers in zml/meta.zig.

This commit is contained in:
Tarry Singh 2025-01-01 13:35:17 +00:00
parent c961d705f1
commit 4b1a3ff48a

View File

@ -61,6 +61,31 @@ pub fn MapType(From: type, To: type) type {
.is_tuple = struct_infos.is_tuple,
} });
},
.@"union" => |union_info| {
const fields = union_info.fields;
var same: bool = true;
var union_fields: [fields.len]std.builtin.Type.UnionField = undefined;
for (union_fields[0..], fields) |*union_field, field| {
const R = map(field.type);
if (R == field.type) {
union_field.* = field;
} else {
union_field.* = .{
.name = field.name,
.type = R,
.alignment = @alignOf(R),
};
same = false;
}
}
if (same) return T;
return @Type(.{ .@"union" = .{
.layout = .auto,
.tag_type = union_info.tag_type,
.fields = union_fields[0..],
.decls = &.{},
} });
},
.array => |arr_info| [arr_info.len]map(arr_info.child),
.pointer => |ptr_info| switch (ptr_info.size) {
.slice => if (ptr_info.is_const)
@ -172,6 +197,14 @@ pub fn mapAlloc(comptime cb: anytype, allocator: std.mem.Allocator, ctx: FnParam
else => @field(to, field.name) = @field(from, field.name),
}
},
.@"union" => {
switch (from) {
inline else => |_, tag| {
to.* = @unionInit(ToStruct, @tagName(tag), undefined);
try mapAlloc(cb, allocator, ctx, @field(from, @tagName(tag)), &@field(to, @tagName(tag)));
},
}
},
.array => for (from, to) |f, *t| {
try mapAlloc(cb, allocator, ctx, f, t);
},
@ -202,7 +235,7 @@ pub fn mapAlloc(comptime cb: anytype, allocator: std.mem.Allocator, ctx: FnParam
} else {
to.* = null;
},
.int, .float, .@"enum", .@"union" => to.* = from,
.int, .float, .@"enum" => to.* = from,
else => stdx.debug.compileError("zml.meta.mapAlloc doesn't support: {}", .{FromStruct}),
}
}