Radix/ffi/zig_allocator.zig

26 lines
1.0 KiB
Zig
Raw Normal View History

const std = @import("std");
const c = @import("c");
pub const ZigAllocator = struct {
pub inline fn from(allocator: std.mem.Allocator) c.zig_allocator {
return .{
.ctx = @ptrCast(@alignCast(&allocator)),
.alloc = &alloc,
.free = &free,
};
}
pub fn alloc(ctx: ?*const anyopaque, elem: usize, nelems: usize, alignment: usize) callconv(.C) ?*anyopaque {
const self: *const std.mem.Allocator = @ptrCast(@alignCast(ctx));
const ret = self.rawAlloc(elem * nelems, std.math.log2_int(usize, alignment), @returnAddress()) orelse return null;
return @ptrCast(ret);
}
pub fn free(ctx: ?*const anyopaque, ptr: ?*anyopaque, elem: usize, nelems: usize, alignment: usize) callconv(.C) void {
const self: *const std.mem.Allocator = @ptrCast(@alignCast(ctx));
const memory: [*c]u8 = @ptrCast(ptr);
const size = elem * nelems;
self.rawFree(memory[0..size], std.math.log2_int(usize, alignment), @returnAddress());
}
};