aboutsummaryrefslogtreecommitdiff
path: root/v1/square.c
blob: cbf451a3ebe30b10e24cf23e0db34216fadcf1be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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);
}