Changes in / [cc5cc27:63ec5fa]
- Location:
- libcfa/src/bits
- Files:
-
- 5 edited
-
collection.hfa (modified) (4 diffs)
-
queue.hfa (modified) (6 diffs)
-
sequence.hfa (modified) (13 diffs)
-
stack.hfa (modified) (5 diffs)
-
stack_example.cfa (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/bits/collection.hfa
rcc5cc27 r63ec5fa 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 p;15 return next != 0; 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 } // distribution35 25 } // distribution 36 37 26 38 27 struct Collection { … … 52 41 return root == 0p; 53 42 } 54 55 43 void * head( Collection & collection ) with( collection ) { 56 44 return root; … … 67 55 curr = 0p; 68 56 } // post: elts = null 69 70 forall( dtype T ) {71 T * Curr( ColIter & ci ) with( ci ) {72 return (T *)curr;73 }74 } // distribution75 57 } // distribution -
libcfa/src/bits/queue.hfa
rcc5cc27 r63ec5fa 15 15 } // post: empty() & head() == 0 | !empty() & head() in *q 16 16 17 bool empty( Queue(T) & q ) with( q ) { // 0 <=> *q contains no elements 18 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 17 33 void ?{}( Queue(T) &, const Queue(T) & ) = void; // no copy 18 34 Queue(T) & ?=?( const Queue(T) & ) = void; // no assignment … … 39 55 #endif // __CFA_DEBUG__ 40 56 if ( last ) { 41 Next( n ) = head( q );57 Next( n ) = Root( q ); 42 58 q.root = n; 43 59 } else { … … 65 81 if ( root ) { 66 82 root = Next( root ); 67 if ( head( q ) == t ) {83 if ( Root( q ) == t ) { 68 84 root = last = 0p; // only one element 69 85 } … … 116 132 root = from.root; 117 133 } else { // "to" list not empty 118 Next( last ) = head( from );134 Next( last ) = Root( from ); 119 135 } 120 136 last = from.last; … … 132 148 to.last = n; // end of "to" list 133 149 from.root = Next( n ); // start of "from" list 134 if ( n == head( from ) ) { // last node in list ?150 if ( n == Root( from ) ) { // last node in list ? 135 151 from.root = from.last = 0p; // mark "from" list empty 136 152 } else { … … 148 164 149 165 inline { 166 // wrappers to make ColIter have T 167 T * Curr( QueueIter(T) & qi ) with( qi ) { 168 return (T *)curr; 169 } 170 150 171 void ?{}( QueueIter(T) & qi ) with( qi ) { 151 172 ((ColIter &)qi){}; -
libcfa/src/bits/sequence.hfa
rcc5cc27 r63ec5fa 10 10 inline { 11 11 void ?{}( Seqable & sq ) with( sq ) { 12 ((Colable & ) sq){};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 elements 37 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 36 48 T *& Back( T * n ) { 37 49 return (T *)Back( (Seqable *)n ); 50 } 51 52 T * Root( Sequence(T) & s ) with( s ) { 53 return (T *)root; 38 54 } 39 55 … … 47 63 // Return a pointer to the last sequence element, without removing it. 48 64 T & tail( Sequence(T) & s ) with( s ) { 49 return root ? (T &)Back( head( s ) ) : *0p; // needs cast?65 return root ? (T &)Back( Root( s ) ) : *0p; // needs cast? 50 66 } // post: empty() & tail() == 0 | !empty() & tail() in *s 51 67 … … 55 71 if ( ! listed( n ) ) abort( "(Sequence &)%p.succ( %p ) : Node is not on a list.", &s, n ); 56 72 #endif // __CFA_DEBUG__ 57 return Next( n ) == head( s ) ? 0p : Next( n );73 return Next( n ) == Root( s ) ? 0p : Next( n ); 58 74 } // post: n == tail() & succ(n) == 0 | n != tail() & *succ(n) in *s 59 75 … … 63 79 if ( ! listed( n ) ) abort( "(Sequence &)%p.pred( %p ) : Node is not on a list.", &s, n ); 64 80 #endif // __CFA_DEBUG__ 65 return n == head( s ) ? 0p : Back( n );81 return n == Root( s ) ? 0p : Back( n ); 66 82 } // post: n == head() & head(n) == 0 | n != head() & *pred(n) in *s 67 83 … … 72 88 if ( listed( &n ) ) abort( "(Sequence &)%p.insertBef( %p, %p ) : Node is already on another list.", &s, n, &bef ); 73 89 #endif // __CFA_DEBUG__ 74 if ( &bef == head( s ) ) { // must change root90 if ( &bef == Root( s ) ) { // must change root 75 91 if ( root ) { 76 Next( &n ) = head( s );77 Back( &n ) = Back( head( s ) );92 Next( &n ) = Root( s ); 93 Back( &n ) = Back( Root( s ) ); 78 94 // inserted node must be consistent before it is seen 79 95 asm( "" : : : "memory" ); // prevent code movement across barrier 80 Back( head( s ) ) = &n;96 Back( Root( s ) ) = &n; 81 97 Next( Back( &n ) ) = &n; 82 98 } else { … … 88 104 root = &n; 89 105 } else { 90 if ( ! &bef ) &bef = head( s );106 if ( ! &bef ) &bef = Root( s ); 91 107 Next( &n ) = &bef; 92 108 Back( &n ) = Back( &bef ); … … 106 122 if ( ! &aft ) { // must change root 107 123 if ( root ) { 108 Next( &n ) = head( s );109 Back( &n ) = Back( head( s ) );124 Next( &n ) = Root( s ); 125 Back( &n ) = Back( Root( s ) ); 110 126 // inserted node must be consistent before it is seen 111 127 asm( "" : : : "memory" ); // prevent code movement across barrier 112 Back( head( s ) ) = &n;128 Back( Root( s ) ) = &n; 113 129 Next( Back( &n ) ) = &n; 114 130 } else { … … 133 149 if ( ! listed( &n ) ) abort( "(Sequence &)%p.remove( %p ) : Node is not on a list.", &s, &n ); 134 150 #endif // __CFA_DEBUG__ 135 if ( &n == head( s ) ) {136 if ( Next( head( s ) ) == head( s ) ) root = 0p;137 else root = Next( head(s ) );151 if ( &n == Root( s ) ) { 152 if ( Next( Root( s ) ) == Root( s ) ) root = 0p; 153 else root = Next( Root(s ) ); 138 154 } // if 139 155 Back( Next( &n ) ) = Back( &n ); … … 175 191 root = from.root; 176 192 } else { // "to" list not empty 177 T * toEnd = Back( head( s ) );178 T * fromEnd = Back( head( from ) );193 T * toEnd = Back( Root( s ) ); 194 T * fromEnd = Back( Root( from ) ); 179 195 Back( root ) = fromEnd; 180 Next( fromEnd ) = head( s );196 Next( fromEnd ) = Root( s ); 181 197 Back( from.root ) = toEnd; 182 Next( toEnd ) = head( from );198 Next( toEnd ) = Root( from ); 183 199 } // if 184 200 from.root = 0p; // mark "from" list empty … … 197 213 from.root = 0p; // mark "from" list empty 198 214 } else { 199 Back( head( from ) ) = Back( head( to ) ); // fix "from" list200 Next( Back( head( to ) ) ) = head( from );201 Next( n ) = head( to ); // fix "to" list202 Back( head( to ) ) = n;215 Back( Root( from ) ) = Back( Root( to ) ); // fix "from" list 216 Next( Back( Root( to ) ) ) = Root( from ); 217 Next( n ) = Root( to ); // fix "to" list 218 Back( Root( to ) ) = n; 203 219 } // if 204 220 transfer( s, to ); … … 215 231 216 232 inline { 217 void ?{}( SeqIter(T) & si ) with( si ) { 218 ((ColIter &)si){}; 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){}; 219 240 seq = 0p; 220 241 } // post: elts = null. … … 249 270 250 271 inline { 272 // wrappers to make ColIter have T 273 T * Curr( SeqIterRev(T) & si ) with( si ) { 274 return (T *)curr; 275 } 276 251 277 void ?{}( SeqIterRev(T) & si ) with( si ) { 252 278 ((ColIter &) si){}; -
libcfa/src/bits/stack.hfa
rcc5cc27 r63ec5fa 14 14 } // post: empty() & head() == 0 | !empty() & head() in *this 15 15 16 bool empty( Stack(T) & s ) with( s ) { // 0 <=> *this contains no elements 17 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 16 28 void ?{}( Stack(T) &, const Stack(T) & ) = void; // no copy 17 29 Stack(T) & ?=?( const Stack(T) & ) = void; // no assignment … … 21 33 } // post: empty() 22 34 23 T &top( Stack(T) & s ) with( s ) {24 return *head( s );35 T * top( Stack(T) & s ) with( s ) { 36 return head( s ); 25 37 } 26 38 27 void addHead( Stack(T) & s, T &n ) with( s ) {39 void addHead( Stack(T) & s, T * n ) with( s ) { 28 40 #ifdef __CFA_DEBUG__ 29 if ( listed( (Colable &)( n) ) ) abort( "(Stack &)%p.addHead( %p ) : Node is already on another list.", &s, n );41 if ( listed( (Colable &)(*n) ) ) abort( "(Stack &)%p.addHead( %p ) : Node is already on another list.", &s, n ); 30 42 #endif // __CFA_DEBUG__ 31 Next( &n ) = head( s ) ? head( s ) : &n;32 root = &n;43 Next( n ) = Root( s ) ? Root( s ) : n; 44 root = n; 33 45 } 34 46 35 void add( Stack(T) & s, T &n ) with( s ) {47 void add( Stack(T) & s, T * n ) with( s ) { 36 48 addHead( s, n ); 37 49 } 38 50 39 void push( Stack(T) & s, T &n ) with( s ) {51 void push( Stack(T) & s, T * n ) with( s ) { 40 52 addHead( s, n ); 41 53 } 42 54 43 T &drop( Stack(T) & s ) with( s ) {44 T & t = *head( s );55 T * drop( Stack(T) & s ) with( s ) { 56 T * t = head( s ); 45 57 if ( root ) { 46 58 root = ( T *)Next(root); 47 if ( head( s ) == &t ) root = 0p; // only one element ?48 Next( &t ) = 0p;59 if ( Root( s ) == t ) root = 0p; // only one element ? 60 Next( t ) = 0p; 49 61 } // if 50 62 return t; 51 63 } 52 64 53 T &pop( Stack(T) & s ) with( s ) {65 T * pop( Stack(T) & s ) with( s ) { 54 66 return drop( s ); 55 67 } … … 64 76 65 77 inline { 78 // wrappers to make ColIter have T 79 T * Curr( StackIter(T) & si ) with( si ) { 80 return (T *)curr; 81 } 82 66 83 void ?{}( StackIter(T) & si ) with( si ) { 67 84 ((ColIter &)si){}; … … 73 90 } // post: curr = {e in s} 74 91 75 void ?{}( StackIter(T) & si, T &start ) with( si ) {76 curr = &start;92 void ?{}( StackIter(T) & si, T * start ) with( si ) { 93 curr = start; 77 94 } // post: curr = {e in s} 78 95 … … 86 103 &tp = Curr( si ); 87 104 T * n = Next( Curr( si ) ); 88 curr = n == Curr( si) ? 0p : n;105 curr = (n == Curr( si ) ) ? 0p : n; 89 106 } else &tp = 0p; 90 107 return &tp != 0p; -
libcfa/src/bits/stack_example.cfa
rcc5cc27 r63ec5fa 27 27 28 28 for ( i; 10 ) { 29 push( fred, *new( 2 * i ) );29 push( fred, new( 2 * i ) ); 30 30 } 31 31 … … 36 36 37 37 for ( i; 9 ) { 38 delete( &pop( fred ) );38 delete( pop( fred ) ); 39 39 } 40 40 … … 45 45 46 46 for ( i; 10 ) { 47 push( fred, *new( 2 * i + 1 ) );47 push( fred, new( 2 * i + 1 ) ); 48 48 } 49 49 for ( over( fredIter, fred ); fredIter >> f; ) { … … 78 78 79 79 for ( i; 10 ) { 80 push( mary, *new( 2 * i ) );80 push( mary, new( 2 * i ) ); 81 81 } 82 82 … … 87 87 88 88 for ( i; 9 ) { 89 delete( &pop( mary ) );89 delete( pop( mary ) ); 90 90 } 91 91 … … 96 96 97 97 for ( i; 10 ) { 98 push( mary, *new( 2 * i + 1 ) );98 push( mary, new( 2 * i + 1 ) ); 99 99 } 100 100 for ( over( maryIter, mary ); maryIter >> m; ) {
Note:
See TracChangeset
for help on using the changeset viewer.