-
Notifications
You must be signed in to change notification settings - Fork 0
/
test-vector.chm
98 lines (80 loc) · 1.76 KB
/
test-vector.chm
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// CHM test source code
#include "stl.h"
/*
This test implements a vector and a function for allocation
of arrays (both are good candidates for an inclusion in the STL library).
It showcases that the compiler even determines types of
literals (integral literals being implicitly 'int', but can be 'char'
as well).
After successfull compilation without any errors,
the program should print integers from 0 to 5 on separate lines.
*/
// a generic new for arrays (a naive implementation)
<a>
a *new_many(int count)
{
return (a *)malloc(sizeof(a) * count);
}
<T>
struct vector {
T *_content;
int _length;
int _capacity;
};
// Makes a vector of one element
<T : V ~ struct vector : <T> >
V vectorise(T first)
{
V x;
x._content = new();
x._length = x._capacity = 1;
if (x._content != nullptr()) {
x._content[0] = first;
}
return x;
}
// Adds an element to the back of the vector
// Reallocates the vector if needed (doubles the size)
<T : V ~ struct vector : <T> >
void vector_push(V *v, T a)
{
if (v->_length == v->_capacity) {
v->_capacity *= 2;
T *new_content = new_many(v->_capacity);
for (int i = 0; i < v->_length; i++) {
new_content[i] = v->_content[i];
}
new_content[v->_length++] = a;
delete(v->_content);
v->_content = new_content;
} else {
v->_content[v->_length++] = a;
}
}
<T : V ~ struct vector : <T> >
void free_vector(V vector)
{
delete(vector._content);
vector._content = nullptr();
vector._length = vector._capacity = 0;
}
<a>
void f()
{
char nl = '\n';
a x = vectorise(48);
vector_push(&x, 49);
vector_push(&x, 50);
vector_push(&x, 51);
vector_push(&x, 52);
vector_push(&x, '5');
for (int i = 0; i < x._length; i++) {
print(&x._content[i]);
print(&nl);
}
free_vector(x);
}
int main() {
f();
return 0;
}