source: tests/collections/sequence.cfa @ b6460bf

ADTarm-ehast-experimentalenumforall-pointer-decayjacob/cs343-translationnew-ast-unique-exprpthread-emulationqualifiedEnum
Last change on this file since b6460bf was 62a7cc0, checked in by Peter A. Buhr <pabuhr@…>, 4 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.