summaryrefslogtreecommitdiff
path: root/example-interface/main.zig
diff options
context:
space:
mode:
Diffstat (limited to 'example-interface/main.zig')
-rw-r--r--example-interface/main.zig45
1 files changed, 45 insertions, 0 deletions
diff --git a/example-interface/main.zig b/example-interface/main.zig
new file mode 100644
index 0000000..085aa82
--- /dev/null
+++ b/example-interface/main.zig
@@ -0,0 +1,45 @@
+const std = @import("std");
+
+/// Interface type, holding a pointer to the object and the interface function pointers.
+const Iter = struct {
+ ptr: *anyopaque,
+ next_fn: *const fn (*anyopaque) ?i32,
+
+ /// Convenience wrapper to call vtable function.
+ pub fn next(self: Iter) ?i32 {
+ return self.next_fn(self.ptr);
+ }
+};
+
+const UpIter = struct {
+ end: i32,
+ now: i32 = 0,
+
+ /// Create an Inter interface object from UpIter.
+ pub fn iter(self: *UpIter) Iter {
+ return Iter{ .ptr = self, .next_fn = next };
+ }
+
+ pub fn next(ptr: *anyopaque) ?i32 {
+ const self: *UpIter = @alignCast(@ptrCast(ptr));
+ if (self.now < self.end) {
+ self.now += 1;
+ return self.now;
+ } else {
+ return null;
+ }
+ }
+};
+
+/// Function example taking an Iter interface object.
+fn run_iter(iter: Iter) void {
+ while (iter.next()) |v| {
+ std.debug.print("{},", .{v});
+ }
+ std.debug.print("\n", .{});
+}
+
+pub fn main() void {
+ var uit = UpIter{ .end = 10 };
+ run_iter(uit.iter());
+}