- Timestamp:
- Dec 3, 2020, 1:49:01 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 62e456f, ab0257b9
- Parents:
- f0d67e5 (diff), fa11053 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- libcfa/src/bits
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/bits/collection.hfa
rf0d67e5 rb5629d8 13 13 // return true iff *this is an element of a collection 14 14 bool listed( Colable & co ) with( co ) { // pre: this != 0 15 return next != 0 ;15 return next != 0p; 16 16 } 17 17 … … 23 23 return cp->next; 24 24 } 25 26 forall( dtype T ) { 27 T *& Next( T * n ) { 28 return (T *)Next( (Colable *)n ); 29 } 30 31 bool listed( T * n ) { 32 return Next( (Colable *)n ) != 0p; 33 } 34 } // distribution 25 35 } // distribution 36 26 37 27 38 struct Collection { … … 41 52 return root == 0p; 42 53 } 54 43 55 void * head( Collection & collection ) with( collection ) { 44 56 return root; … … 55 67 curr = 0p; 56 68 } // post: elts = null 69 70 forall( dtype T ) { 71 T * Curr( ColIter & ci ) with( ci ) { 72 return (T *)curr; 73 } 74 } // distribution 57 75 } // distribution -
libcfa/src/bits/queue.hfa
rf0d67e5 rb5629d8 14 14 return (T *)head( (Collection &)q ); 15 15 } // post: empty() & head() == 0 | !empty() & head() in *q 16 17 bool empty( Queue(T) & q ) with( q ) { // 0 <=> *q contains no elements18 return empty( (Collection &)q );19 }20 21 bool listed( T * n ) {22 return Next( (Colable *)n ) != 0;23 }24 25 T *& Next( T * n ) {26 return (T *)Next( (Colable *)n );27 }28 29 T * Root( Queue(T) & q ) with( q ) {30 return (T *)root;31 }32 16 33 17 void ?{}( Queue(T) &, const Queue(T) & ) = void; // no copy … … 55 39 #endif // __CFA_DEBUG__ 56 40 if ( last ) { 57 Next( n ) = Root( q );41 Next( n ) = head( q ); 58 42 q.root = n; 59 43 } else { … … 81 65 if ( root ) { 82 66 root = Next( root ); 83 if ( Root( q ) == t ) {67 if ( head( q ) == t ) { 84 68 root = last = 0p; // only one element 85 69 } … … 132 116 root = from.root; 133 117 } else { // "to" list not empty 134 Next( last ) = Root( from );118 Next( last ) = head( from ); 135 119 } 136 120 last = from.last; … … 148 132 to.last = n; // end of "to" list 149 133 from.root = Next( n ); // start of "from" list 150 if ( n == Root( from ) ) { // last node in list ?134 if ( n == head( from ) ) { // last node in list ? 151 135 from.root = from.last = 0p; // mark "from" list empty 152 136 } else { … … 164 148 165 149 inline { 166 // wrappers to make ColIter have T167 T * Curr( QueueIter(T) & qi ) with( qi ) {168 return (T *)curr;169 }170 171 150 void ?{}( QueueIter(T) & qi ) with( qi ) { 172 151 ((ColIter &)qi){}; … … 187 166 } // post: curr = {e in q} 188 167 189 bool ?>>?( QueueIter(T) & qi, T *& tp ) with( qi ) {168 bool ?>>?( QueueIter(T) & qi, T && tp ) with( qi ) { 190 169 if ( curr ) { 191 tp = Curr( qi );170 &tp = Curr( qi ); 192 171 T * n = Next( Curr( qi ) ); 193 172 curr = (n == Curr( qi ) ) ? 0p : n; 194 } else tp = 0p;195 return tp != 0p;173 } else &tp = 0p; 174 return &tp != 0p; 196 175 } 197 176 // post: elts == null & !operator>>(tp) | elts != null & *tp' in elts & elts' == elts - *tp & operator>>(tp) -
libcfa/src/bits/queue_example.cfa
rf0d67e5 rb5629d8 17 17 Queue(Fred) fred; 18 18 QueueIter(Fred) fredIter = { fred }; 19 Fred * f; 20 int i; 19 Fred & f; 21 20 22 21 sout | nlOff; // turn off auto newline 23 22 24 23 for ( ; fredIter >> f; ) { // empty list 25 sout | f ->i | ' ';24 sout | f.i | ' '; 26 25 } 27 26 sout | "empty" | nl; 28 27 29 for ( i = 0; i < 10; i += 1) {28 for ( i; 10 ) { 30 29 add( fred, new( 2 * i ) ); 31 30 } 32 31 33 for ( over( fredIter, fred ); fredIter >> f; ) {34 sout | f ->i | ' ';32 for ( QueueIter(Fred) iter = { fred }; iter >> f; ) { 33 sout | f.i | ' '; 35 34 } 36 35 sout | nl; 37 36 38 for ( i = 0; i < 9; i += 1) {37 for ( i; 9 ) { 39 38 delete( drop( fred ) ); 40 39 } 41 40 42 41 for ( over( fredIter, fred ); fredIter >> f; ) { 43 sout | f ->i | ' ';42 sout | f.i | ' '; 44 43 } 45 44 sout | nl; 46 45 47 for ( i = 0; i < 10; i += 1) {46 for ( i; 10 ) { 48 47 add( fred, new( 2 * i + 1 ) ); 49 48 } 50 49 for ( over( fredIter, fred ); fredIter >> f; ) { 51 sout | f ->i | ' ';50 sout | f.i | ' '; 52 51 } 53 52 sout | nl; 54 53 55 54 for ( over( fredIter, fred ); fredIter >> f; ) { 56 delete( f );55 delete( &f ); 57 56 } 58 57 … … 71 70 Queue(Mary) mary; 72 71 QueueIter(Mary) maryIter = { mary }; 73 Mary *m;72 Mary & m; 74 73 75 74 for ( ; maryIter >> m; ) { // empty list 76 sout | m ->i | m->j | ' ';75 sout | m.i | m.j | ' '; 77 76 } 78 77 sout | "empty" | nl; 79 78 80 for ( i = 0; i < 10; i += 1) {79 for ( i; 10 ) { 81 80 add( mary, new( 2 * i ) ); 82 81 } 83 82 84 for ( over( maryIter, mary ); maryIter >> m; ) {85 sout | m ->i | m->j | ' ';83 for ( QueueIter(Mary) iter = { mary }; iter >> m; ) { 84 sout | m.i | m.j | ' '; 86 85 } 87 86 sout | nl; 88 87 89 for ( i = 0; i < 9; i += 1) {88 for ( i; 9 ) { 90 89 delete( drop( mary ) ); 91 90 } 92 91 93 92 for ( over( maryIter, mary ); maryIter >> m; ) { 94 sout | m ->i | m->j | ' ';93 sout | m.i | m.j | ' '; 95 94 } 96 95 sout | nl; 97 96 98 for ( i = 0; i < 10; i += 1) {97 for ( i; 10 ) { 99 98 add( mary, new( 2 * i + 1 ) ); 100 99 } 101 100 for ( over( maryIter, mary ); maryIter >> m; ) { 102 sout | m ->i | m->j | ' ';101 sout | m.i | m.j | ' '; 103 102 } 104 103 sout | nl; 105 104 106 105 for ( over( maryIter, mary ); maryIter >> m; ) { 107 delete( m );106 delete( &m ); 108 107 } 109 108 } -
libcfa/src/bits/sequence.hfa
rf0d67e5 rb5629d8 10 10 inline { 11 11 void ?{}( Seqable & sq ) with( sq ) { 12 ((Colable & 12 ((Colable &) sq){}; 13 13 back = 0p; 14 14 } // post: ! listed() … … 34 34 } // post: empty() & head() == 0 | !empty() & head() in *s 35 35 36 bool empty( Sequence(T) & s ) with( s ) { // 0 <=> *s contains no elements37 return empty( (Collection &)s );38 }39 40 bool listed( T * n ) {41 return Next( (Colable *)n ) != 0;42 }43 44 T *& Next( T * n ) {45 return (T *)Next( (Colable *)n );46 }47 48 36 T *& Back( T * n ) { 49 37 return (T *)Back( (Seqable *)n ); 50 }51 52 T * Root( Sequence(T) & s ) with( s ) {53 return (T *)root;54 38 } 55 39 … … 62 46 63 47 // Return a pointer to the last sequence element, without removing it. 64 T *tail( Sequence(T) & s ) with( s ) {65 return root ? (T *)Back( Root( s ) ) :0p; // needs cast?48 T & tail( Sequence(T) & s ) with( s ) { 49 return root ? (T &)Back( head( s ) ) : *0p; // needs cast? 66 50 } // post: empty() & tail() == 0 | !empty() & tail() in *s 67 51 … … 71 55 if ( ! listed( n ) ) abort( "(Sequence &)%p.succ( %p ) : Node is not on a list.", &s, n ); 72 56 #endif // __CFA_DEBUG__ 73 return Next( n ) == Root( s ) ? 0p : Next( n );57 return Next( n ) == head( s ) ? 0p : Next( n ); 74 58 } // post: n == tail() & succ(n) == 0 | n != tail() & *succ(n) in *s 75 59 … … 79 63 if ( ! listed( n ) ) abort( "(Sequence &)%p.pred( %p ) : Node is not on a list.", &s, n ); 80 64 #endif // __CFA_DEBUG__ 81 return n == Root( s ) ? 0p : Back( n );65 return n == head( s ) ? 0p : Back( n ); 82 66 } // post: n == head() & head(n) == 0 | n != head() & *pred(n) in *s 83 67 84 68 85 69 // Insert *n into the sequence before *bef, or at the end if bef == 0. 86 void insertBef( Sequence(T) & s, T * n, T *bef ) with( s ) { // pre: !n->listed() & *bef in *s87 #ifdef __CFA_DEBUG__ 88 if ( listed( n ) ) abort( "(Sequence &)%p.insertBef( %p, %p ) : Node is already on another list.", &s, n,bef );89 #endif // __CFA_DEBUG__ 90 if ( bef == Root( s ) ) { // must change root70 void insertBef( Sequence(T) & s, T & n, T & bef ) with( s ) { // pre: !n->listed() & *bef in *s 71 #ifdef __CFA_DEBUG__ 72 if ( listed( &n ) ) abort( "(Sequence &)%p.insertBef( %p, %p ) : Node is already on another list.", &s, n, &bef ); 73 #endif // __CFA_DEBUG__ 74 if ( &bef == head( s ) ) { // must change root 91 75 if ( root ) { 92 Next( n ) = Root( s );93 Back( n ) = Back( Root( s ) );76 Next( &n ) = head( s ); 77 Back( &n ) = Back( head( s ) ); 94 78 // inserted node must be consistent before it is seen 95 79 asm( "" : : : "memory" ); // prevent code movement across barrier 96 Back( Root( s ) ) =n;97 Next( Back( n ) ) =n;80 Back( head( s ) ) = &n; 81 Next( Back( &n ) ) = &n; 98 82 } else { 99 Next( n ) =n;100 Back( n ) =n;83 Next( &n ) = &n; 84 Back( &n ) = &n; 101 85 } // if 102 86 // inserted node must be consistent before it is seen 103 87 asm( "" : : : "memory" ); // prevent code movement across barrier 104 root = n;88 root = &n; 105 89 } else { 106 if ( ! bef ) bef = Root( s );107 Next( n ) =bef;108 Back( n ) = Back(bef );90 if ( ! &bef ) &bef = head( s ); 91 Next( &n ) = &bef; 92 Back( &n ) = Back( &bef ); 109 93 // inserted node must be consistent before it is seen 110 94 asm( "" : : : "memory" ); // prevent code movement across barrier 111 Back( bef ) =n;112 Next( Back( n ) ) =n;95 Back( &bef ) = &n; 96 Next( Back( &n ) ) = &n; 113 97 } // if 114 98 } // post: n->listed() & *n in *s & succ(n) == bef … … 116 100 117 101 // Insert *n into the sequence after *aft, or at the beginning if aft == 0. 118 void insertAft( Sequence(T) & s, T *aft, T *n ) with( s ) { // pre: !n->listed() & *aft in *s119 #ifdef __CFA_DEBUG__ 120 if ( listed( n ) ) abort( "(Sequence &)%p.insertAft( %p, %p ) : Node is already on another list.", &s, aft,n );121 #endif // __CFA_DEBUG__ 122 if ( ! aft ) { // must change root102 void insertAft( Sequence(T) & s, T & aft, T & n ) with( s ) { // pre: !n->listed() & *aft in *s 103 #ifdef __CFA_DEBUG__ 104 if ( listed( &n ) ) abort( "(Sequence &)%p.insertAft( %p, %p ) : Node is already on another list.", &s, &aft, &n ); 105 #endif // __CFA_DEBUG__ 106 if ( ! &aft ) { // must change root 123 107 if ( root ) { 124 Next( n ) = Root( s );125 Back( n ) = Back( Root( s ) );108 Next( &n ) = head( s ); 109 Back( &n ) = Back( head( s ) ); 126 110 // inserted node must be consistent before it is seen 127 111 asm( "" : : : "memory" ); // prevent code movement across barrier 128 Back( Root( s ) ) =n;129 Next( Back( n ) ) =n;112 Back( head( s ) ) = &n; 113 Next( Back( &n ) ) = &n; 130 114 } else { 131 Next( n ) =n;132 Back( n ) =n;115 Next( &n ) = &n; 116 Back( &n ) = &n; 133 117 } // if 134 118 asm( "" : : : "memory" ); // prevent code movement across barrier 135 root = n;119 root = &n; 136 120 } else { 137 Next( n ) = Next(aft );138 Back( n ) =aft;121 Next( &n ) = Next( &aft ); 122 Back( &n ) = &aft; 139 123 // inserted node must be consistent before it is seen 140 124 asm( "" : : : "memory" ); // prevent code movement across barrier 141 Back( Next( n ) ) =n;142 Next( aft ) =n;125 Back( Next( &n ) ) = &n; 126 Next( &aft ) = &n; 143 127 } // if 144 128 } // post: n->listed() & *n in *s & succ(n) == bef 145 129 146 130 // pre: n->listed() & *n in *s 147 void remove( Sequence(T) & s, T *n ) with( s ) { // O(1)148 #ifdef __CFA_DEBUG__ 149 if ( ! listed( n ) ) abort( "(Sequence &)%p.remove( %p ) : Node is not on a list.", &s,n );150 #endif // __CFA_DEBUG__ 151 if ( n == Root( s ) ) {152 if ( Next( Root( s ) ) == Root( s ) ) root = 0p;153 else root = Next( Root(s ) );154 } // if 155 Back( Next( n ) ) = Back(n );156 Next( Back( n ) ) = Next(n );157 Next( n ) = Back(n ) = 0p;131 void remove( Sequence(T) & s, T & n ) with( s ) { // O(1) 132 #ifdef __CFA_DEBUG__ 133 if ( ! listed( &n ) ) abort( "(Sequence &)%p.remove( %p ) : Node is not on a list.", &s, &n ); 134 #endif // __CFA_DEBUG__ 135 if ( &n == head( s ) ) { 136 if ( Next( head( s ) ) == head( s ) ) root = 0p; 137 else root = Next( head(s ) ); 138 } // if 139 Back( Next( &n ) ) = Back( &n ); 140 Next( Back( &n ) ) = Next( &n ); 141 Next( &n ) = Back( &n ) = 0p; 158 142 } // post: !n->listed(). 159 143 160 144 // Add an element to the head of the sequence. 161 void addHead( Sequence(T) & s, T *n ) {// pre: !n->listed(); post: n->listed() & head() == n162 insertAft( s, 0, n );145 void addHead( Sequence(T) & s, T & n ) { // pre: !n->listed(); post: n->listed() & head() == n 146 insertAft( s, *0p, n ); 163 147 } 164 148 // Add an element to the tail of the sequence. 165 void addTail( Sequence(T) & s, T *n ) {// pre: !n->listed(); post: n->listed() & head() == n166 insertBef( s, n, 0);149 void addTail( Sequence(T) & s, T & n ) { // pre: !n->listed(); post: n->listed() & head() == n 150 insertBef( s, n, *0p ); 167 151 } 168 152 // Add an element to the tail of the sequence. 169 void add( Sequence(T) & s, T *n ) {// pre: !n->listed(); post: n->listed() & head() == n153 void add( Sequence(T) & s, T & n ) { // pre: !n->listed(); post: n->listed() & head() == n 170 154 addTail( s, n ); 171 155 } 172 156 // Remove and return the head element in the sequence. 173 T *dropHead( Sequence(T) & s ) {157 T & dropHead( Sequence(T) & s ) { 174 158 T * n = head( s ); 175 return n ? remove( s, n ), n :0p;159 return n ? remove( s, *n ), *n : *0p; 176 160 } 177 161 // Remove and return the head element in the sequence. 178 T *drop( Sequence(T) & s ) {162 T & drop( Sequence(T) & s ) { 179 163 return dropHead( s ); 180 164 } 181 165 // Remove and return the tail element in the sequence. 182 T *dropTail( Sequence(T) & s ) {183 T *n = tail( s );184 return n ? remove( s, n ), n :0p;166 T & dropTail( Sequence(T) & s ) { 167 T & n = tail( s ); 168 return &n ? remove( s, n ), n : *0p; 185 169 } 186 170 … … 191 175 root = from.root; 192 176 } else { // "to" list not empty 193 T * toEnd = Back( Root( s ) );194 T * fromEnd = Back( Root( from ) );177 T * toEnd = Back( head( s ) ); 178 T * fromEnd = Back( head( from ) ); 195 179 Back( root ) = fromEnd; 196 Next( fromEnd ) = Root( s );180 Next( fromEnd ) = head( s ); 197 181 Back( from.root ) = toEnd; 198 Next( toEnd ) = Root( from );182 Next( toEnd ) = head( from ); 199 183 } // if 200 184 from.root = 0p; // mark "from" list empty … … 213 197 from.root = 0p; // mark "from" list empty 214 198 } else { 215 Back( Root( from ) ) = Back( Root( to ) ); // fix "from" list216 Next( Back( Root( to ) ) ) = Root( from );217 Next( n ) = Root( to ); // fix "to" list218 Back( Root( to ) ) = n;199 Back( head( from ) ) = Back( head( to ) ); // fix "from" list 200 Next( Back( head( to ) ) ) = head( from ); 201 Next( n ) = head( to ); // fix "to" list 202 Back( head( to ) ) = n; 219 203 } // if 220 204 transfer( s, to ); … … 231 215 232 216 inline { 233 // wrappers to make ColIter have T 234 T * Curr( SeqIter(T) & si ) with( si ) { 235 return (T *)curr; 236 } 237 238 void ?{}( SeqIter(T) & si ) with( si ) { 239 ((ColIter &) si){}; 217 void ?{}( SeqIter(T) & si ) with( si ) { 218 ((ColIter &)si){}; 240 219 seq = 0p; 241 220 } // post: elts = null. … … 244 223 ((ColIter &) si){}; 245 224 seq = &s; 225 curr = head( s ); 246 226 } // post: elts = null. 247 227 … … 251 231 } // post: elts = {e in s}. 252 232 253 bool ?>>?( SeqIter(T) & si, T *& tp ) with( si ) {233 bool ?>>?( SeqIter(T) & si, T && tp ) with( si ) { 254 234 if ( curr ) { 255 tp = Curr( si );256 T * n = succ( *seq, Curr( si ) );235 &tp = Curr( si ); 236 T * n = succ( *seq, Curr( si ) ); 257 237 curr = n == head( *seq ) ? 0p : n; 258 } else tp = 0p;259 return tp != 0p;238 } else &tp = 0p; 239 return &tp != 0p; 260 240 } 261 241 } // distribution … … 269 249 270 250 inline { 271 // wrappers to make ColIter have T272 T * Curr( SeqIterRev(T) & si ) with( si ) {273 return (T *)curr;274 }275 276 251 void ?{}( SeqIterRev(T) & si ) with( si ) { 277 252 ((ColIter &) si){}; … … 282 257 ((ColIter &) si){}; 283 258 seq = &s; 259 curr = &tail( s ); 284 260 } // post: elts = null. 285 261 286 262 void over( SeqIterRev(T) & si, Sequence(T) & s ) with( si ) { 287 263 seq = &s; 288 curr = tail( s );264 curr = &tail( s ); 289 265 } // post: elts = {e in s}. 290 266 291 bool ?>>?( SeqIterRev(T) & si, T *&tp ) with( si ) {267 bool ?>>?( SeqIterRev(T) & si, T && tp ) with( si ) { 292 268 if ( curr ) { 293 tp = Curr( si );294 T * n = pred( *seq, Curr( si ) );295 curr = n == tail( *seq ) ? 0p : n;296 } else tp = 0p;297 return tp != 0p;269 &tp = Curr( si ); 270 T * n = pred( *seq, Curr( si ) ); 271 curr = n == &tail( *seq ) ? 0p : n; 272 } else &tp = 0p; 273 return &tp != 0p; 298 274 } 299 275 } // distribution -
libcfa/src/bits/sequence_example.cfa
rf0d67e5 rb5629d8 17 17 Sequence(Fred) fred; 18 18 SeqIter(Fred) fredIter = { fred }; 19 Fred * f; 20 int i; 19 Fred & f; 21 20 22 21 sout | nlOff; // turn off auto newline 23 22 24 23 for ( ; fredIter >> f; ) { // empty list 25 sout | f ->i | ' ';24 sout | f.i | ' '; 26 25 } 27 26 sout | "empty" | nl; 28 27 29 for ( i = 0; i < 10; i += 1 ) { 30 add( fred, new( 2 * i ) ); 28 for ( i; 10 ) { 29 add( fred, *new( 2 * i ) ); 30 } 31 32 for ( SeqIter(Fred) iter = { fred }; iter >> f; ) { 33 sout | f.i | ' '; 34 } 35 sout | nl; 36 37 for ( i; 9 ) { 38 delete( &dropHead( fred ) ); 31 39 } 32 40 33 41 for ( over( fredIter, fred ); fredIter >> f; ) { 34 sout | f->i | ' '; 42 sout | f.i | ' '; 43 } 44 sout | nl; 45 46 for ( i; 10 ) { 47 addTail( fred, *new( 2 * i + 1 ) ); 48 } 49 for ( over( fredIter, fred ); fredIter >> f; ) { 50 sout | f.i | ' '; 35 51 } 36 52 sout | nl; 37 53 38 for ( i = 0; i < 9; i += 1 ) { 39 delete( dropHead( fred ) ); 40 } 41 42 for ( over( fredIter, fred ); fredIter >> f; ) { 43 sout | f->i | ' '; 44 } 45 sout | nl; 46 47 for ( i = 0; i < 10; i += 1 ) { 48 addTail( fred, new( 2 * i + 1 ) ); 54 for ( i; 9 ) { 55 delete( &dropTail( fred ) ); 49 56 } 50 57 for ( over( fredIter, fred ); fredIter >> f; ) { 51 sout | f->i | ' '; 52 } 53 sout | nl; 54 55 for ( i = 0; i < 9; i += 1 ) { 56 delete( dropTail( fred ) ); 57 } 58 for ( over( fredIter, fred ); fredIter >> f; ) { 59 sout | f->i | ' '; 58 sout | f.i | ' '; 60 59 } 61 60 sout | nl; 62 61 63 62 for ( over( fredIter, fred ); fredIter >> f; ) { 64 delete( f );63 delete( &f ); 65 64 } 66 65 … … 80 79 Sequence(Mary) baz; 81 80 SeqIter(Mary) maryIter = { mary }; 82 Mary *m;81 Mary & m; 83 82 84 83 for ( ; maryIter >> m; ) { // empty list 85 sout | m ->i | m->j | ' ';84 sout | m.i | m.j | ' '; 86 85 } 87 86 sout | "empty" | nl; 88 87 89 for ( i = 0; i < 10; i += 1 ) { 90 add( mary, new( 2 * i ) ); 91 add( baz, new( 2 * i ) ); 88 for ( i; 10 ) { 89 add( mary, *new( 2 * i ) ); 90 add( baz, *new( 2 * i ) ); 91 } 92 93 for ( SeqIter(Mary) iter = { mary }; iter >> m; ) { 94 sout | m.i | m.j | ' '; 95 } 96 sout | nl; 97 98 for ( i; 9 ) { 99 delete( &dropHead( mary ) ); 92 100 } 93 101 94 102 for ( over( maryIter, mary ); maryIter >> m; ) { 95 sout | m ->i | m->j | ' ';103 sout | m.i | m.j | ' '; 96 104 } 97 105 sout | nl; 98 106 99 for ( i = 0; i < 9; i += 1 ) { 100 delete( dropHead( mary ) ); 101 } 102 103 for ( over( maryIter, mary ); maryIter >> m; ) { 104 sout | m->i | m->j | ' '; 105 } 106 sout | nl; 107 108 for ( i = 0; i < 10; i += 1 ) { 109 addTail( mary, new( 2 * i + 1 ) ); 107 for ( i; 10 ) { 108 addTail( mary, *new( 2 * i + 1 ) ); 110 109 } 111 110 for ( over( maryIter, mary ); maryIter >> m; ) { 112 sout | m ->i | m->j | ' ';111 sout | m.i | m.j | ' '; 113 112 } 114 113 sout | nl; 115 114 116 for ( i = 0; i < 9; i += 1) {117 delete( dropTail( mary ) );115 for ( i; 9 ) { 116 delete( &dropTail( mary ) ); 118 117 } 119 118 for ( over( maryIter, mary ); maryIter >> m; ) { 120 sout | m ->i | m->j | ' ';119 sout | m.i | m.j | ' '; 121 120 } 122 121 sout | nl; … … 125 124 126 125 for ( over( maryIter, baz ); maryIter >> m; ) { 127 sout | m ->i | m->j | ' ';126 sout | m.i | m.j | ' '; 128 127 } 129 128 sout | "empty" | nl; 130 129 131 130 for ( over( maryIter, mary ); maryIter >> m; ) { 132 sout | m ->i | m->j | ' ';131 sout | m.i | m.j | ' '; 133 132 } 134 133 sout | nl; 135 134 136 135 for ( over( maryIter, mary ); maryIter >> m; ) { 137 delete( m );136 delete( &m ); 138 137 } 139 138 } 140 139 141 140 // Local Variables: // 142 // compile-command: "cfa sequence_example.c c" //141 // compile-command: "cfa sequence_example.cfa" // 143 142 // End: // -
libcfa/src/bits/stack.hfa
rf0d67e5 rb5629d8 14 14 } // post: empty() & head() == 0 | !empty() & head() in *this 15 15 16 bool empty( Stack(T) & s ) with( s ) { // 0 <=> *this contains no elements17 return empty( (Collection &)s );18 }19 20 T *& Next( T * n ) {21 return (T *)Next( (Colable *)n );22 }23 24 T * Root( Stack(T) & s ) with( s ) {25 return (T *)root;26 }27 28 16 void ?{}( Stack(T) &, const Stack(T) & ) = void; // no copy 29 17 Stack(T) & ?=?( const Stack(T) & ) = void; // no assignment … … 33 21 } // post: empty() 34 22 35 T *top( Stack(T) & s ) with( s ) {36 return head( s );23 T & top( Stack(T) & s ) with( s ) { 24 return *head( s ); 37 25 } 38 26 39 void addHead( Stack(T) & s, T *n ) with( s ) {27 void addHead( Stack(T) & s, T & n ) with( s ) { 40 28 #ifdef __CFA_DEBUG__ 41 if ( listed( (Colable &)( *n) ) ) abort( "(Stack &)%p.addHead( %p ) : Node is already on another list.", &s, n );29 if ( listed( (Colable &)(n) ) ) abort( "(Stack &)%p.addHead( %p ) : Node is already on another list.", &s, n ); 42 30 #endif // __CFA_DEBUG__ 43 Next( n ) = Root( s ) ? Root( s ) :n;44 root = n;31 Next( &n ) = head( s ) ? head( s ) : &n; 32 root = &n; 45 33 } 46 34 47 void add( Stack(T) & s, T *n ) with( s ) {35 void add( Stack(T) & s, T & n ) with( s ) { 48 36 addHead( s, n ); 49 37 } 50 38 51 void push( Stack(T) & s, T *n ) with( s ) {39 void push( Stack(T) & s, T & n ) with( s ) { 52 40 addHead( s, n ); 53 41 } 54 42 55 T *drop( Stack(T) & s ) with( s ) {56 T * t =head( s );43 T & drop( Stack(T) & s ) with( s ) { 44 T & t = *head( s ); 57 45 if ( root ) { 58 46 root = ( T *)Next(root); 59 if ( Root( s ) ==t ) root = 0p; // only one element ?60 Next( t ) = 0p;47 if ( head( s ) == &t ) root = 0p; // only one element ? 48 Next( &t ) = 0p; 61 49 } // if 62 50 return t; 63 51 } 64 52 65 T *pop( Stack(T) & s ) with( s ) {53 T & pop( Stack(T) & s ) with( s ) { 66 54 return drop( s ); 67 55 } … … 76 64 77 65 inline { 78 // wrappers to make ColIter have T79 T * Curr( StackIter(T) & si ) with( si ) {80 return (T *)curr;81 }82 83 66 void ?{}( StackIter(T) & si ) with( si ) { 84 67 ((ColIter &)si){}; … … 90 73 } // post: curr = {e in s} 91 74 92 void ?{}( StackIter(T) & si, T *start ) with( si ) {93 curr = start;75 void ?{}( StackIter(T) & si, T & start ) with( si ) { 76 curr = &start; 94 77 } // post: curr = {e in s} 95 78 … … 99 82 } // post: curr = {e in s} 100 83 101 bool ?>>?( StackIter(T) & si, T *& tp ) with( si ) {84 bool ?>>?( StackIter(T) & si, T && tp ) with( si ) { 102 85 if ( curr ) { 103 tp = Curr( si );86 &tp = Curr( si ); 104 87 T * n = Next( Curr( si ) ); 105 curr = (n == Curr( si )) ? 0p : n;106 } else tp = 0p;107 return tp != 0p;88 curr = n == Curr( si ) ? 0p : n; 89 } else &tp = 0p; 90 return &tp != 0p; 108 91 } 109 92 } // distribution -
libcfa/src/bits/stack_example.cfa
rf0d67e5 rb5629d8 17 17 Stack(Fred) fred; 18 18 StackIter(Fred) fredIter = { fred }; 19 Fred * f; 20 int i; 19 Fred & f; 21 20 22 21 sout | nlOff; // turn off auto newline 23 22 24 23 for ( ; fredIter >> f; ) { // empty list 25 sout | f ->i | ' ';24 sout | f.i | ' '; 26 25 } 27 26 sout | "empty" | nl; 28 27 29 for ( i = 0; i < 10; i += 1 ) { 30 push( fred, new( 2 * i ) ); 28 for ( i; 10 ) { 29 push( fred, *new( 2 * i ) ); 30 } 31 32 for ( StackIter(Fred) iter = { fred }; iter >> f; ) { 33 sout | f.i | ' '; 34 } 35 sout | nl; 36 37 for ( i; 9 ) { 38 delete( &pop( fred ) ); 31 39 } 32 40 33 41 for ( over( fredIter, fred ); fredIter >> f; ) { 34 sout | f ->i | ' ';42 sout | f.i | ' '; 35 43 } 36 44 sout | nl; 37 45 38 for ( i = 0; i < 9; i += 1 ) { 39 delete( pop( fred ) ); 40 } 41 42 for ( over( fredIter, fred ); fredIter >> f; ) { 43 sout | f->i | ' '; 44 } 45 sout | nl; 46 47 for ( i = 0; i < 10; i += 1 ) { 48 push( fred, new( 2 * i + 1 ) ); 46 for ( i; 10 ) { 47 push( fred, *new( 2 * i + 1 ) ); 49 48 } 50 49 for ( over( fredIter, fred ); fredIter >> f; ) { 51 sout | f ->i | ' ';50 sout | f.i | ' '; 52 51 } 53 52 sout | nl; 54 53 55 54 for ( over( fredIter, fred ); fredIter >> f; ) { 56 delete( f );55 delete( &f ); 57 56 } 58 57 … … 71 70 Stack(Mary) mary; 72 71 StackIter(Mary) maryIter = { mary }; 73 Mary *m;72 Mary & m; 74 73 75 74 for ( ; maryIter >> m; ) { // empty list 76 sout | m ->i | m->j | ' ';75 sout | m.i | m.j | ' '; 77 76 } 78 77 sout | "empty" | nl; 79 78 80 for ( i = 0; i < 10; i += 1 ) { 81 push( mary, new( 2 * i ) ); 79 for ( i; 10 ) { 80 push( mary, *new( 2 * i ) ); 81 } 82 83 for ( StackIter(Mary) iter = { mary }; iter >> m; ) { 84 sout | m.i | m.j | ' '; 85 } 86 sout | nl; 87 88 for ( i; 9 ) { 89 delete( &pop( mary ) ); 82 90 } 83 91 84 92 for ( over( maryIter, mary ); maryIter >> m; ) { 85 sout | m ->i | m->j | ' ';93 sout | m.i | m.j | ' '; 86 94 } 87 95 sout | nl; 88 96 89 for ( i = 0; i < 9; i += 1 ) { 90 delete( pop( mary ) ); 91 } 92 93 for ( over( maryIter, mary ); maryIter >> m; ) { 94 sout | m->i | m->j | ' '; 95 } 96 sout | nl; 97 98 for ( i = 0; i < 10; i += 1 ) { 99 push( mary, new( 2 * i + 1 ) ); 97 for ( i; 10 ) { 98 push( mary, *new( 2 * i + 1 ) ); 100 99 } 101 100 for ( over( maryIter, mary ); maryIter >> m; ) { 102 sout | m ->i | m->j | ' ';101 sout | m.i | m.j | ' '; 103 102 } 104 103 sout | nl; 105 104 106 105 for ( over( maryIter, mary ); maryIter >> m; ) { 107 delete( m );106 delete( &m ); 108 107 } 109 108 }
Note:
See TracChangeset
for help on using the changeset viewer.