source: tests/collections/sequence.cfa@ 62a7cc0

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast-unique-expr pthread-emulation qualifiedEnum stuck-waitfor-destruct
Last change on this file since 62a7cc0 was 62a7cc0, checked in by Peter A. Buhr <pabuhr@…>, 5 years ago

code review extended collection testing and add a few more tests

  • Property mode set to 100644
File size: 4.7 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) fredIter = { fred };
25 Fred & f;
26
27 sout | nlOff; // turn off auto newline
28
29 for ( ; fredIter >> 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( fredIter, fred ); fredIter >> 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 for ( over( fredIter, fred ); fredIter >> f; ) {
64 sout | f.i | ' ';
65 }
66 sout | nl;
67
68 remove( fred, *head );
69 remove( fred, tail );
70 delete( head );
71 delete( &dropTail( fred ) );
72
73 for ( over( fredIter, fred ); fredIter >> f; ) {
74 sout | f.i | ' ';
75 }
76 sout | nl;
77
78 for ( i; 5 ) {
79 delete( &dropTail( fred ) );
80 }
81 for ( over( fredIter, fred ); fredIter >> f; ) {
82 sout | f.i | ' ';
83 }
84 sout | nl;
85
86 for ( over( fredIter, fred ); fredIter >> f; ) {
87 delete( &remove( fred, f ) );
88 }
89 for ( over( fredIter, fred ); fredIter >> f; ) {
90 sout | f.i | ' ';
91 }
92 sout | "empty" | nl;
93
94 Fred & middle;
95 for ( i; 10 ) {
96 addHead( fred, *new( i ) ); // reverse oder
97 if ( i == 5 ) {
98 &middle = &head( fred );
99 }
100 }
101 for ( SeqIterRev(Fred) iter = { fred }; iter >> f; ) {
102 sout | f.i | ' ';
103 }
104 sout | nl;
105
106 head = new( -1 );
107 insertBef( fred, *head, head( fred ) );
108 insertAft( fred, *head, tail );
109
110 sout | head( fred ).i | succ( fred, head )->i | tail( fred ).i | nl;
111 for ( over( fredIter, fred ); fredIter >> f; ) {
112 sout | f.i | ' ';
113 }
114 sout | nl;
115
116 remove( fred, *head );
117 remove( fred, tail );
118 delete( head );
119 delete( &dropTail( fred ) );
120
121 for ( over( fredIter, fred ); fredIter >> f; ) {
122 sout | f.i | ' ';
123 }
124 sout | nl;
125
126 Sequence(Fred) fred2;
127
128 split( fred2, fred, middle );
129
130 for ( over( fredIter, fred ); fredIter >> f; ) {
131 sout | f.i | ' ';
132 }
133 sout | nl;
134
135 for ( over( fredIter, fred2 ); fredIter >> f; ) {
136 sout | f.i | ' ';
137 }
138 sout | nl;
139
140 transfer( fred, fred2 );
141
142 for ( over( fredIter, fred ); fredIter >> f; ) {
143 sout | f.i | ' ';
144 }
145 sout | nl;
146
147 for ( over( fredIter, fred ); fredIter >> f; ) {
148 delete( &f );
149 }
150
151 // Mary test
152
153 struct Mary {
154 inline Fred; // Plan 9 inheritance
155 int j;
156 };
157 void ?{}( Mary & mary ) { abort(); }
158 void ?{}( Mary & mary, int p ) with( mary ) {
159 ((Fred &)mary){ p };
160 j = p;
161 }
162 Mary *& Back( Mary * n ) {
163 return (Mary *)Back( (Fred *)n );
164 }
165 Mary *& Next( Mary * n ) {
166 return (Mary *)Next( (Fred *)n );
167 }
168
169 Sequence(Mary) mary;
170 SeqIter(Mary) maryIter = { mary };
171 Mary & m;
172
173 for ( ; maryIter >> m; ) { // empty list
174 sout | m.i | m.j | ' ';
175 }
176 sout | "empty" | nl;
177
178 for ( i; 10 ) {
179 add( mary, *new( 2 * i ) );
180 }
181
182 sout | head( mary ).i | tail( mary ).i | nl;
183
184 for ( SeqIter(Mary) iter = { mary }; iter >> m; ) {
185 sout | m.i | m.j | ' ';
186 }
187 sout | nl;
188
189 for ( i; 9 ) {
190 delete( &dropHead( mary ) );
191 }
192
193 for ( over( maryIter, mary ); maryIter >> m; ) {
194 sout | m.i | m.j | ' ';
195 }
196 sout | nl;
197
198 for ( i; 10 ) {
199 addTail( mary, *new( 2 * i + 1 ) );
200 }
201
202 Mary * head = new( -1 ), tail = { -1 };
203 addHead( mary, *head );
204 addTail( mary, tail );
205 sout | head( mary ).i | succ( mary, head )->i | tail( mary ).i | nl;
206 remove( mary, *head );
207 remove( mary, tail );
208 delete( (Mary *)head );
209 delete( &dropTail( mary ) );
210
211 for ( over( maryIter, mary ); maryIter >> m; ) {
212 sout | m.i | m.j | ' ';
213 }
214 sout | nl;
215
216 for ( over( maryIter, mary ); maryIter >> m; ) {
217 delete( &remove( mary, m ) );
218 }
219
220 Mary & middle;
221 for ( i; 10 ) {
222 add( mary, *new( i ) );
223 if ( i == 4 ) {
224 &middle = &tail( mary );
225 }
226 }
227 for ( SeqIter(Mary) iter = { mary }; iter >> m; ) {
228 sout | m.i | m.j | ' ';
229 }
230 sout | nl;
231
232 Sequence(Mary) mary2;
233
234 split( mary2, mary, middle );
235
236 for ( over( maryIter, mary ); maryIter >> m; ) {
237 sout | m.i | m.j | ' ';
238 }
239 sout | nl;
240 for ( over( maryIter, mary2 ); maryIter >> m; ) {
241 sout | m.i | m.j | ' ';
242 }
243 sout | nl;
244
245 transfer( mary, mary2 );
246
247 for ( over( maryIter, mary ); maryIter >> m; ) {
248 sout | m.i | m.j | ' ';
249 }
250 sout | nl;
251 for ( over( maryIter, mary ); maryIter >> m; ) {
252 delete( &m );
253 }
254}
Note: See TracBrowser for help on using the repository browser.