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);
}
|