From b46cbe7b2f31d0f4ea5e720f2d3657437b22e6c7 Mon Sep 17 00:00:00 2001 From: Meghan Denny Date: Tue, 15 Apr 2025 03:14:41 -0700 Subject: [PATCH] add MultiArray --- src/MultiArray.zig | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/lib.zig | 1 + 2 files changed, 45 insertions(+) create mode 100644 src/MultiArray.zig diff --git a/src/MultiArray.zig b/src/MultiArray.zig new file mode 100644 index 0000000000000000000000000000000000000000..5154699aa502ebd9e8eb90a1dbc33f4d279c3f95 --- /dev/null +++ b/src/MultiArray.zig @@ -0,0 +1,44 @@ +const std = @import("std"); +const string = []const u8; +const extras = @import("./lib.zig"); +const StructOfSlices = extras.StructOfSlices; +const StructOfArrays = extras.StructOfArrays; +const expectSimilarType = extras.expectSimilarType; + +pub fn MultiArray(T: type) type { + return struct { + items: StructOfSlices(T), + + pub fn initComptime(comptime data: []const T) @This() { + return comptime blk: { + var temp: StructOfArrays(data.len, T) = undefined; + for (data, 0..) |item, i| { + for (std.meta.fieldNames(T)) |name| { + @field(temp, name)[i] = @field(item, name); + } + } + var result: @This() = undefined; + for (std.meta.fields(T)) |field| { + const constant = @field(temp, field.name)[0..data.len].*; + @field(result.items, field.name) = &constant; + } + break :blk result; + }; + } + }; +} + +test { + try expectSimilarType( + MultiArray(struct { + x: u8, + y: u16, + }), + struct { + items: struct { + x: []const u8, + y: []const u16, + }, + }, + ); +} diff --git a/src/lib.zig b/src/lib.zig index 274c340ca504191044ad7fff70c9fb548d8d843f..99a78ab8186200b813d268d1fb3f3aab4d028637 100644 --- a/src/lib.zig +++ b/src/lib.zig @@ -107,3 +107,4 @@ pub usingnamespace @import("./hasFn.zig"); pub usingnamespace @import("./hasFields.zig"); pub usingnamespace @import("./StructOfSlices.zig"); pub usingnamespace @import("./StructOfArrays.zig"); +pub usingnamespace @import("./MultiArray.zig"); -- 2.54.0