I want to have an ArrayList field in my structure, but can’t quite understand how to declare + initialize it:
const std = @import("std");
const ShaderManager = struct
{
shader_progs: @TypeOf(std.ArrayList(u32)), // also tried std.ArrayList(u32)
pub fn init(alloc8r: std.mem.Allocator) !ShaderManager
{
const sm = ShaderManager;
sm.shader_progs = std.ArrayList(u32).init(alloc8r);
for (0..10) |shdr_prog|
try sm.shader_progs.append(shdr_prog);
return sm;
}
pub fn deinit(self: *ShaderManager) void
{
// or, var iter = self.shader_progs.iterator();
// for (iter) |shdr_prog|
for (self.shader_progs.toSlice()) |shdr_prog|
std.debug.print("Deleting shader program = {}\n", .{shdr_prog});
self.shader_progs.deinit();
}
};
pub fn main() !void
{
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const alloc8r = gpa.allocator();
defer _ = gpa.deinit();
var sm: ShaderManager = try ShaderManager.init(alloc8r);
sm.deinit();
}
Looking into standard library sources, I can see that ArrayList is not a type, but a function that returns anonymous struct.
Is there a way to declare a variable of “ArrayList type” without initializing it?
I have read about Struct Naming, but don’t understand how do I apply it in my case. Trying shader_progs: std.ArrayList(u32),
produces this confusing error:
error: struct 'arraylist_02.ShaderManager' has no member named 'shader_progs'
sm.shader_progs = std.ArrayList(u32).init(alloc8r);
^~~~~~~~~~~~