source: tests/collections/sequence.cfa@ b28ce93

Last change on this file since b28ce93 was 161b98e, checked in by Andrew Beach <ajbeach@…>, 8 months ago

Cleaned up some errors that did not show up in my local test but caused the nightly build to fail.

  • Property mode set to 100644
File size: 4.9 KB
Line 
1#include <fstream.hfa>
2#include <stdlib.hfa> // new, delete
3#include <bits/sequence.hfa>
4
5int main() {
6 // Fred test
7
8 struct Fred {
9 inline Seqable; // Plan 9 inheritance
10 int i;
11 };
12 void ?{}( Fred & fred ) { abort(); }
13 void ?{}( Fred & fred, int p ) with( fred ) {
14 i = p;
15 }
16 Fred *& Back( Fred * n ) {
17 return (Fred *)Back( (Seqable *)n );
18 }
19 Fred *& Next( Fred * n ) {
20 return (Fred *)Next( (Colable *)n );
21 }
22
23 Sequence(Fred) fred;
24 SeqIter(Fred) iter = { fred };
25 Fred & f;
26
27 sout | nlOff; // turn off auto newline
28
29 for ( ; iter | f; ) { // empty list
30 sout | f.i | ' ';
31 }
32 sout | "empty" | nl;
33
34 for ( i; 10 ) {
35 add( fred, *new( 2 * i ) );
36 }
37
38 sout | head( fred ).i | tail( fred ).i | nl;
39
40 for ( SeqIter(Fred) iter = { fred }; iter | f; ) {
41 sout | f.i | ' ';
42 }
43 sout | nl;
44
45 for ( i; 9 ) {
46 delete( &dropHead( fred ) );
47 }
48
49 for ( over( iter, fred ); iter | f; ) {
50 sout | f.i | ' ';
51 }
52 sout | nl;
53
54 for ( i; 10 ) {
55 addTail( fred, *new( 2 * i + 1 ) );
56 }
57
58 Fred * head = new( -1 ), tail = { -2 };
59 addHead( fred, *head );
60 addTail( fred, tail );
61
62 sout | head( fred ).i | succ( fred, head )->i | tail( fred ).i | nl;
63
64 for ( over( iter, fred ); iter | f; ) {
65 sout | f.i | ' ';
66 }
67 sout | nl;
68
69 remove( fred, *head );
70 remove( fred, tail );
71 delete( head );
72 delete( &dropTail( fred ) );
73
74 for ( over( iter, fred ); iter | f; ) {
75 sout | f.i | ' ';
76 }
77 sout | nl;
78
79 for ( i; 5 ) {
80 delete( &dropTail( fred ) );
81 }
82 for ( over( iter, fred ); iter | f; ) {
83 sout | f.i | ' ';
84 }
85 sout | nl;
86
87 for ( over( iter, fred ); iter | f; ) {
88 delete( &remove( fred, f ) );
89 }
90 for ( over( iter, fred ); iter | f; ) {
91 sout | f.i | ' ';
92 }
93 sout | "empty" | nl;
94
95 Fred & middle = f;
96 for ( i; 10 ) {
97 addHead( fred, *new( i ) ); // reverse order
98 if ( i == 5 ) {
99 &middle = &head( fred );
100 }
101 }
102 for ( SeqIterRev(Fred) riter = { fred }; riter | f; ) {
103 sout | f.i | ' ';
104 }
105 sout | nl;
106
107 head = new( -1 );
108 insertBef( fred, *head, head( fred ) );
109 insertAft( fred, *head, tail );
110
111 sout | head( fred ).i | succ( fred, head )->i | tail( fred ).i | nl;
112 for ( over( iter, fred ); iter | f; ) {
113 sout | f.i | ' ';
114 }
115 sout | nl;
116
117 remove( fred, *head );
118 remove( fred, tail );
119 delete( head );
120 delete( &dropTail( fred ) );
121
122 for ( over( iter, fred ); iter | f; ) {
123 sout | f.i | ' ';
124 }
125 sout | nl;
126
127 Sequence(Fred) fred2;
128
129 split( fred2, fred, middle );
130
131 for ( over( iter, fred ); iter | f; ) {
132 sout | f.i | ' ';
133 }
134 sout | nl;
135
136 for ( over( iter, fred2 ); iter | f; ) {
137 sout | f.i | ' ';
138 }
139 sout | nl;
140
141 transfer( fred, fred2 );
142
143 for ( over( iter, fred ); iter | f; ) {
144 sout | f.i | ' ';
145 }
146 sout | nl;
147
148 for ( over( iter, fred ); iter | f; ) {
149 delete( &f );
150 }
151
152 // Mary test
153
154 struct Mary {
155 inline Fred; // Plan 9 inheritance
156 int j;
157 };
158 __attribute__((unused))
159 void ?{}( Mary & mary ) { abort(); }
160 void ?{}( Mary & mary, int p ) with( mary ) {
161 ((Fred &)mary){ p };
162 j = p;
163 }
164 Mary *& Back( Mary * n ) {
165 return (Mary *)Back( (Fred *)n );
166 }
167 Mary *& Next( Mary * n ) {
168 return (Mary *)Next( (Fred *)n );
169 }
170
171 Sequence(Mary) mary;
172 SeqIter(Mary) iter = { mary };
173 Mary & m;
174
175 for ( ; iter | m; ) { // empty list
176 sout | m.i | m.j | ' ';
177 }
178 sout | "empty" | nl;
179
180 for ( i; 10 ) {
181 add( mary, *new( 2 * i ) );
182 }
183
184 sout | head( mary ).i | tail( mary ).i | nl;
185
186 for ( SeqIter(Mary) iter = { mary }; iter | m; ) {
187 sout | m.i | m.j | ' ';
188 }
189 sout | nl;
190
191 for ( i; 9 ) {
192 delete( &dropHead( mary ) );
193 }
194
195 for ( over( iter, mary ); iter | m; ) {
196 sout | m.i | m.j | ' ';
197 }
198 sout | nl;
199
200 for ( i; 10 ) {
201 addTail( mary, *new( 2 * i + 1 ) );
202 }
203
204 Mary * head = new( -1 ), tail = { -2 };
205 addHead( mary, *head );
206 addTail( mary, tail );
207
208 sout | head( mary ).i | succ( mary, head )->i | tail( mary ).i | nl;
209
210 for ( over( iter, mary ); iter | m; ) {
211 sout | m.i | m.j | ' ';
212 }
213 sout | nl;
214
215 remove( mary, *head );
216 remove( mary, tail );
217 delete( (Mary *)head );
218 delete( &dropTail( mary ) );
219
220 for ( over( iter, mary ); iter | m; ) {
221 sout | m.i | m.j | ' ';
222 }
223 sout | nl;
224
225 for ( i; 5 ) {
226 delete( &dropTail( mary ) );
227 }
228 for ( over( iter, mary ); iter | m; ) {
229 sout | m.i | m.j | ' ';
230 }
231 sout | nl;
232
233 for ( over( iter, mary ); iter | m; ) {
234 delete( &remove( mary, m ) );
235 }
236 for ( over( iter, mary ); iter | m; ) {
237 sout | m.i | m.j | ' ';
238 }
239 sout | "empty" | nl;
240
241 Mary & middle = m;
242 for ( i; 10 ) {
243 add( mary, *new( i ) );
244 if ( i == 4 ) {
245 &middle = &tail( mary );
246 }
247 }
248 for ( SeqIter(Mary) iter = { mary }; iter | m; ) {
249 sout | m.i | m.j | ' ';
250 }
251 sout | nl;
252
253 Sequence(Mary) mary2;
254
255 split( mary2, mary, middle );
256
257 for ( over( iter, mary ); iter | m; ) {
258 sout | m.i | m.j | ' ';
259 }
260 sout | nl;
261 for ( over( iter, mary2 ); iter | m; ) {
262 sout | m.i | m.j | ' ';
263 }
264 sout | nl;
265
266 transfer( mary, mary2 );
267
268 for ( over( iter, mary ); iter | m; ) {
269 sout | m.i | m.j | ' ';
270 }
271 sout | nl;
272
273 for ( over( iter, mary ); iter | m; ) {
274 delete( &m );
275 }
276}
Note: See TracBrowser for help on using the repository browser.