#include <stdio.h>
struct point;
struct point3d;
struct point_it_vtbl;
int point_calc(struct point*);
int point3d_calc(struct point*);
void point_init(struct point*, int, int);
void point3d_init(struct point3d*, int, int, int);
void point_print(struct point*);
void point3d_print(struct point*);
struct point_it_vtbl {
int (*calc)(struct point*);
void (*print)(struct point*);
}
point_vtbl = { &point_calc, &point_print },
point3d_vtbl = { &point3d_calc, &point3d_print }
;
struct point {
struct point_it_vtbl* vtbl;
int x, y;
};
struct point3d {
struct point base;
int z;
};
int point_calc(struct point* this) {
return this->x * this->y;
}
int point3d_calc(struct point* this) {
return point_calc(this) * (*(struct point3d*)this).z;
}
void point_print(struct point* this) {
printf("%i, %i", this
->x
, this
->y
); }
void point3d_print(struct point* this) {
point_print(this);
printf(", %i", (*(struct point3d
*)this
).
z); }
void test(struct point* p) {
p->vtbl->print(p);
}
int main(void) {
struct point3d t = { { &point3d_vtbl, 6, 3 } , 9 };
test((struct point*)&t);
printf(" %i", t.
base.
vtbl->calc
(&t.
base)); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiAKc3RydWN0IHBvaW50OwpzdHJ1Y3QgcG9pbnQzZDsKc3RydWN0IHBvaW50X2l0X3Z0Ymw7CiAKaW50IHBvaW50X2NhbGMoc3RydWN0IHBvaW50Kik7CmludCBwb2ludDNkX2NhbGMoc3RydWN0IHBvaW50Kik7CnZvaWQgcG9pbnRfaW5pdChzdHJ1Y3QgcG9pbnQqLCBpbnQsIGludCk7CnZvaWQgcG9pbnQzZF9pbml0KHN0cnVjdCBwb2ludDNkKiwgaW50LCBpbnQsIGludCk7CnZvaWQgcG9pbnRfcHJpbnQoc3RydWN0IHBvaW50Kik7CnZvaWQgcG9pbnQzZF9wcmludChzdHJ1Y3QgcG9pbnQqKTsKIAogCnN0cnVjdCBwb2ludF9pdF92dGJsIHsKICAgIGludCAoKmNhbGMpKHN0cnVjdCBwb2ludCopOwogICAgdm9pZCAoKnByaW50KShzdHJ1Y3QgcG9pbnQqKTsKfQoJcG9pbnRfdnRibCA9IHsgJnBvaW50X2NhbGMsICZwb2ludF9wcmludCB9LAoJcG9pbnQzZF92dGJsID0geyAmcG9pbnQzZF9jYWxjLCAmcG9pbnQzZF9wcmludCB9CjsKIApzdHJ1Y3QgcG9pbnQgewogICAgc3RydWN0IHBvaW50X2l0X3Z0YmwqIHZ0Ymw7CiAgICBpbnQgeCwgeTsKfTsKIApzdHJ1Y3QgcG9pbnQzZCB7CiAgICBzdHJ1Y3QgcG9pbnQgYmFzZTsKICAgIGludCB6Owp9OwogCiAKaW50IHBvaW50X2NhbGMoc3RydWN0IHBvaW50KiB0aGlzKSB7CiAgICByZXR1cm4gdGhpcy0+eCAqIHRoaXMtPnk7Cn0KIAppbnQgcG9pbnQzZF9jYWxjKHN0cnVjdCBwb2ludCogdGhpcykgewogICAgcmV0dXJuIHBvaW50X2NhbGModGhpcykgKiAoKihzdHJ1Y3QgcG9pbnQzZCopdGhpcykuejsKfQogCnZvaWQgcG9pbnRfcHJpbnQoc3RydWN0IHBvaW50KiB0aGlzKSB7CiAgICBwcmludGYoIiVpLCAlaSIsIHRoaXMtPngsIHRoaXMtPnkpOwp9CiAKdm9pZCBwb2ludDNkX3ByaW50KHN0cnVjdCBwb2ludCogdGhpcykgewogICAgcG9pbnRfcHJpbnQodGhpcyk7CiAgICBwcmludGYoIiwgJWkiLCAoKihzdHJ1Y3QgcG9pbnQzZCopdGhpcykueik7Cn0KIAp2b2lkIHRlc3Qoc3RydWN0IHBvaW50KiBwKSB7CiAgICBwLT52dGJsLT5wcmludChwKTsKfQoKaW50IG1haW4odm9pZCkgewogICAgc3RydWN0IHBvaW50M2QgdCA9IHsgeyAmcG9pbnQzZF92dGJsLCA2LCAzIH0gLCA5IH07CiAgICB0ZXN0KChzdHJ1Y3QgcG9pbnQqKSZ0KTsKICAgIHByaW50ZigiICVpIiwgdC5iYXNlLnZ0YmwtPmNhbGMoJnQuYmFzZSkpOwogICAgcmV0dXJuIDA7Cn0=