Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/bits/queue.hfa

    ra5a67ab8 r7c1144b  
    2828
    2929                T * succ( Queue(T) & q, T * n ) with( q ) {             // pre: *n in *q
    30 #ifdef __CFA_DEBUG__
     30                        #ifdef __CFA_DEBUG__
    3131                        if ( ! listed( n ) ) abort( "(Queue &)%p.succ( %p ) : Node is not on a list.", &q, n );
    32 #endif // __CFA_DEBUG__
    33                         return (Next( n ) == n) ? 0p : Next( n );
     32                        #endif // __CFA_DEBUG__
     33                        return (Next( *n ) == n) ? 0p : Next( *n );
    3434                } // post: n == tail() & succ(n) == 0 | n != tail() & *succ(n) in *q
    3535
    3636                void addHead( Queue(T) & q, T & n ) with( q ) {
    37 #ifdef __CFA_DEBUG__
     37                        #ifdef __CFA_DEBUG__
    3838                        if ( listed( &n ) ) abort( "(Queue &)%p.addHead( %p ) : Node is already on another list.", &q, &n );
    39 #endif // __CFA_DEBUG__
     39                        #endif // __CFA_DEBUG__
    4040                        if ( last ) {
    41                                 Next( &n ) = &head( q );
     41                                Next( n ) = &head( q );
    4242                                q.root = &n;
    4343                        } else {
    4444                                root = last = &n;
    45                                 Next( &n ) = &n;                                                        // last node points to itself
     45                                Next( n ) = &n;                                                 // last node points to itself
    4646                        }
    4747                }
    4848
    4949                void addTail( Queue(T) & q, T & n ) with( q ) {
    50 #ifdef __CFA_DEBUG__
     50                        #ifdef __CFA_DEBUG__
    5151                        if ( listed( &n ) ) abort( "(Queue &)%p.addTail( %p ) : Node is already on another list.", &q, &n );
    52 #endif // __CFA_DEBUG__
    53                         if ( last ) Next( last ) = &n;
     52                        #endif // __CFA_DEBUG__
     53                        if ( last ) Next( *last ) = &n;
    5454                        else root = &n;
    5555                        last = &n;
    56                         Next( &n ) = &n;                                                                // last node points to itself
     56                        Next( n ) = &n;                                                         // last node points to itself
    5757                }
    5858
     
    6464                        T & t = head( q );
    6565                        if ( root ) {
    66                                 root = Next( root );
     66                                root = Next( *root );
    6767                                if ( &head( q ) == &t ) {
    6868                                        root = last = 0p;                                       // only one element
    6969                                }
    70                                 Next( &t ) = 0p;
     70                                Next( t ) = 0p;
    7171                        }
    7272                        return t;
     
    7878
    7979                void remove( Queue(T) & q, T & n ) with( q ) {  // O(n)
    80 #ifdef __CFA_DEBUG__
     80                        #ifdef __CFA_DEBUG__
    8181                        if ( ! listed( (Colable &)n ) ) abort( "(Queue &)%p.remove( %p ) : Node is not on a list.", &q, &n );
    82 #endif // __CFA_DEBUG__
    83                         T * prev = 0p;
    84                         T * curr = (T *)root;
     82                        #endif // __CFA_DEBUG__
     83                        T & prev = *0p;
     84                        T & curr = *(T *)root;
    8585                        for ( ;; ) {
    86                                 if ( &n == curr ) {                                             // found => remove
     86                                if ( &n == &curr ) {                                            // found => remove
    8787                                        if ( (T *)root == &n ) {
    8888                                                dropHead( q );
    8989                                        } else if ( last == &n ) {
    90                                                 last = prev;
    91                                                 Next( last ) = last;
     90                                                last = &prev;
     91                                                Next( *last ) = last;
    9292                                        } else {
    9393                                                Next( prev ) = Next( curr );
    9494                                        }
    95                                         Next( &n ) = 0p;
     95                                        Next( n ) = 0p;
    9696                                        break;
    9797                                }
    98 #ifdef __CFA_DEBUG__
    9998                                // not found => error
    100                                 if (curr == last) abort( "(Queue &)%p.remove( %p ) : Node is not in list.", &q, &n );
    101 #endif // __CFA_DEBUG__
    102                                 prev = curr;
    103                                 curr = Next( curr );
     99                                #ifdef __CFA_DEBUG__
     100                                if ( &curr == last ) abort( "(Queue &)%p.remove( %p ) : Node is not in list.", &q, &n );
     101                                #endif // __CFA_DEBUG__
     102                                &prev = &curr;
     103                                &curr = Next( curr );
    104104                        }
    105105                } // post: ! listed( n )
     
    116116                                root = from.root;
    117117                        } else {                                                                        // "to" list not empty
    118                                 Next( last ) = &head( from );
     118                                Next( *last ) = &head( from );
    119119                        }
    120120                        last = from.last;
     
    125125                // Node "n" must be in the "from" list.
    126126                void split( Queue(T) & q, Queue(T) & from, T & n ) with( q ) {
    127 #ifdef __CFA_DEBUG__
     127                        #ifdef __CFA_DEBUG__
    128128                        if ( ! listed( (Colable &)n ) ) abort( "(Queue &)%p.split( %p ) : Node is not on a list.", &q, &n );
    129 #endif // __CFA_DEBUG__
     129                        #endif // __CFA_DEBUG__
    130130                        Queue(T) to;
    131131                        to.root = from.root;                                            // start of "to" list
    132132                        to.last = &n;                                                           // end of "to" list
    133                         from.root = Next( &n );                                         // start of "from" list
     133                        from.root = Next( n );                                          // start of "from" list
    134134                        if ( &n == &head( from ) ) {                            // last node in list ?
    135135                                from.root = from.last = 0p;                             // mark "from" list empty
    136136                        } else {
    137                                 Next( &n ) = &n;                                                // fix end of "to" list
     137                                Next( n ) = &n;                                                 // fix end of "to" list
    138138                        }
    139139                        transfer( q, to );
     
    169169                        if ( curr ) {
    170170                                &tp = Curr( qi );
    171                                 T * n = Next( Curr( qi ) );
     171                                T * n = Next( *Curr( qi ) );
    172172                                curr = (n == Curr( qi ) ) ? 0p : n;
    173173                        } else &tp = 0p;
     
    177177        } // distribution
    178178} // distribution
    179 
    180 // Local Variables: //
    181 // compile-command: "cfa queue.cfa" //
    182 // End: //
Note: See TracChangeset for help on using the changeset viewer.