Now that the new for loop syntax has landed, there is a pretty cool combination you can do with for loops and std.MultiArrayList
:
const std = @import("std");
const S = struct {
tag: u8,
data: u32,
};
pub fn main() !void {
var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator);
const arena = arena_instance.allocator();
var list: std.MultiArrayList(S) = .{};
try list.append(arena, .{ .tag = 42, .data = 99999999 });
try list.append(arena, .{ .tag = 10, .data = 1231011 });
try list.append(arena, .{ .tag = 69, .data = 1337 });
try list.append(arena, .{ .tag = 1, .data = 1 });
for (list.items(.tag), list.items(.data)) |tag, data| {
std.debug.print("tag = {d}, data = {d}\n", .{ tag, data });
}
}
Output:
$ zig run test.zig
tag = 42, data = 99999999
tag = 10, data = 1231011
tag = 69, data = 1337
tag = 1, data = 1
I'll further augment it with some sorting because I think the API is pretty dang cool:
const std = @import("std");
const S = struct {
tag: u8,
data: u32,
};
pub fn main() !void {
var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator);
const arena = arena_instance.allocator();
var list: std.MultiArrayList(S) = .{};
try list.append(arena, .{ .tag = 42, .data = 99999999 });
try list.append(arena, .{ .tag = 10, .data = 1231011 });
try list.append(arena, .{ .tag = 69, .data = 1337 });
try list.append(arena, .{ .tag = 1, .data = 1 });
const TagSort = struct {
tags: []const u8,
pub fn lessThan(ctx: @This(), lhs_index: usize, rhs_index: usize) bool {
return ctx.tags[lhs_index] < ctx.tags[rhs_index];
}
};
list.sort(TagSort{ .tags = list.items(.tag) });
for (list.items(.tag), list.items(.data)) |tag, data| {
std.debug.print("tag = {d}, data = {d}\n", .{ tag, data });
}
}
Output:
$ zig run test.zig
tag = 1, data = 1
tag = 10, data = 1231011
tag = 42, data = 99999999
tag = 69, data = 1337
The key thing to note here is that, in these examples there are two arrays, one for tag
and one for data
. These examples demonstrate Zig's ability to manipulate struct-of-arrays with ease.
Top comments (3)
Awesome.
MultiArrayList
rocks.Zip 'em together and what do you get? Bippity boppity boo
That's awesome!
Why don't you deinitialize the Arena instance with 'defer'?