Skip to content

Instantly share code, notes, and snippets.

@GavinRay97
Created November 21, 2022 01:08
Show Gist options
  • Save GavinRay97/931af06013978ca459b0b096e6483789 to your computer and use it in GitHub Desktop.
Save GavinRay97/931af06013978ca459b0b096e6483789 to your computer and use it in GitHub Desktop.
Zig VTable example
pub fn HeapPage_init(self: *HeapPage) void {
self.page.header.lsn = 0;
self.page.header.num_records = 0;
self.page.header.free_space_end = @intCast(u16, PAGE_SIZE);
}
pub fn HeapPage_getFreeSpace(self: *HeapPage) u16 {
return self.page.header.free_space_end - HEADER_SZ - self.page.header.num_records * SLOT_SZ;
}
pub fn HeapPage_getRecord(self: *HeapPage, slot: u16) []u8 {
assert(slot < self.page.header.num_records);
const slot_ptr = &self.page.slots[slot];
return self.page.data[slot_ptr.page_offset .. slot_ptr.page_offset + slot_ptr.record_length];
}
const IHeapPage = struct {
const Self = @This();
page: HeapPage,
vtable: *const VTable,
const VTable = struct {
init: fn (self: *Self) void,
getFreeSpace: fn (self: *Self) u16,
getRecord: fn (self: *Self, slot: u16) []u8,
};
pub fn init(self: *Self) void {
self.vtable.init(self);
}
pub fn getFreeSpace(self: *Self) u16 {
return self.vtable.getFreeSpace(self);
}
pub fn getRecord(self: *Self, slot: u16) []u8 {
return self.vtable.getRecord(self, slot);
}
};
const HeapPageVTable = struct {
const Self = @This();
vtable: IHeapPage.VTable,
pub fn init(self: *Self) void {
self.vtable.init = HeapPage_init;
self.vtable.getFreeSpace = HeapPage_getFreeSpace;
self.vtable.getRecord = HeapPage_getRecord;
}
};
const HeapPageVTableInstance = HeapPageVTable.init();
const HeapPageInstance = IHeapPage{
.page = HeapPage.init(),
.vtable = &HeapPageVTableInstance.vtable,
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment