Ignore:
Timestamp:
Dec 28, 2020, 4:13:58 PM (10 months ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
arm-eh, jacob/cs343-translation, master, new-ast-unique-expr
Children:
6ae5c22
Parents:
b6460bf (diff), bf1914e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

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

    rb6460bf r3e36f22  
    3636} // distribution
    3737
     38
     39// A Sequence(T) is a Collection(T) defining the ordering of a uStack and uQueue, and to insert and remove elements
     40// anywhere in the sequence. T must be a public descendant of uSeqable.
     41
     42// The implementation is a typical doubly-linked list, except the next field of the last node points at the first node
     43// and the back field of the last node points at the first node (circular).
     44
    3845forall( dtype T | { T *& Back ( T * ); T *& Next ( T * ); } ) {
    3946        struct Sequence {
     
    5259                void ?{}( Sequence(T) & s ) with( s ) {
    5360                        ((Collection &)s){};
    54                 }       // post: isEmpty().
    55 
    56                 // Return a pointer to the last sequence element, without removing it. 
     61                }       // post: isEmpty()
     62
     63                // Return a pointer to the last sequence element, without removing it.
    5764                T & tail( Sequence(T) & s ) with( s ) {
    5865                        return root ? (T &)*Back( &head( s ) ) : *0p;
     
    6774                } // post: n == tail() & succ(n) == 0 | n != tail() & *succ(n) in *s
    6875
    69                 // Return a pointer to the element before *n, or 0p if there isn't one.
     76                // Return a pointer to the element before *n, or 0p if list empty.
    7077                T * pred( Sequence(T) & s, T * n ) with( s ) {  // pre: *n in *s
    7178                        #ifdef __CFA_DEBUG__
     
    7380                        #endif // __CFA_DEBUG__
    7481                        return n == &head( s ) ? 0p : Back( n );
    75                 }       // post: n == head() & head(n) == 0 | n != head() & *pred(n) in *s
    76 
    77 
    78                 // Insert *n into the sequence before *bef, or at the end if bef == 0.
     82                } // post: n == head() & head(n) == 0 | n != head() & *pred(n) in *s
     83
     84
     85                // Insert *n into the sequence before *bef, or at the end if bef == 0p.
    7986                T & insertBef( Sequence(T) & s, T & n, T & bef ) with( s ) { // pre: !n->listed() & *bef in *s
    8087                        #ifdef __CFA_DEBUG__
     
    137144                        } // if
    138145                        return n;
    139                 }        // post: n->listed() & *n in *s & succ(n) == bef
     146                } // post: n->listed() & *n in *s & succ(n) == bef
    140147               
    141148                // pre: n->listed() & *n in *s
     
    152159                        Next( &n ) = Back( &n ) = 0p;
    153160                        return n;
    154                 }                                                       // post: !n->listed().
     161                } // post: !n->listed()
    155162
    156163                // Add an element to the head of the sequence.
     
    158165                        return insertAft( s, *0p, n );
    159166                }
     167
    160168                // Add an element to the tail of the sequence.
    161169                T & addTail( Sequence(T) & s, T & n ) {                 // pre: !n->listed(); post: n->listed() & head() == n
    162170                        return insertBef( s, n, *0p );
    163171                }
     172
    164173                // Add an element to the tail of the sequence.
    165174                T & add( Sequence(T) & s, T & n ) {                             // pre: !n->listed(); post: n->listed() & head() == n
    166175                        return addTail( s, n );
    167176                }
     177
    168178                // Remove and return the head element in the sequence.
    169179                T & dropHead( Sequence(T) & s ) {
     
    171181                        return &n ? remove( s, n ), n : *0p;
    172182                }
     183
    173184                // Remove and return the head element in the sequence.
    174185                T & drop( Sequence(T) & s ) {
    175186                        return dropHead( s );
    176187                }
     188
    177189                // Remove and return the tail element in the sequence.
    178190                T & dropTail( Sequence(T) & s ) {
     
    233245                        ((ColIter &)si){};
    234246                        seq = 0p;
    235                 } // post: elts = null.
    236 
     247                } // post: elts = null
     248
     249                // Create a iterator active in sequence s.
    237250                void ?{}( SeqIter(T) & si, Sequence(T) & s ) with( si ) {
    238251                        ((ColIter &)si){};
    239252                        seq = &s;
    240253                        curr = &head( s );
    241                 } // post: elts = null.
     254                } // post: elts = null
    242255
    243256                void ?{}( SeqIter(T) & si, Sequence(T) & s, T & start ) with( si ) {
     
    245258                        seq = &s;
    246259                        curr = &start;
    247                 } // post: elts = null.
    248 
     260                } // post: elts = null
     261
     262                // Make the iterator active in sequence s.
    249263                void over( SeqIter(T) & si, Sequence(T) & s ) with( si ) {
    250264                        seq = &s;
    251265                        curr = &head( s );
    252                 } // post: elts = {e in s}.
    253 
    254                 bool ?>>?( SeqIter(T) & si, T && tp ) with( si ) {
     266                } // post: elts = {e in s}
     267
     268                bool ?|?( SeqIter(T) & si, T && tp ) with( si ) {
    255269                        if ( curr ) {
    256270                                &tp = Curr( si );
     
    274288                        ((ColIter &)si){};
    275289                        seq = 0p;
    276                 } // post: elts = null.
    277 
     290                } // post: elts = null
     291
     292                // Create a iterator active in sequence s.
    278293                void ?{}( SeqIterRev(T) & si, Sequence(T) & s ) with( si ) {   
    279294                        ((ColIter &)si){};
    280295                        seq = &s;
    281296                        curr = &tail( s );
    282                 } // post: elts = null.
     297                } // post: elts = null
    283298
    284299                void ?{}( SeqIterRev(T) & si, Sequence(T) & s, T & start ) with( si ) {
     
    286301                        seq = &s;
    287302                        curr = &start;
    288                 } // post: elts = null.
    289 
     303                } // post: elts = null
     304
     305                // Make the iterator active in sequence s.
    290306                void over( SeqIterRev(T) & si, Sequence(T) & s ) with( si ) {
    291307                        seq = &s;
    292308                        curr = &tail( s );
    293                 } // post: elts = {e in s}.
    294 
    295                 bool ?>>?( SeqIterRev(T) & si, T && tp ) with( si ) {
     309                } // post: elts = {e in s}
     310
     311                bool ?|?( SeqIterRev(T) & si, T && tp ) with( si ) {
    296312                        if ( curr ) {
    297313                                &tp = Curr( si );
Note: See TracChangeset for help on using the changeset viewer.