1 | #include <collections/vector2.hfa>
|
---|
2 |
|
---|
3 | void raiiTests() {
|
---|
4 | printf("raiiTests=================\n");
|
---|
5 |
|
---|
6 | vector( float ) v = { 25 };
|
---|
7 |
|
---|
8 | push_last( v, 1 );
|
---|
9 | printf( "Having pushed, length is %zu\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 %zu\n", v`length );
|
---|
24 | #endif
|
---|
25 | }
|
---|
26 |
|
---|
27 | push_last( v, 2 );
|
---|
28 | printf( "Having pushed, length is %zu\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 %zu\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 | // forbid calling a function that returns permit by value
|
---|
99 | #ifdef TRY_RETURN_PERMIT_BYVAL_1
|
---|
100 | // can declare function that returns permit (wish to forbid)
|
---|
101 | vector_permit(float) g( vector( float ) & theVec ) {
|
---|
102 | return theVec[0]; // want to forbid
|
---|
103 | }
|
---|
104 |
|
---|
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 |
|
---|
119 | void 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, -100]; 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.1f; // v is [0.0, 98.6, -0.1, 0.2, -100]; 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 |
|
---|
151 | void 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; // wish for ?=?, but it's not working
|
---|
161 | printf("loop sees %f\n", toPrint);
|
---|
162 | }
|
---|
163 |
|
---|
164 | // missing: loop a permit
|
---|
165 | }
|
---|
166 |
|
---|
167 | int main() {
|
---|
168 | raiiTests();
|
---|
169 | stayValidTests();
|
---|
170 | loopTests();
|
---|
171 | }
|
---|