You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.8 KiB
58 lines
1.8 KiB
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]; |
|
} |
|
}; |
|
}
|
|
|