Ignore:
File:
1 edited

Legend:

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

    r636d3715 r5e82d56  
    1414                } // post: empty() & head() == 0 | !empty() & head() in *this
    1515
     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
    1628                void ?{}( Stack(T) &, const Stack(T) & ) = void; // no copy
    1729                Stack(T) & ?=?( const Stack(T) & ) = void;              // no assignment
     
    2133                } // post: empty()
    2234
    23                 T & top( Stack(T) & s ) with( s ) {
    24                         return *head( s );
     35                T * top( Stack(T) & s ) with( s ) {
     36                        return head( s );
    2537                }
    2638
    27                 void addHead( Stack(T) & s, T & n ) with( s ) {
     39                void addHead( Stack(T) & s, T * n ) with( s ) {
    2840#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 );
    3042#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;
    3345                }
    3446
    35                 void add( Stack(T) & s, T & n ) with( s ) {
     47                void add( Stack(T) & s, T * n ) with( s ) {
    3648                        addHead( s, n );
    3749                }
    3850
    39                 void push( Stack(T) & s, T & n ) with( s ) {
     51                void push( Stack(T) & s, T * n ) with( s ) {
    4052                        addHead( s, n );
    4153                }
    4254
    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 );
    4557                        if ( root ) {
    4658                                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;
    4961                        } // if
    5062                        return t;
    5163                }
    5264
    53                 T & pop( Stack(T) & s ) with( s ) {
     65                T * pop( Stack(T) & s ) with( s ) {
    5466                        return drop( s );
    5567                }
     
    6476
    6577        inline {
     78                // wrappers to make ColIter have T
     79                T * Curr( StackIter(T) & si ) with( si ) {
     80                        return (T *)curr;
     81                }
     82
    6683                void ?{}( StackIter(T) & si ) with( si ) {
    6784                        ((ColIter &)si){};
     
    7390                } // post: curr = {e in s}
    7491
    75                 void ?{}( StackIter(T) & si, T & start ) with( si ) {
    76                         curr = &start;
     92                void ?{}( StackIter(T) & si, T * start ) with( si ) {
     93                        curr = start;
    7794                } // post: curr = {e in s}
    7895
     
    8299                } // post: curr = {e in s}
    83100
    84                 bool ?>>?( StackIter(T) & si, T && tp ) with( si ) {
     101                bool ?>>?( StackIter(T) & si, T *& tp ) with( si ) {
    85102                        if ( curr ) {
    86                                 &tp = Curr( si );
     103                                tp = Curr( si );
    87104                                T * n = Next( Curr( si ) );
    88                                 curr = n == Curr( si ) ? 0p : n;
    89                         } else &tp = 0p;
    90                         return &tp != 0p;
     105                                curr = (n == Curr( si ) ) ? 0p : n;
     106                        } else tp = 0p;
     107                        return tp != 0p;
    91108                }
    92109        } // distribution
Note: See TracChangeset for help on using the changeset viewer.