source: tests/collections/vector-demo.cfa@ 124400b

ast-experimental
Last change on this file since 124400b was 44856ed, checked in by Michael Brooks <mlbrooks@…>, 4 years ago

Baseline "new" vector, with iterators.

Implementation has not had thorough correctness testing, e.g. checking wraparound
behaviours, and at least one such case is commented as unimplemented.

Implementation has not been optimized at the instruction path level, though a basic
iteration performance check has it within 5% of c++ std::vector.

  • Property mode set to 100644
File size: 4.4 KB
Line 
1#include <containers/vector2.hfa>
2
3void raiiTests() {
4 printf("raiiTests=================\n");
5
6 vector( float ) v = { 25 };
7
8 push_last( v, 1 );
9 printf( "Having pushed, length is %ld\n", v`length );
10
11 float y = v[0]`val;
12 printf( "by transit, got pos0 = %f\n", y );
13
14 {
15 vector_exit(float) it = v[0];
16
17 float z = it`val;
18 printf( "by exit, got pos0 = %f\n", z );
19
20 // forbid modification while locked
21 #ifdef TRY_MOD_WHILE_LOCKED_1
22 push_last( v, 1 ); // runtime assertion failure
23 printf( "Having pushed, length is %ld\n", v`length );
24 #endif
25 }
26
27 push_last( v, 2 );
28 printf( "Having pushed, length is %ld\n", v`length );
29
30 // deletion scope for some exits
31 // point is the function decls and calls, though
32 {
33 void helperE(vector_exit(float) it) {
34 float q = it`val;
35 printf( "helperE sees %f\n", q );
36 }
37
38 vector_exit(float) it2 = v[1];
39 helperE(it2);
40
41 // can't call with implied exit (wish I could, low priority)
42 #ifdef TRY_IMPLIED_EXIT_1
43 helperE( v[1] ); // Invalid application of existing declaration(s)
44 #endif
45
46 //------
47
48 vector_exit(float) producerE( vector( float ) & theVec ) {
49 return theVec[0];
50 }
51
52 vector_exit(float) it3 = producerE( v );
53 float z = it3`val;
54 printf( "producerE gave %f\n", z );
55
56 float zzzz = producerE( v )`val;
57 printf( "producerE again gave %f\n", zzzz );
58
59 //------
60
61 void helperT(vector_transit(float) it) {
62 float q = it`val;
63 printf( "helperT sees %f\n", q );
64 }
65
66 helperT( v[1] );
67
68 //------
69
70 vector_transit(float) producerT( vector( float ) & theVec ) {
71 return theVec[0];
72 }
73
74 float zz = producerT( v )`val;
75 printf( "producerT gave %f\n", zz );
76 }
77
78 //=======
79
80 {
81 vector_permit(float) it = v[0];
82
83 float z = it`val;
84 printf( "by permit, got pos0 = %f\n", z );
85
86 // allow modification while permits exist
87 push_last( v, 1 );
88 printf( "Having pushed, length is %ld\n", v`length );
89
90 // forbid passing permit by value
91 #ifdef TRY_PASS_PERMIT_BYVAL_1
92 void f( vector_permit(float) xx ) {
93 printf("can't get here\n");
94 }
95 f( it ); // Unique best alternative includes deleted identifier
96 #endif
97
98 // can declare function that returns permit (wish to forbid)
99 vector_permit(float) g( vector( float ) & theVec ) {
100 return theVec[0]; // want to forbid
101 }
102
103 // forbid calling a function that returns permit by value
104 #ifdef TRY_RETURN_PERMIT_BYVAL_1
105 vector_permit(float) ofG = g( v ); // Unique best alternative includes deleted identifier
106 #endif
107
108 // allow declaration of permit, populating from exit
109 vector_exit(float) h( vector( float ) & theVec ) {
110 return theVec[0];
111 }
112
113 vector_permit(float) ofH = h( v );
114 float zh = ofH`val;
115 printf( "into permit from call, got ofH = %f\n", zh );
116 }
117}
118
119void stayValidTests() {
120 printf("stayValidTests============\n");
121 vector( float ) v = { 4 };
122 push_last(v, 0.0f);
123 push_last(v, 0.1f);
124 push_last(v, 0.2f);
125 // v is [0.0, 0.1, 0.2]
126
127 vector_permit(float) iter = v[1]; // iter at 0.1
128
129 float val1 = iter`val;
130 printf("before %f\n", val1);
131
132 insert_before( v, 1, 98.6f ); // v is [0.0, 98.6, 0.1, 0.2]; iter at 0.1
133
134 float val2 = iter`val;
135 printf("after, logical: %f\n", val2);
136
137 // we had filled it to the brim
138 assert( v`capacity == 4 && v`length == 4 );
139
140 push_last(v, -100); // v is [0.0, 98.6, 0.1, 0.2, 0.3]; iter at 0.1, but RTP it's not looking at the old memory's 0.1
141
142 // that made it bigger
143 assert( v`capacity > 5 && v`length == 5 );
144
145 v[2] = -0.1; // v is [0.0, 98.6, -0.1, 0.2, 0.3]; iter at -0.1, where only the new memory had that change
146
147 float val3 = iter`val;
148 printf("after, physical: %f\n", val3);
149}
150
151void loopTests() {
152 printf("loopTests=================\n");
153 vector(float) v = { 4 };
154 push_last(v, 0.0f);
155 push_last(v, 0.1f);
156 push_last(v, 0.2f);
157 float toPrint;
158
159 while( vector_exit(float) it = v`origin; it`moveNext ) {
160 toPrint *= it;
161 printf("loop sees %f\n", toPrint);
162 }
163}
164
165int main() {
166 raiiTests();
167 stayValidTests();
168 loopTests();
169}
Note: See TracBrowser for help on using the repository browser.