aboutsummaryrefslogtreecommitdiff
path: root/examples/vec.ct
blob: f44fec0ca9b5503324275744d805cd149f862dfa (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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
typedef vectorable {
	std;
	/* this would be needed for comparisons like find() or something */
	comparable;
}

typedef vec (t vectorable) {
	void std_vector;
	len usize;
	buf *t;
}

pub define vec(t) { struct (vector[t]) }

pub init(mut v *vector)
{
	v.len = 0;
	v.buf = null;
}

pub length(v *vec) usize { return v.len; }

pub index(v *vec, i usize) *#(v.buf)
{
	assert(i < v.len, "index %zu out of bounds\n", i);
	return &v.buf[i];
}

pub index(v *vec, i isize) *#v.buf
{
	if i < 0 {
		assert(-i < v.len, "reverse index %zi out of bounds\n", i);
		return &v.buf[v.len + i];
	}

	assert(i < v.len, "index %zi out of bounds\n", i);
	return &v.buf[i];
}

pub prepend(mut *vec, e *#v.buf) { insert(v, e, 0uz); }
pub append(mut v *vec, e *#v.buf) { insert(v, e, v.len) }

pub preplace(mut v *vec, e *#v.buf) { place(v, e, 0uz); }
pub applace(mut v *vec, e *#v.buf) { place(v, e, v.len - 1); }

pub place(mut v *vec, e *#v.buf, i usize)
{
}

pub insert(mut v *vec, e *#v.buf, i usize)
{
}

pub deinit(mut v *vec)
{
	for i usize : v {
		deinit(v[i]);
		v[i] = null;
	}

	dealloc(v.buf);
}