#include #include #include "square.h" struct square { double width; }; /* Shape interface */ double shape_area_impl(struct shape *shape) { struct square *square = ((void *)shape) + shape_sizeof(); return square_area(square); } void shape_destroy_impl(struct shape *shape) { struct square *square = ((void *)shape) + shape_sizeof(); square_destroy(square); } struct shape *square_as_shape(struct square *square) { return ((void *)square) - shape_sizeof(); } /* End of shape interface */ struct square *square_create(double width) { struct shape *shape = malloc(shape_sizeof() + sizeof(struct square)); struct square *square = ((void *)shape) + shape_sizeof(); square->width = width; shape_init(shape, shape_area_impl, shape_destroy_impl); return square; } double square_area(struct square *square) { return square->width * square->width; } void square_destroy(struct square *square) { free(((void *)square) - shape_sizeof()); }