diff options
author | Sopár Adrián <dev.adrian.sopar@protonmail.com> | 2023-01-27 00:05:24 +0100 |
---|---|---|
committer | Sopár Adrián <dev.adrian.sopar@protonmail.com> | 2023-01-27 00:05:24 +0100 |
commit | 2c5a5f7679a5f450e483fdedc99c80622f260a4d (patch) | |
tree | c96f4f9020275e8853c92f008fa9f041e0529a57 /v1 |
Diffstat (limited to 'v1')
-rw-r--r-- | v1/main.c | 22 | ||||
-rw-r--r-- | v1/shape.c | 32 | ||||
-rw-r--r-- | v1/shape.h | 19 | ||||
-rw-r--r-- | v1/square.c | 48 | ||||
-rw-r--r-- | v1/square.h | 16 |
5 files changed, 137 insertions, 0 deletions
diff --git a/v1/main.c b/v1/main.c new file mode 100644 index 0000000..d149c87 --- /dev/null +++ b/v1/main.c @@ -0,0 +1,22 @@ +#include <stdio.h> +#include "square.h" + +void print_square(struct square *square) +{ + double area = square_area(square); + printf("square_area=%f\n", area); +} + +void print_shape(struct shape *shape) +{ + double area = shape_area(shape); + printf("shape_area=%f\n", area); +} + +int main(int argc, char **argv) +{ + struct square *square = square_create(5); + print_square(square); + print_shape(square_as_shape(square)); + shape_destroy(square_as_shape(square)); +} diff --git a/v1/shape.c b/v1/shape.c new file mode 100644 index 0000000..eb5e399 --- /dev/null +++ b/v1/shape.c @@ -0,0 +1,32 @@ +#include <stdlib.h> +#include "shape.h" + +struct shape +{ + void *obj; + shape_area_t area; + shape_destroy_t destroy; +}; + +double shape_area(struct shape *shape) +{ + return shape->area(shape->obj); +} + +void shape_destroy(struct shape *shape) +{ + shape->destroy(shape->obj); + free(shape); +} + +struct shape *shape_create( + void *obj, + shape_area_t area, + shape_destroy_t destroy) +{ + struct shape *shape = malloc(sizeof(shape)); + shape->obj = obj; + shape->area = area; + shape->destroy = destroy; + return shape; +}
\ No newline at end of file diff --git a/v1/shape.h b/v1/shape.h new file mode 100644 index 0000000..adc6ec8 --- /dev/null +++ b/v1/shape.h @@ -0,0 +1,19 @@ +#ifndef POC__SHAPE_H +#define POC__SHAPE_H + +struct shape; + +/* Calculates the area of the shape and returns the value. */ +double shape_area(struct shape *shape); +typedef double (*shape_area_t)(struct shape *); + +/* Deallocates the object. */ +void shape_destroy(struct shape *shape); +typedef void (*shape_destroy_t)(struct shape *); + +struct shape *shape_create( + void *obj, + shape_area_t area, + shape_destroy_t destroy); + +#endif diff --git a/v1/square.c b/v1/square.c new file mode 100644 index 0000000..cbf451a --- /dev/null +++ b/v1/square.c @@ -0,0 +1,48 @@ +#include <stdlib.h> +#include "square.h" + +struct square +{ + struct shape *shape; + double width; +}; + +/* Shape interface */ + +double shape_area_impl(struct shape *shape) +{ + struct square *square = (struct square *)shape; + return square_area(square); +} + +void shape_destroy_impl(struct shape *shape) +{ + struct square *square = (struct square *)shape; + square_destroy(square); +} + +struct shape *square_as_shape(struct square *square) +{ + return square->shape; +} + +/* End of shape interface */ + +struct square *square_create(double width) +{ + struct square *square = malloc(sizeof(struct square)); + square->width = width; + + square->shape = shape_create(square, 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(square); +}
\ No newline at end of file diff --git a/v1/square.h b/v1/square.h new file mode 100644 index 0000000..177c9c7 --- /dev/null +++ b/v1/square.h @@ -0,0 +1,16 @@ +#ifndef POC__SQUARE_H +#define POC__SQUARE_H + +#include "shape.h" + +struct square; + +struct square *square_create(double width); + +double square_area(struct square *square); + +void square_destroy(struct square *square); + +struct shape *square_as_shape(struct square *square); + +#endif |