source: tests/collections/sequence.cfa @ 4c19647

ADTarm-ehast-experimentalenumforall-pointer-decayjacob/cs343-translationnew-ast-unique-exprpthread-emulationqualifiedEnum
Last change on this file since 4c19647 was de2f969, checked in by caparsons <caparson@…>, 3 years ago

added more tests to cover all routines in collections and updated corresponding expect files

  • Property mode set to 100644
File size: 3.6 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
17        Fred *& Back( Fred * n ) {
18                return (Fred *)Back( (Seqable *)n );
19        }
20
21        Fred *& Next( Fred * n ) {
22                return (Fred *)Next( (Colable *)n );
23        }
24
25        Sequence(Fred) fred;
26        SeqIter(Fred) fredIter = { fred };
27        Fred & f;
28
29        sout | nlOff;                                                                           // turn off auto newline
30
31        for ( ; fredIter >> f; ) {                                                      // empty list
32                sout | f.i | ' ';
33        }
34        sout | "empty" | nl;
35       
36        for ( i; 10 ) {
37                add( fred, *new( 2 * i ) );
38        }
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        for ( over( fredIter, fred ); fredIter >> f; ) {
58                sout | f.i | ' ';
59        }
60        sout | nl;
61
62        for ( i; 9 ) {
63                delete( &dropTail( fred ) );
64        }
65        for ( over( fredIter, fred ); fredIter >> f; ) {
66                sout | f.i | ' ';
67        }
68        sout | nl;
69
70        for ( over( fredIter, fred ); fredIter >> f; ) {
71                delete( &f );
72        }
73
74        Sequence(Fred) fred0;
75        Fred * middle;
76        for ( i; 10 ) {
77                if( i == 5) {
78                        middle = new( i );
79                        addHead( fred0, *middle );
80                        continue;
81                }
82                addHead( fred0, *new( i ) );
83        }
84
85        for ( SeqIterRev(Fred) iter = { fred0 }; iter >> f; ) {
86                sout | f.i | ' ';
87        }
88        sout | nl;
89
90        Fred * front = new( -1 );
91        insertBef( fred0, *front, tail(fred0));
92        insertAft( fred0, *front, *new( -2 ) );
93        remove( fred0, *front );
94        delete( front );
95
96        sout | head(fred0).i | nl;
97        Fred & end = dropTail( fred );
98        delete( &end );
99
100        for ( over( fredIter, fred0 ); fredIter >> f; ) {
101                sout | f.i | ' ';
102        }
103        sout | nl;
104
105        Sequence(Fred) fred2;
106
107        split( fred2, fred0, *middle);
108
109        for ( over( fredIter, fred0 ); fredIter >> f; ) {
110                sout | f.i | ' ';
111        }
112        sout | nl;
113
114        for ( over( fredIter, fred2 ); fredIter >> f; ) {
115                sout | f.i | ' ';
116        }
117        sout | nl;
118
119        transfer( fred0, fred2);
120
121        for ( over( fredIter, fred0 ); fredIter >> f; ) {
122                sout | f.i | ' ';
123        }
124        sout | nl;
125
126        for ( over( fredIter, fred0 ); fredIter >> f; ) {
127                delete( &f );
128        }
129
130        // Mary test
131
132        struct Mary {
133                inline Fred;                                                                    // Plan 9 inheritance
134                int j;
135        };
136        void ?{}( Mary & mary ) { abort(); }
137        void ?{}( Mary & mary, int p ) with( mary ) {
138                ((Fred &)mary){ p };
139                j = p;
140        }
141
142        Mary *& Back( Mary * n ) {
143                return (Mary *)Back( (Fred *)n );
144        }
145
146        Mary *& Next( Mary * n ) {
147                return (Mary *)Next( (Fred *)n );
148        }
149
150        Sequence(Mary) mary;
151        Sequence(Mary) baz;
152        SeqIter(Mary) maryIter = { mary };
153        Mary & m;
154
155        for ( ; maryIter >> m; ) {                                                      // empty list
156                sout | m.i | m.j | ' ';
157        }
158        sout | "empty" | nl;
159       
160        for ( i; 10 ) {
161                add( mary, *new( 2 * i ) );
162                add( baz, *new( 2 * i ) );
163        }
164
165        for ( SeqIter(Mary) iter = { mary }; iter >> m; ) {
166                sout | m.i | m.j | ' ';
167        }
168        sout | nl;
169       
170        for ( i; 9 ) {
171                delete( &dropHead( mary ) );
172        }
173
174        for ( over( maryIter, mary ); maryIter >> m; ) {
175                sout | m.i | m.j | ' ';
176        }
177        sout | nl;
178       
179        for ( i; 10 ) {
180                addTail( mary, *new( 2 * i + 1 ) );
181        }
182        for ( over( maryIter, mary ); maryIter >> m; ) {
183                sout | m.i | m.j | ' ';
184        }
185        sout | nl;
186
187        for ( i; 9 ) {
188                delete( &dropTail( mary ) );
189        }
190        for ( over( maryIter, mary ); maryIter >> m; ) {
191                sout | m.i | m.j | ' ';
192        }
193        sout | nl;
194
195        transfer( mary, baz );
196
197        for ( over( maryIter, baz ); maryIter >> m; ) {
198                sout | m.i | m.j | ' ';
199        }
200        sout | "empty" | nl;
201
202        for ( over( maryIter, mary ); maryIter >> m; ) {
203                sout | m.i | m.j | ' ';
204        }
205        sout | nl;
206
207        for ( over( maryIter, mary ); maryIter >> m; ) {
208                delete( &m );
209        }
210}
Note: See TracBrowser for help on using the repository browser.