pub const ByteVec = Vec(u8, wasm_byte_vec_new_empty, wasm_byte_vec_new_uninitialized, wasm_byte_vec_new, wasm_byte_vec_copy, wasm_byte_vec_delete); extern "c" fn wasm_byte_vec_new_empty(*anyopaque, usize) void; extern "c" fn wasm_byte_vec_new_uninitialized(*anyopaque, usize) void; extern "c" fn wasm_byte_vec_new(*anyopaque, usize, [*]const u8) void; extern "c" fn wasm_byte_vec_copy(*anyopaque, *const anyopaque) void; extern "c" fn wasm_byte_vec_delete(*anyopaque) void; pub const Name = ByteVec; pub const Message = ByteVec; pub fn Vec( comptime T: type, comptime empty_fn: anytype, comptime new_uninitialized_fn: anytype, comptime new_fn: anytype, comptime copy_fn: anytype, comptime delete_fn: anytype, ) type { return extern struct { const Self = @This(); const name = @typeName(T); size: usize, data: [*]T, pub fn initEmpty(size: usize) Self { var result: Self = undefined; @call(.auto, empty_fn, .{ &result, size }); return result; } pub fn initUninitialized(size: usize) Self { var result: Self = undefined; @call(.auto, new_uninitialized_fn, .{ &result, size }); return result; } pub fn initFromSlice(slice: []const T) Self { var result: Self = undefined; @call(.auto, new_fn, .{ &result, slice.len, slice.ptr }); return result; } pub fn copy(self: Self) Self { var result: Self = undefined; @call(.auto, copy_fn, .{ &result, &self }); return result; } pub fn deinit(self: Self) void { @call(.auto, delete_fn, .{@constCast(&self)}); } pub fn toSlice(self: Self) []const T { return self.data[0..self.size]; } }; }