Ignore:
Timestamp:
Dec 3, 2020, 11:56:01 AM (3 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
89c982c, a78c3ff, cc5cc27
Parents:
1db306a
Message:

more code sharing in containers

File:
1 edited

Legend:

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

    r1db306a r636d3715  
    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 
    2816                void ?{}( Stack(T) &, const Stack(T) & ) = void; // no copy
    2917                Stack(T) & ?=?( const Stack(T) & ) = void;              // no assignment
     
    3321                } // post: empty()
    3422
    35                 T * top( Stack(T) & s ) with( s ) {
    36                         return head( s );
     23                T & top( Stack(T) & s ) with( s ) {
     24                        return *head( s );
    3725                }
    3826
    39                 void addHead( Stack(T) & s, T * n ) with( s ) {
     27                void addHead( Stack(T) & s, T & n ) with( s ) {
    4028#ifdef __CFA_DEBUG__
    41                         if ( listed( (Colable &)(*n) ) ) abort( "(Stack &)%p.addHead( %p ) : Node is already on another list.", &s, n );
     29                        if ( listed( (Colable &)(n) ) ) abort( "(Stack &)%p.addHead( %p ) : Node is already on another list.", &s, n );
    4230#endif // __CFA_DEBUG__
    43                         Next( n ) = Root( s ) ? Root( s ) : n;
    44                         root = n;
     31                        Next( &n ) = head( s ) ? head( s ) : &n;
     32                        root = &n;
    4533                }
    4634
    47                 void add( Stack(T) & s, T * n ) with( s ) {
     35                void add( Stack(T) & s, T & n ) with( s ) {
    4836                        addHead( s, n );
    4937                }
    5038
    51                 void push( Stack(T) & s, T * n ) with( s ) {
     39                void push( Stack(T) & s, T & n ) with( s ) {
    5240                        addHead( s, n );
    5341                }
    5442
    55                 T * drop( Stack(T) & s ) with( s ) {
    56                         T * t = head( s );
     43                T & drop( Stack(T) & s ) with( s ) {
     44                        T & t = *head( s );
    5745                        if ( root ) {
    5846                                root = ( T *)Next(root);
    59                                 if ( Root( s ) == t ) root = 0p;                // only one element ?
    60                                 Next( t ) = 0p;
     47                                if ( head( s ) == &t ) root = 0p;               // only one element ?
     48                                Next( &t ) = 0p;
    6149                        } // if
    6250                        return t;
    6351                }
    6452
    65                 T * pop( Stack(T) & s ) with( s ) {
     53                T & pop( Stack(T) & s ) with( s ) {
    6654                        return drop( s );
    6755                }
     
    7664
    7765        inline {
    78                 // wrappers to make ColIter have T
    79                 T * Curr( StackIter(T) & si ) with( si ) {
    80                         return (T *)curr;
    81                 }
    82 
    8366                void ?{}( StackIter(T) & si ) with( si ) {
    8467                        ((ColIter &)si){};
     
    9073                } // post: curr = {e in s}
    9174
    92                 void ?{}( StackIter(T) & si, T * start ) with( si ) {
    93                         curr = start;
     75                void ?{}( StackIter(T) & si, T & start ) with( si ) {
     76                        curr = &start;
    9477                } // post: curr = {e in s}
    9578
     
    10386                                &tp = Curr( si );
    10487                                T * n = Next( Curr( si ) );
    105                                 curr = (n == Curr( si ) ) ? 0p : n;
     88                                curr = n == Curr( si ) ? 0p : n;
    10689                        } else &tp = 0p;
    10790                        return &tp != 0p;
Note: See TracChangeset for help on using the changeset viewer.