Changes in / [ee56a4f:b19fdb9]
- Files:
-
- 8 edited
-
libcfa/src/bits/queue.hfa (modified) (5 diffs)
-
libcfa/src/bits/sequence.hfa (modified) (4 diffs)
-
libcfa/src/bits/stack.hfa (modified) (2 diffs)
-
tests/collections/.expect/queue.txt (modified) (1 diff)
-
tests/collections/.expect/sequence.txt (modified) (1 diff)
-
tests/collections/queue.cfa (modified) (9 diffs)
-
tests/collections/sequence.cfa (modified) (10 diffs)
-
tests/collections/stack.cfa (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/bits/queue.hfa
ree56a4f rb19fdb9 34 34 } // post: n == tail() & succ(n) == 0 | n != tail() & *succ(n) in *q 35 35 36 T &addHead( Queue(T) & q, T & n ) with( q ) {36 void addHead( Queue(T) & q, T & n ) with( q ) { 37 37 #ifdef __CFA_DEBUG__ 38 38 if ( listed( &n ) ) abort( "(Queue &)%p.addHead( %p ) : Node is already on another list.", &q, &n ); … … 45 45 Next( &n ) = &n; // last node points to itself 46 46 } 47 return n;48 47 } 49 48 50 T &addTail( Queue(T) & q, T & n ) with( q ) {49 void addTail( Queue(T) & q, T & n ) with( q ) { 51 50 #ifdef __CFA_DEBUG__ 52 51 if ( listed( &n ) ) abort( "(Queue &)%p.addTail( %p ) : Node is already on another list.", &q, &n ); … … 56 55 last = &n; 57 56 Next( &n ) = &n; // last node points to itself 58 return n;59 57 } 60 58 61 T &add( Queue(T) & q, T & n ) with( q ) {62 returnaddTail( q, n );59 void add( Queue(T) & q, T & n ) with( q ) { 60 addTail( q, n ); 63 61 } 64 62 … … 79 77 } 80 78 81 T &remove( Queue(T) & q, T & n ) with( q ) { // O(n)79 void remove( Queue(T) & q, T & n ) with( q ) { // O(n) 82 80 #ifdef __CFA_DEBUG__ 83 81 if ( ! listed( (Colable &)n ) ) abort( "(Queue &)%p.remove( %p ) : Node is not on a list.", &q, &n ); … … 105 103 curr = Next( curr ); 106 104 } 107 return n;108 105 } // post: ! listed( n ) 109 106 -
libcfa/src/bits/sequence.hfa
ree56a4f rb19fdb9 77 77 78 78 // Insert *n into the sequence before *bef, or at the end if bef == 0. 79 T &insertBef( Sequence(T) & s, T & n, T & bef ) with( s ) { // pre: !n->listed() & *bef in *s79 void insertBef( Sequence(T) & s, T & n, T & bef ) with( s ) { // pre: !n->listed() & *bef in *s 80 80 #ifdef __CFA_DEBUG__ 81 81 if ( listed( &n ) ) abort( "(Sequence &)%p.insertBef( %p, %p ) : Node is already on another list.", &s, n, &bef ); … … 105 105 Next( Back( &n ) ) = &n; 106 106 } // if 107 return n;108 107 } // post: n->listed() & *n in *s & succ(n) == bef 109 108 110 109 111 110 // Insert *n into the sequence after *aft, or at the beginning if aft == 0. 112 T &insertAft( Sequence(T) & s, T & aft, T & n ) with( s ) { // pre: !n->listed() & *aft in *s111 void insertAft( Sequence(T) & s, T & aft, T & n ) with( s ) { // pre: !n->listed() & *aft in *s 113 112 #ifdef __CFA_DEBUG__ 114 113 if ( listed( &n ) ) abort( "(Sequence &)%p.insertAft( %p, %p ) : Node is already on another list.", &s, &aft, &n ); … … 136 135 Next( &aft ) = &n; 137 136 } // if 138 return n;139 137 } // post: n->listed() & *n in *s & succ(n) == bef 140 138 141 139 // pre: n->listed() & *n in *s 142 T &remove( Sequence(T) & s, T & n ) with( s ) { // O(1)140 void remove( Sequence(T) & s, T & n ) with( s ) { // O(1) 143 141 #ifdef __CFA_DEBUG__ 144 142 if ( ! listed( &n ) ) abort( "(Sequence &)%p.remove( %p ) : Node is not on a list.", &s, &n ); … … 151 149 Next( Back( &n ) ) = Next( &n ); 152 150 Next( &n ) = Back( &n ) = 0p; 153 return n;154 151 } // post: !n->listed(). 155 152 156 153 // Add an element to the head of the sequence. 157 T & addHead( Sequence(T) & s, T & n ) {// pre: !n->listed(); post: n->listed() & head() == n158 returninsertAft( s, *0p, n );154 void addHead( Sequence(T) & s, T & n ) { // pre: !n->listed(); post: n->listed() & head() == n 155 insertAft( s, *0p, n ); 159 156 } 160 157 // Add an element to the tail of the sequence. 161 T & addTail( Sequence(T) & s, T & n ) {// pre: !n->listed(); post: n->listed() & head() == n162 returninsertBef( s, n, *0p );158 void addTail( Sequence(T) & s, T & n ) { // pre: !n->listed(); post: n->listed() & head() == n 159 insertBef( s, n, *0p ); 163 160 } 164 161 // Add an element to the tail of the sequence. 165 T & add( Sequence(T) & s, T & n ) {// pre: !n->listed(); post: n->listed() & head() == n166 returnaddTail( s, n );162 void add( Sequence(T) & s, T & n ) { // pre: !n->listed(); post: n->listed() & head() == n 163 addTail( s, n ); 167 164 } 168 165 // Remove and return the head element in the sequence. -
libcfa/src/bits/stack.hfa
ree56a4f rb19fdb9 25 25 } 26 26 27 T &addHead( Stack(T) & s, T & n ) with( s ) {27 void addHead( Stack(T) & s, T & n ) with( s ) { 28 28 #ifdef __CFA_DEBUG__ 29 29 if ( listed( (Colable &)(n) ) ) abort( "(Stack &)%p.addHead( %p ) : Node is already on another list.", &s, n ); … … 31 31 Next( &n ) = &head( s ) ? &head( s ) : &n; 32 32 root = &n; 33 return n;34 33 } 35 34 36 T &add( Stack(T) & s, T & n ) with( s ) {37 returnaddHead( s, n );35 void add( Stack(T) & s, T & n ) with( s ) { 36 addHead( s, n ); 38 37 } 39 38 40 T &push( Stack(T) & s, T & n ) with( s ) {41 returnaddHead( s, n );39 void push( Stack(T) & s, T & n ) with( s ) { 40 addHead( s, n ); 42 41 } 43 42 -
tests/collections/.expect/queue.txt
ree56a4f rb19fdb9 1 1 empty 2 0 18 2 0 3 18 3 4 0 2 4 6 8 10 12 14 16 18 4 5 18 5 -1 18 -2 6 -1 18 1 3 5 7 9 11 13 15 17 19 -2 6 18 7 7 18 1 3 5 7 9 11 13 15 17 8 18 1 3 5 7 8 0 1 2 3 4 5 6 7 8 9 9 6 7 8 9 10 0 1 2 3 4 5 11 6 7 8 9 0 1 2 3 4 5 9 12 empty 10 0 1 2 3 4 5 6 7 8 911 5 6 7 8 912 0 1 2 3 413 5 6 7 8 9 0 1 2 3 414 empty15 0 1816 13 0 0 2 2 4 4 6 6 8 8 10 10 12 12 14 14 16 16 18 18 17 14 18 18 18 -1 18 -1 19 18 18 1 1 3 3 5 5 7 7 9 9 11 11 13 13 15 15 17 17 20 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 21 5 5 6 6 7 7 8 8 9 9 22 0 0 1 1 2 2 3 3 4 4 23 5 5 6 6 7 7 8 8 9 9 0 0 1 1 2 2 3 3 4 4 15 18 18 1 1 3 3 5 5 7 7 9 9 11 11 13 13 15 15 17 17 19 19 -
tests/collections/.expect/sequence.txt
ree56a4f rb19fdb9 1 1 empty 2 0 183 2 0 2 4 6 8 10 12 14 16 18 4 3 18 5 -1 18 -2 6 -1 18 1 3 5 7 9 11 13 15 17 19 -2 7 18 1 3 5 7 9 11 13 15 17 8 18 1 3 5 7 4 18 1 3 5 7 9 11 13 15 17 19 5 18 1 6 0 1 2 3 4 5 6 7 8 9 7 9 8 9 8 7 6 5 4 3 1 -2 0 9 4 3 1 -2 0 10 9 8 7 6 5 11 4 3 1 -2 0 9 8 7 6 5 9 12 empty 10 0 1 2 3 4 5 6 7 8 911 -1 -2 012 -1 -2 9 8 7 6 5 4 3 2 1 013 9 8 7 6 5 4 3 2 114 4 3 2 115 9 8 7 6 516 4 3 2 1 9 8 7 6 517 empty18 0 1819 13 0 0 2 2 4 4 6 6 8 8 10 10 12 12 14 14 16 16 18 18 20 14 18 18 21 -1 18 -1 22 18 18 1 1 3 3 5 5 7 7 9 9 11 11 13 13 15 15 17 17 23 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 24 5 5 6 6 7 7 8 8 9 9 25 0 0 1 1 2 2 3 3 4 4 26 5 5 6 6 7 7 8 8 9 9 0 0 1 1 2 2 3 3 4 4 15 18 18 1 1 3 3 5 5 7 7 9 9 11 11 13 13 15 15 17 17 19 19 16 18 18 1 1 17 empty 18 18 18 1 1 0 0 2 2 4 4 6 6 8 8 10 10 12 12 14 14 16 16 18 18 -
tests/collections/queue.cfa
ree56a4f rb19fdb9 33 33 } 34 34 35 sout | head( fred ).i | tail( fred ).i | nl; 35 sout | head(fred).i | nl; 36 sout | tail(fred).i | nl; 36 37 37 38 for ( QueueIter(Fred) iter = { fred }; iter >> f; ) { … … 53 54 } 54 55 55 Fred * head = new( -1 ), tail = { -2 }; 56 addHead( fred, *head ); 57 addTail( fred, tail ); 56 Fred * front = new( -1 ); 57 addHead( fred, *front ); 58 sout | succ( fred, front )->i | nl; 59 remove( fred, *front ); 60 delete( front ); 58 61 59 sout | head( fred ).i | succ( fred, head )->i | tail( fred ).i | nl; 60 for ( over( fredIter, fred ); fredIter >> f; ) { 61 sout | f.i | ' '; 62 } 63 sout | nl; 64 65 remove( fred, *head ); 66 remove( fred, tail ); 67 delete( head ); 68 delete( &dropTail( fred ) ); 62 Fred & end = dropTail( fred ); 63 delete( &end ); 69 64 70 65 for ( over( fredIter, fred ); fredIter >> f; ) { … … 73 68 sout | nl; 74 69 75 for ( i; 5) {76 delete( & dropTail( fred ));70 for ( over( fredIter, fred ); fredIter >> f; ) { 71 delete( &f ); 77 72 } 78 for ( over( fredIter, fred ); fredIter >> f; ) { 79 sout | f.i | ' '; 73 74 Queue(Fred) fred0; 75 Fred * middle; 76 for ( i; 10 ) { 77 if( i == 5) { 78 middle = new( i ); 79 add( fred0, *middle ); 80 continue; 81 } 82 add( fred0, *new( i ) ); 80 83 } 81 sout | nl;82 84 83 for ( over( fredIter, fred ); fredIter >> f; ) { 84 delete( &remove( fred, f ) ); 85 } 86 for ( over( fredIter, fred ); fredIter >> f; ) { 87 sout | f.i | ' '; 88 } 89 sout | "empty" | nl; 90 91 Fred & middle; 92 for ( i; 10 ) { 93 add( fred, *new( i ) ); 94 if ( i == 4 ) { 95 &middle = &tail( fred ); 96 } 97 } 98 for ( QueueIter(Fred) iter = { fred }; iter >> f; ) { 85 for ( QueueIter(Fred) iter = { fred0 }; iter >> f; ) { 99 86 sout | f.i | ' '; 100 87 } … … 103 90 Queue(Fred) fred2; 104 91 105 split( fred2, fred , middle);92 split( fred2, fred0, *middle); 106 93 107 for ( over( fredIter, fred ); fredIter >> f; ) {94 for ( over( fredIter, fred0 ); fredIter >> f; ) { 108 95 sout | f.i | ' '; 109 96 } … … 115 102 sout | nl; 116 103 117 transfer( fred , fred2);104 transfer( fred0, fred2); 118 105 119 for ( over( fredIter, fred ); fredIter >> f; ) {106 for ( over( fredIter, fred0 ); fredIter >> f; ) { 120 107 sout | f.i | ' '; 121 108 } 122 109 sout | nl; 123 110 124 for ( over( fredIter, fred ); fredIter >> f; ) {111 for ( over( fredIter, fred0 ); fredIter >> f; ) { 125 112 delete( &f ); 126 113 } … … 135 122 void ?{}( Mary & mary, int p ) with( mary ) { 136 123 ((Fred &)mary){ p }; 137 j = p;124 j = i = p; 138 125 } 126 139 127 Mary *& Next( Mary * n ) { 140 128 return (Mary *)Next( (Fred *)n ); … … 153 141 add( mary, *new( 2 * i ) ); 154 142 } 155 156 sout | head( mary ).i | tail( mary ).i | nl;157 143 158 144 for ( QueueIter(Mary) iter = { mary }; iter >> m; ) { … … 173 159 add( mary, *new( 2 * i + 1 ) ); 174 160 } 175 176 Mary * head = new( -1 ), tail = { -1 };177 addHead( mary, *head );178 addTail( mary, tail );179 sout | head( mary ).i | succ( mary, head )->i | tail( mary ).i | nl;180 remove( mary, *head );181 remove( mary, tail );182 delete( (Mary *)head );183 delete( &dropTail( mary ) );184 185 161 for ( over( maryIter, mary ); maryIter >> m; ) { 186 162 sout | m.i | m.j | ' '; … … 189 165 190 166 for ( over( maryIter, mary ); maryIter >> m; ) { 191 delete( &remove( mary, m ) );192 }193 194 Mary & middle;195 for ( i; 10 ) {196 add( mary, *new( i ) );197 if ( i == 4 ) {198 &middle = &tail( mary );199 }200 }201 for ( QueueIter(Mary) iter = { mary }; iter >> m; ) {202 sout | m.i | m.j | ' ';203 }204 sout | nl;205 206 Queue(Mary) mary2;207 208 split( mary2, mary, middle );209 210 for ( over( maryIter, mary ); maryIter >> m; ) {211 sout | m.i | m.j | ' ';212 }213 sout | nl;214 for ( over( maryIter, mary2 ); maryIter >> m; ) {215 sout | m.i | m.j | ' ';216 }217 sout | nl;218 219 transfer( mary, mary2 );220 221 for ( over( maryIter, mary ); maryIter >> m; ) {222 sout | m.i | m.j | ' ';223 }224 sout | nl;225 for ( over( maryIter, mary ); maryIter >> m; ) {226 167 delete( &m ); 227 168 } -
tests/collections/sequence.cfa
ree56a4f rb19fdb9 14 14 i = p; 15 15 } 16 16 17 Fred *& Back( Fred * n ) { 17 18 return (Fred *)Back( (Seqable *)n ); 18 19 } 20 19 21 Fred *& Next( Fred * n ) { 20 22 return (Fred *)Next( (Colable *)n ); … … 36 38 } 37 39 38 sout | head( fred ).i | tail( fred ).i | nl;39 40 40 for ( SeqIter(Fred) iter = { fred }; iter >> f; ) { 41 41 sout | f.i | ' '; … … 55 55 addTail( fred, *new( 2 * i + 1 ) ); 56 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 ) { 57 for ( over( fredIter, fred ); fredIter >> f; ) { 58 sout | f.i | ' '; 59 } 60 sout | nl; 61 62 for ( i; 9 ) { 79 63 delete( &dropTail( fred ) ); 80 64 } … … 85 69 86 70 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 ); 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; 99 81 } 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; ) { 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; ) { 122 101 sout | f.i | ' '; 123 102 } … … 126 105 Sequence(Fred) fred2; 127 106 128 split( fred2, fred , middle);129 130 for ( over( fredIter, fred ); fredIter >> f; ) {107 split( fred2, fred0, *middle); 108 109 for ( over( fredIter, fred0 ); fredIter >> f; ) { 131 110 sout | f.i | ' '; 132 111 } … … 138 117 sout | nl; 139 118 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; ) {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; ) { 148 127 delete( &f ); 149 128 } … … 160 139 j = p; 161 140 } 141 162 142 Mary *& Back( Mary * n ) { 163 143 return (Mary *)Back( (Fred *)n ); 164 144 } 145 165 146 Mary *& Next( Mary * n ) { 166 147 return (Mary *)Next( (Fred *)n ); … … 168 149 169 150 Sequence(Mary) mary; 151 Sequence(Mary) baz; 170 152 SeqIter(Mary) maryIter = { mary }; 171 153 Mary & m; … … 178 160 for ( i; 10 ) { 179 161 add( mary, *new( 2 * i ) ); 180 } 181 182 sout | head( mary ).i | tail( mary ).i | nl; 162 add( baz, *new( 2 * i ) ); 163 } 183 164 184 165 for ( SeqIter(Mary) iter = { mary }; iter >> m; ) { … … 199 180 addTail( mary, *new( 2 * i + 1 ) ); 200 181 } 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; 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 251 207 for ( over( maryIter, mary ); maryIter >> m; ) { 252 208 delete( &m ); -
tests/collections/stack.cfa
ree56a4f rb19fdb9 38 38 sout | nl; 39 39 40 sout | head( fred).i | nl;40 sout | head(fred).i | nl; 41 41 42 42 for ( i; 9 ) { … … 70 70 void ?{}( Mary & mary, int p ) with( mary ) { 71 71 ((Fred &)mary){ p }; 72 j = p;72 j = i = p; 73 73 } 74 74
Note:
See TracChangeset
for help on using the changeset viewer.