From 8ecefa4b3fd56fc87f822f3dbefa1ce1ef6601d8 Mon Sep 17 00:00:00 2001 From: jjanzen Date: Wed, 22 Jan 2025 12:17:02 -0600 Subject: generic io interface --- src/frontend/io_interface.zig | 50 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 src/frontend/io_interface.zig (limited to 'src/frontend/io_interface.zig') diff --git a/src/frontend/io_interface.zig b/src/frontend/io_interface.zig new file mode 100644 index 0000000..a2aa0ca --- /dev/null +++ b/src/frontend/io_interface.zig @@ -0,0 +1,50 @@ +const std = @import("std"); +const Action = @import("../actions.zig").Action; + +pub const IOInterface = struct { + ptr: *anyopaque, + displayMessageFn: *const fn (ptr: *anyopaque, str: []const u8) anyerror!void, + waitForTickFn: *const fn (ptr: *anyopaque) anyerror!Action, + deinitFn: *const fn (ptr: *anyopaque) void, + + pub fn init(ptr: anytype) !IOInterface { + const T = @TypeOf(ptr); + const ptr_info = @typeInfo(T); + + const gen = struct { + pub fn displayMessage(pointer: *anyopaque, str: []const u8) anyerror!void { + const self: T = @ptrCast(@alignCast(pointer)); + return ptr_info.Pointer.child.displayMessage(self, str); + } + + pub fn waitForTick(pointer: *anyopaque) anyerror!Action { + const self: T = @ptrCast(@alignCast(pointer)); + return ptr_info.Pointer.child.waitForTick(self); + } + + pub fn deinit(pointer: *anyopaque) void { + const self: T = @ptrCast(@alignCast(pointer)); + return ptr_info.Pointer.child.deinit(self); + } + }; + + return .{ + .ptr = ptr, + .displayMessageFn = gen.displayMessage, + .waitForTickFn = gen.waitForTick, + .deinitFn = gen.deinit, + }; + } + + pub fn displayMessage(self: IOInterface, str: []const u8) anyerror!void { + return self.displayMessageFn(self.ptr, str); + } + + pub fn waitForTick(self: IOInterface) anyerror!Action { + return self.waitForTickFn(self.ptr); + } + + pub fn deinit(self: IOInterface) void { + return self.deinitFn(self.ptr); + } +}; -- cgit v1.2.3