From 362b148d5763fa3d99d9c4c4c822e233a65fb48d Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Sat, 21 Jun 2025 18:54:33 -0700 Subject: [PATCH] add join --- src/join.zig | 30 ++++++++++++++++++++++++++++++ src/lib.zig | 1 + 2 files changed, 31 insertions(+) create mode 100644 src/join.zig diff --git a/src/join.zig b/src/join.zig new file mode 100644 index 0000000000000000000000000000000000000000..831c8a8647c0db3801a0e79e282d8485e88df4f2 --- /dev/null +++ b/src/join.zig @@ -0,0 +1,30 @@ +const std = @import("std"); +const string = []const u8; +const extras = @import("./lib.zig"); + +pub fn join(input: anytype) Join(@TypeOf(input)) { + const T = @TypeOf(input); + var x: Join(T) = undefined; + inline for (std.meta.fields(T)) |item| { + inline for (std.meta.fields(item.type)) |f| { + @field(x, f.name) = @field(@field(input, item.name), f.name); + } + } + return x; +} + +pub fn Join(comptime T: type) type { + var fields: []const std.builtin.Type.StructField = &.{}; + inline for (std.meta.fields(T)) |item| { + inline for (std.meta.fields(item.type)) |f| { + fields = fields ++ &[_]std.builtin.Type.StructField{.{ + .name = f.name, + .type = f.type, + .default_value_ptr = null, + .is_comptime = false, + .alignment = @alignOf(f.type), + }}; + } + } + return @Type(.{ .@"struct" = .{ .layout = .auto, .fields = fields, .decls = &.{}, .is_tuple = false } }); +} diff --git a/src/lib.zig b/src/lib.zig index 5337e1355ba7f90c7f38b8d8ea8be1461e6437df..35322712a34bcf234aa5ac292511d8c8dbc60baf 100644 --- a/src/lib.zig +++ b/src/lib.zig @@ -106,3 +106,4 @@ pub usingnamespace @import("./hasFields.zig"); pub usingnamespace @import("./StructOfSlices.zig"); pub usingnamespace @import("./StructOfArrays.zig"); pub usingnamespace @import("./StaticMultiList.zig"); +pub usingnamespace @import("./join.zig"); -- 2.54.0