source: tests/collections/sequence.cfa@ 1a40870

Last change on this file since 1a40870 was 161b98e, checked in by Andrew Beach <ajbeach@…>, 9 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
RevLine 
[de2f969]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;
[657c36f]24 SeqIter(Fred) iter = { fred };
[de2f969]25 Fred & f;
26
27 sout | nlOff; // turn off auto newline
28
[657c36f]29 for ( ; iter | f; ) { // empty list
[de2f969]30 sout | f.i | ' ';
31 }
32 sout | "empty" | nl;
[bada452]33
[de2f969]34 for ( i; 10 ) {
35 add( fred, *new( 2 * i ) );
36 }
37
[62a7cc0]38 sout | head( fred ).i | tail( fred ).i | nl;
39
[657c36f]40 for ( SeqIter(Fred) iter = { fred }; iter | f; ) {
[de2f969]41 sout | f.i | ' ';
42 }
43 sout | nl;
44
45 for ( i; 9 ) {
46 delete( &dropHead( fred ) );
47 }
48
[657c36f]49 for ( over( iter, fred ); iter | f; ) {
[de2f969]50 sout | f.i | ' ';
51 }
52 sout | nl;
[bada452]53
[de2f969]54 for ( i; 10 ) {
55 addTail( fred, *new( 2 * i + 1 ) );
56 }
[62a7cc0]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;
[657c36f]63
64 for ( over( iter, fred ); iter | f; ) {
[de2f969]65 sout | f.i | ' ';
66 }
67 sout | nl;
68
[62a7cc0]69 remove( fred, *head );
70 remove( fred, tail );
71 delete( head );
72 delete( &dropTail( fred ) );
73
[657c36f]74 for ( over( iter, fred ); iter | f; ) {
[62a7cc0]75 sout | f.i | ' ';
76 }
77 sout | nl;
78
79 for ( i; 5 ) {
[de2f969]80 delete( &dropTail( fred ) );
81 }
[657c36f]82 for ( over( iter, fred ); iter | f; ) {
[de2f969]83 sout | f.i | ' ';
84 }
85 sout | nl;
86
[657c36f]87 for ( over( iter, fred ); iter | f; ) {
[62a7cc0]88 delete( &remove( fred, f ) );
[de2f969]89 }
[657c36f]90 for ( over( iter, fred ); iter | f; ) {
[62a7cc0]91 sout | f.i | ' ';
92 }
93 sout | "empty" | nl;
[de2f969]94
[161b98e]95 Fred & middle = f;
[de2f969]96 for ( i; 10 ) {
[657c36f]97 addHead( fred, *new( i ) ); // reverse order
[62a7cc0]98 if ( i == 5 ) {
99 &middle = &head( fred );
[de2f969]100 }
101 }
[657c36f]102 for ( SeqIterRev(Fred) riter = { fred }; riter | f; ) {
[de2f969]103 sout | f.i | ' ';
104 }
105 sout | nl;
106
[62a7cc0]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;
[657c36f]112 for ( over( iter, fred ); iter | f; ) {
[62a7cc0]113 sout | f.i | ' ';
114 }
115 sout | nl;
[de2f969]116
[62a7cc0]117 remove( fred, *head );
118 remove( fred, tail );
119 delete( head );
120 delete( &dropTail( fred ) );
[de2f969]121
[657c36f]122 for ( over( iter, fred ); iter | f; ) {
[de2f969]123 sout | f.i | ' ';
124 }
125 sout | nl;
126
127 Sequence(Fred) fred2;
128
[62a7cc0]129 split( fred2, fred, middle );
[de2f969]130
[657c36f]131 for ( over( iter, fred ); iter | f; ) {
[de2f969]132 sout | f.i | ' ';
133 }
134 sout | nl;
135
[657c36f]136 for ( over( iter, fred2 ); iter | f; ) {
[de2f969]137 sout | f.i | ' ';
138 }
139 sout | nl;
140
[62a7cc0]141 transfer( fred, fred2 );
[de2f969]142
[657c36f]143 for ( over( iter, fred ); iter | f; ) {
[de2f969]144 sout | f.i | ' ';
145 }
146 sout | nl;
147
[657c36f]148 for ( over( iter, fred ); iter | f; ) {
[de2f969]149 delete( &f );
150 }
151
152 // Mary test
153
154 struct Mary {
155 inline Fred; // Plan 9 inheritance
156 int j;
157 };
[bada452]158 __attribute__((unused))
[de2f969]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;
[657c36f]172 SeqIter(Mary) iter = { mary };
[de2f969]173 Mary & m;
174
[657c36f]175 for ( ; iter | m; ) { // empty list
[de2f969]176 sout | m.i | m.j | ' ';
177 }
178 sout | "empty" | nl;
[bada452]179
[de2f969]180 for ( i; 10 ) {
181 add( mary, *new( 2 * i ) );
182 }
183
[62a7cc0]184 sout | head( mary ).i | tail( mary ).i | nl;
185
[657c36f]186 for ( SeqIter(Mary) iter = { mary }; iter | m; ) {
[de2f969]187 sout | m.i | m.j | ' ';
188 }
189 sout | nl;
[bada452]190
[de2f969]191 for ( i; 9 ) {
192 delete( &dropHead( mary ) );
193 }
194
[657c36f]195 for ( over( iter, mary ); iter | m; ) {
[de2f969]196 sout | m.i | m.j | ' ';
197 }
198 sout | nl;
[bada452]199
[de2f969]200 for ( i; 10 ) {
201 addTail( mary, *new( 2 * i + 1 ) );
202 }
[62a7cc0]203
[657c36f]204 Mary * head = new( -1 ), tail = { -2 };
[62a7cc0]205 addHead( mary, *head );
206 addTail( mary, tail );
[657c36f]207
[62a7cc0]208 sout | head( mary ).i | succ( mary, head )->i | tail( mary ).i | nl;
[657c36f]209
210 for ( over( iter, mary ); iter | m; ) {
211 sout | m.i | m.j | ' ';
212 }
213 sout | nl;
214
[62a7cc0]215 remove( mary, *head );
216 remove( mary, tail );
217 delete( (Mary *)head );
218 delete( &dropTail( mary ) );
219
[657c36f]220 for ( over( iter, mary ); iter | m; ) {
[de2f969]221 sout | m.i | m.j | ' ';
222 }
223 sout | nl;
224
[657c36f]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; ) {
[62a7cc0]234 delete( &remove( mary, m ) );
235 }
[657c36f]236 for ( over( iter, mary ); iter | m; ) {
237 sout | m.i | m.j | ' ';
238 }
239 sout | "empty" | nl;
[62a7cc0]240
[161b98e]241 Mary & middle = m;
[62a7cc0]242 for ( i; 10 ) {
243 add( mary, *new( i ) );
244 if ( i == 4 ) {
245 &middle = &tail( mary );
246 }
247 }
[657c36f]248 for ( SeqIter(Mary) iter = { mary }; iter | m; ) {
[de2f969]249 sout | m.i | m.j | ' ';
250 }
251 sout | nl;
252
[62a7cc0]253 Sequence(Mary) mary2;
[de2f969]254
[62a7cc0]255 split( mary2, mary, middle );
256
[657c36f]257 for ( over( iter, mary ); iter | m; ) {
[de2f969]258 sout | m.i | m.j | ' ';
259 }
[62a7cc0]260 sout | nl;
[657c36f]261 for ( over( iter, mary2 ); iter | m; ) {
[62a7cc0]262 sout | m.i | m.j | ' ';
263 }
264 sout | nl;
265
266 transfer( mary, mary2 );
[de2f969]267
[657c36f]268 for ( over( iter, mary ); iter | m; ) {
[de2f969]269 sout | m.i | m.j | ' ';
270 }
271 sout | nl;
[657c36f]272
273 for ( over( iter, mary ); iter | m; ) {
[de2f969]274 delete( &m );
275 }
276}
Note: See TracBrowser for help on using the repository browser.