// `xx allocator` recovers the typed concrete pointer (ctx) from a
// protocol value. The recovery is read-only and must not perturb
// subsequent dispatch through the protocol value, regardless of
// whether the recovery happens BEFORE or AFTER the first dispatch.

#import "modules/std.sx";

main :: () -> s32 {
    gpa := GPA.init();
    a : Allocator = xx gpa;

    // Recover BEFORE first dispatch.
    recovered : *GPA = xx a;
    print("recovered == gpa? {}\n", recovered == @gpa);

    p := a.alloc(64);
    print("alloc count after first alloc: {}\n", gpa.alloc_count);

    // Recover AFTER dispatch — still works.
    recovered2 : *GPA = xx a;
    print("recovered2 == gpa? {}\n", recovered2 == @gpa);

    a.dealloc(p);
    print("alloc count after dealloc: {}\n", gpa.alloc_count);
    0;
}
