Type Function ValidationAllocator [src]

Detects and asserts if the std.mem.Allocator interface is violated by the caller or the allocator.

Prototype

pub fn ValidationAllocator(comptime T: type) type

Parameters

T: type

Source

pub fn ValidationAllocator(comptime T: type) type { return struct { const Self = @This(); underlying_allocator: T, pub fn init(underlying_allocator: T) @This() { return .{ .underlying_allocator = underlying_allocator, }; } pub fn allocator(self: *Self) Allocator { return .{ .ptr = self, .vtable = &.{ .alloc = alloc, .resize = resize, .remap = remap, .free = free, }, }; } fn getUnderlyingAllocatorPtr(self: *Self) Allocator { if (T == Allocator) return self.underlying_allocator; return self.underlying_allocator.allocator(); } pub fn alloc( ctx: *anyopaque, n: usize, alignment: mem.Alignment, ret_addr: usize, ) ?[*]u8 { assert(n > 0); const self: *Self = @ptrCast(@alignCast(ctx)); const underlying = self.getUnderlyingAllocatorPtr(); const result = underlying.rawAlloc(n, alignment, ret_addr) orelse return null; assert(alignment.check(@intFromPtr(result))); return result; } pub fn resize( ctx: *anyopaque, buf: []u8, alignment: Alignment, new_len: usize, ret_addr: usize, ) bool { const self: *Self = @ptrCast(@alignCast(ctx)); assert(buf.len > 0); const underlying = self.getUnderlyingAllocatorPtr(); return underlying.rawResize(buf, alignment, new_len, ret_addr); } pub fn remap( ctx: *anyopaque, buf: []u8, alignment: Alignment, new_len: usize, ret_addr: usize, ) ?[*]u8 { const self: *Self = @ptrCast(@alignCast(ctx)); assert(buf.len > 0); const underlying = self.getUnderlyingAllocatorPtr(); return underlying.rawRemap(buf, alignment, new_len, ret_addr); } pub fn free( ctx: *anyopaque, buf: []u8, alignment: Alignment, ret_addr: usize, ) void { const self: *Self = @ptrCast(@alignCast(ctx)); assert(buf.len > 0); const underlying = self.getUnderlyingAllocatorPtr(); underlying.rawFree(buf, alignment, ret_addr); } pub fn reset(self: *Self) void { self.underlying_allocator.reset(); } }; }