source: tests/collections/queue.cfa@ 4be0117

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