aboutsummaryrefslogtreecommitdiff
path: root/std/vector.cup
blob: eb7615550af020e4d402fa3d9cb5eb2952174120 (plain) (blame)
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
import "std/common.cup"

struct Vector {
    size: int;
    capacity: int;
    data: void**;
};

fn vector_new_sized(capacity: int): Vector* {
    let t: Vector* = malloc(sizeof(Vector));
    t.size = 0;
    t.capacity = capacity;
    t.data = malloc(capacity * sizeof(void*));
    return t;
}

fn vector_new(): Vector* {
    const initial_default_capacity = 4;
    return vector_new_sized(initial_default_capacity);
}

fn vector_push(vec: Vector*, item: void*) {
    if (vec.size == vec.capacity) {
        let new_capacity = vec.capacity * 2;
        let new_data = malloc(new_capacity * sizeof(void*));
        memcpy(new_data, vec.data, vec.capacity * sizeof(void*));
        vec.data = new_data;
        vec.capacity = new_capacity;
    }
    vec.data[vec.size] = item;
    vec.size = vec.size + 1;
}

fn vector_pop(vec: Vector*): void* {
    if (vec.size == 0)
        die("Vector is empty, nothing to pop.");

    vec.size = vec.size - 1;
    return vec.data[vec.size];
}