Im attempting to do something like the following, but struggling quite a bit:
pub const MyTrait = Trait(struct {
fn foo(self: *anyopaque) void;
fn bar(self: *anyopaque, x: i32) i32;
});
const A = struct { val: i32 };
const B = struct { val: i32 };
comptime {
MyTrait.impl(A, struct {
fn foo(self: *anyopaque) void {
const s: *A = @ptrCast(self);
std.debug.print("A.foo {}\n", .{s.val});
}
fn bar(self: *anyopaque, x: i32) i32 {
const s: *A = @ptrCast(self);
return s.val + x;
}
});
MyTrait.impl(B, struct {
fn foo(self: *anyopaque) void {
const s: *B = @ptrCast(self);
std.debug.print("B.foo {}\n", .{s.val * 2});
}
fn bar(self: *anyopaque, x: i32) i32 {
const s: *B = @ptrCast(self);
return (s.val * 2) + x;
}
});
}
pub fn main() void {
var a = A{ .val = 3 };
var b = B{ .val = 4 };
const list = [_]MyTrait{
MyTrait.up(A, &a),
MyTrait.up(B, &b),
};
for (list) |o| {
o.vtable.foo(o.instance);
std.debug.print("bar = {}\n", .{o.vtable.bar(o.instance, 5)});
}
const a_ptr = MyTrait.down(A, list[0]);
std.debug.print("down-cast = {}\n", .{a_ptr.val});
}