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()); }