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
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>

#include "vector.h"

struct Vector
VectorConstruct(size_t dim)
{
    struct Vector vec = {
        malloc(dim * sizeof(vec.data)),
        dim,
    };
    if (!vec.data) {
        fprintf(stderr, "VectorConstruct(%zu): out of memory\n", dim);
        exit(1);
    }
    return vec;
}

void
VectorDestruct(struct Vector *vec)
{
    free(vec->data);
#   ifndef NDEBUG
    *(double *) &vec->data = 0;
#   endif
}

double *
VectorElementPtr(struct Vector *vec, size_t index)
{
    assert(index < vec->dim);
    return &vec->data[index];
}

double
VectorElement(const struct Vector *vec, size_t index)
{
    assert(index < vec->dim);
    return vec->data[index];
}