Changes in libcfa/src/bits/sequence.hfa [b37515b:636d3715]
- File:
-
- 1 edited
-
libcfa/src/bits/sequence.hfa (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/bits/sequence.hfa
rb37515b r636d3715 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 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 … … 63 47 // Return a pointer to the last sequence element, without removing it. 64 48 T & tail( Sequence(T) & s ) with( s ) { 65 return root ? (T &)Back( Root( s ) ) : *0p; // needs cast?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 … … 88 72 if ( listed( &n ) ) abort( "(Sequence &)%p.insertBef( %p, %p ) : Node is already on another list.", &s, n, &bef ); 89 73 #endif // __CFA_DEBUG__ 90 if ( &bef == Root( s ) ) { // must change root74 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;80 Back( head( s ) ) = &n; 97 81 Next( Back( &n ) ) = &n; 98 82 } else { … … 104 88 root = &n; 105 89 } else { 106 if ( ! &bef ) &bef = Root( s );90 if ( ! &bef ) &bef = head( s ); 107 91 Next( &n ) = &bef; 108 92 Back( &n ) = Back( &bef ); … … 122 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;112 Back( head( s ) ) = &n; 129 113 Next( Back( &n ) ) = &n; 130 114 } else { … … 149 133 if ( ! listed( &n ) ) abort( "(Sequence &)%p.remove( %p ) : Node is not on a list.", &s, &n ); 150 134 #endif // __CFA_DEBUG__ 151 if ( &n == Root( s ) ) {152 if ( Next( Root( s ) ) == Root( s ) ) root = 0p;153 else root = Next( Root(s ) );135 if ( &n == head( s ) ) { 136 if ( Next( head( s ) ) == head( s ) ) root = 0p; 137 else root = Next( head(s ) ); 154 138 } // if 155 139 Back( Next( &n ) ) = Back( &n ); … … 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. … … 270 249 271 250 inline { 272 // wrappers to make ColIter have T273 T * Curr( SeqIterRev(T) & si ) with( si ) {274 return (T *)curr;275 }276 277 251 void ?{}( SeqIterRev(T) & si ) with( si ) { 278 252 ((ColIter &) si){};
Note:
See TracChangeset
for help on using the changeset viewer.