Changeset 3d0560d


Ignore:
Timestamp:
Dec 2, 2020, 12:31:42 PM (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:
833ba13
Parents:
4f0c520
Message:

clean up all new collections and fix sequence iterator bug

Location:
libcfa/src/bits
Files:
6 edited

Legend:

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

    r4f0c520 r3d0560d  
    187187                } // post: curr = {e in q}
    188188
    189                 bool ?>>?( QueueIter(T) & qi, T *& tp ) with( qi ) {
     189                bool ?>>?( QueueIter(T) & qi, T && tp ) with( qi ) {
    190190                        if ( curr ) {
    191                                 tp = Curr( qi );
     191                                &tp = Curr( qi );
    192192                                T * n = Next( Curr( qi ) );
    193193                                curr = (n == Curr( qi ) ) ? 0p : n;
    194                         } else tp = 0p;
    195                         return tp != 0p;
     194                        } else &tp = 0p;
     195                        return &tp != 0p;
    196196                }
    197197                // post: elts == null & !operator>>(tp) | elts != null & *tp' in elts & elts' == elts - *tp & operator>>(tp)
  • libcfa/src/bits/queue_example.cfa

    r4f0c520 r3d0560d  
    1717        Queue(Fred) fred;
    1818        QueueIter(Fred) fredIter = { fred };
    19         Fred * f;
    20         int i;
     19        Fred & f;
    2120
    2221        sout | nlOff;                                                                           // turn off auto newline
    2322
    2423        for ( ; fredIter >> f; ) {                                                      // empty list
    25                 sout | f->i | ' ';
     24                sout | f.i | ' ';
    2625        }
    2726        sout | "empty" | nl;
    2827       
    29         for ( i = 0; i < 10; i += 1 ) {
     28        for ( i; 10 ) {
    3029                add( fred, new( 2 * i ) );
    3130        }
    3231
    33         for ( over( fredIter, fred ); fredIter >> f; ) {
    34                 sout | f->i | ' ';
     32        for ( QueueIter(Fred) iter = { fred }; iter >> f; ) {
     33                sout | f.i | ' ';
    3534        }
    3635        sout | nl;
    3736
    38         for ( i = 0; i < 9; i += 1 ) {
     37        for ( i; 9 ) {
    3938                delete( drop( fred ) );
    4039        }
    4140
    4241        for ( over( fredIter, fred ); fredIter >> f; ) {
    43                 sout | f->i | ' ';
     42                sout | f.i | ' ';
    4443        }
    4544        sout | nl;
    4645       
    47         for ( i = 0; i < 10; i += 1 ) {
     46        for ( i; 10 ) {
    4847                add( fred, new( 2 * i + 1 ) );
    4948        }
    5049        for ( over( fredIter, fred ); fredIter >> f; ) {
    51                 sout | f->i | ' ';
     50                sout | f.i | ' ';
    5251        }
    5352        sout | nl;
    5453
    5554        for ( over( fredIter, fred ); fredIter >> f; ) {
    56                 delete( f );
     55                delete( &f );
    5756        }
    5857
     
    7170        Queue(Mary) mary;
    7271        QueueIter(Mary) maryIter = { mary };
    73         Mary * m;
     72        Mary & m;
    7473
    7574        for ( ; maryIter >> m; ) {                                                      // empty list
    76                 sout | m->i | m->j | ' ';
     75                sout | m.i | m.j | ' ';
    7776        }
    7877        sout | "empty" | nl;
    7978       
    80         for ( i = 0; i < 10; i += 1 ) {
     79        for ( i; 10 ) {
    8180                add( mary, new( 2 * i ) );
    8281        }
    8382
    84         for ( over( maryIter, mary ); maryIter >> m; ) {
    85                 sout | m->i | m->j | ' ';
     83        for ( QueueIter(Mary) iter = { mary }; iter >> m; ) {
     84                sout | m.i | m.j | ' ';
    8685        }
    8786        sout | nl;
    8887       
    89         for ( i = 0; i < 9; i += 1 ) {
     88        for ( i; 9 ) {
    9089                delete( drop( mary ) );
    9190        }
    9291
    9392        for ( over( maryIter, mary ); maryIter >> m; ) {
    94                 sout | m->i | m->j | ' ';
     93                sout | m.i | m.j | ' ';
    9594        }
    9695        sout | nl;
    9796       
    98         for ( i = 0; i < 10; i += 1 ) {
     97        for ( i; 10 ) {
    9998                add( mary, new( 2 * i + 1 ) );
    10099        }
    101100        for ( over( maryIter, mary ); maryIter >> m; ) {
    102                 sout | m->i | m->j | ' ';
     101                sout | m.i | m.j | ' ';
    103102        }
    104103        sout | nl;
    105104
    106105        for ( over( maryIter, mary ); maryIter >> m; ) {
    107                 delete( m );
     106                delete( &m );
    108107        }
    109108}
  • libcfa/src/bits/sequence.hfa

    r4f0c520 r3d0560d  
    116116
    117117                // Insert *n into the sequence after *aft, or at the beginning if aft == 0.
    118                 void insertAft( Sequence(T) & s, T *aft, T *n ) with( s ) {     // pre: !n->listed() & *aft in *s
     118                void insertAft( Sequence(T) & s, T * aft, T * n ) with( s ) {   // pre: !n->listed() & *aft in *s
    119119#ifdef __CFA_DEBUG__
    120120                        if ( listed( n ) ) abort( "(Sequence &)%p.insertAft( %p, %p ) : Node is already on another list.", &s, aft, n );
     
    145145               
    146146                // pre: n->listed() & *n in *s
    147                 void remove( Sequence(T) & s, T *n ) with( s ) { // O(1)
     147                void remove( Sequence(T) & s, T * n ) with( s ) { // O(1)
    148148#ifdef __CFA_DEBUG__
    149149                        if ( ! listed( n ) ) abort( "(Sequence &)%p.remove( %p ) : Node is not on a list.", &s, n );
     
    159159
    160160                // Add an element to the head of the sequence.
    161                 void addHead( Sequence(T) & s, T *n ) {                 // pre: !n->listed(); post: n->listed() & head() == n
     161                void addHead( Sequence(T) & s, T * n ) {                // pre: !n->listed(); post: n->listed() & head() == n
    162162                        insertAft( s, 0, n );
    163163                }
    164164                // Add an element to the tail of the sequence.
    165                 void addTail( Sequence(T) & s, T *n ) {                 // pre: !n->listed(); post: n->listed() & head() == n
     165                void addTail( Sequence(T) & s, T * n ) {                // pre: !n->listed(); post: n->listed() & head() == n
    166166                        insertBef( s, n, 0 );
    167167                }
    168168                // Add an element to the tail of the sequence.
    169                 void add( Sequence(T) & s, T *n ) {                             // pre: !n->listed(); post: n->listed() & head() == n
     169                void add( Sequence(T) & s, T * n ) {                    // pre: !n->listed(); post: n->listed() & head() == n
    170170                        addTail( s, n );
    171171                }
     
    244244                        ((ColIter &) si){};
    245245                        seq = &s;
     246                        curr = head( s );
    246247                } // post: elts = null.
    247248               
     
    251252                } // post: elts = {e in s}.
    252253
    253                 bool ?>>?( SeqIter(T) & si, T *& tp ) with( si ) {
     254                bool ?>>?( SeqIter(T) & si, T && tp ) with( si ) {
    254255                        if ( curr ) {
    255                                 tp = Curr( si );
    256                                 T *n = succ( *seq, Curr( si ) );
     256                                &tp = Curr( si );
     257                                T * n = succ( *seq, Curr( si ) );
    257258                                curr = n == head( *seq ) ? 0p : n;
    258                         } else tp = 0p;
    259                         return tp != 0p;
     259                        } else &tp = 0p;
     260                        return &tp != 0p;
    260261                }
    261262        } // distribution
     
    282283                        ((ColIter &) si){};
    283284                        seq = &s;
     285                        curr = tail( s );
    284286                } // post: elts = null.
    285287               
     
    289291                } // post: elts = {e in s}.
    290292
    291                 bool ?>>?( SeqIterRev(T) & si, T *&tp ) with( si ) {
     293                bool ?>>?( SeqIterRev(T) & si, T && tp ) with( si ) {
    292294                        if ( curr ) {
    293                                 tp = Curr( si );
    294                                 T *n = pred( *seq, Curr( si ) );
     295                                &tp = Curr( si );
     296                                T * n = pred( *seq, Curr( si ) );
    295297                                curr = n == tail( *seq ) ? 0p : n;
    296                         } else tp = 0p;
    297                         return tp != 0p;
     298                        } else &tp = 0p;
     299                        return &tp != 0p;
    298300                }
    299301        } // distribution
  • libcfa/src/bits/sequence_example.cfa

    r4f0c520 r3d0560d  
    1717        Sequence(Fred) fred;
    1818        SeqIter(Fred) fredIter = { fred };
    19         Fred * f;
    20         int i;
     19        Fred & f;
    2120
    2221        sout | nlOff;                                                                           // turn off auto newline
    2322
    2423        for ( ; fredIter >> f; ) {                                                      // empty list
    25                 sout | f->i | ' ';
     24                sout | f.i | ' ';
    2625        }
    2726        sout | "empty" | nl;
    2827       
    29         for ( i = 0; i < 10; i += 1 ) {
     28        for ( i; 10 ) {
    3029                add( fred, new( 2 * i ) );
    3130        }
    3231
    33         for ( over( fredIter, fred ); fredIter >> f; ) {
    34                 sout | f->i | ' ';
     32        for ( SeqIter(Fred) iter = { fred }; iter >> f; ) {
     33                sout | f.i | ' ';
    3534        }
    3635        sout | nl;
    3736
    38         for ( i = 0; i < 9; i += 1 ) {
     37        for ( i; 9 ) {
    3938                delete( dropHead( fred ) );
    4039        }
    4140
    4241        for ( over( fredIter, fred ); fredIter >> f; ) {
    43                 sout | f->i | ' ';
     42                sout | f.i | ' ';
    4443        }
    4544        sout | nl;
    4645       
    47         for ( i = 0; i < 10; i += 1 ) {
     46        for ( i; 10 ) {
    4847                addTail( fred, new( 2 * i + 1 ) );
    4948        }
    5049        for ( over( fredIter, fred ); fredIter >> f; ) {
    51                 sout | f->i | ' ';
     50                sout | f.i | ' ';
    5251        }
    5352        sout | nl;
    5453
    55         for ( i = 0; i < 9; i += 1 ) {
    56                 delete( dropTail( fred ) );
     54        for ( i; 9 ) {
     55                delete( &dropTail( fred ) );
    5756        }
    5857        for ( over( fredIter, fred ); fredIter >> f; ) {
    59                 sout | f->i | ' ';
     58                sout | f.i | ' ';
    6059        }
    6160        sout | nl;
    6261
    6362        for ( over( fredIter, fred ); fredIter >> f; ) {
    64                 delete( f );
     63                delete( &f );
    6564        }
    6665
     
    8079        Sequence(Mary) baz;
    8180        SeqIter(Mary) maryIter = { mary };
    82         Mary * m;
     81        Mary & m;
    8382
    8483        for ( ; maryIter >> m; ) {                                                      // empty list
    85                 sout | m->i | m->j | ' ';
     84                sout | m.i | m.j | ' ';
    8685        }
    8786        sout | "empty" | nl;
    8887       
    89         for ( i = 0; i < 10; i += 1 ) {
     88        for ( i; 10 ) {
    9089                add( mary, new( 2 * i ) );
    9190                add( baz, new( 2 * i ) );
    9291        }
    9392
    94         for ( over( maryIter, mary ); maryIter >> m; ) {
    95                 sout | m->i | m->j | ' ';
     93        for ( SeqIter(Mary) iter = { mary }; iter >> m; ) {
     94                sout | m.i | m.j | ' ';
    9695        }
    9796        sout | nl;
    9897       
    99         for ( i = 0; i < 9; i += 1 ) {
     98        for ( i; 9 ) {
    10099                delete( dropHead( mary ) );
    101100        }
    102101
    103102        for ( over( maryIter, mary ); maryIter >> m; ) {
    104                 sout | m->i | m->j | ' ';
     103                sout | m.i | m.j | ' ';
    105104        }
    106105        sout | nl;
    107106       
    108         for ( i = 0; i < 10; i += 1 ) {
     107        for ( i; 10 ) {
    109108                addTail( mary, new( 2 * i + 1 ) );
    110109        }
    111110        for ( over( maryIter, mary ); maryIter >> m; ) {
    112                 sout | m->i | m->j | ' ';
     111                sout | m.i | m.j | ' ';
    113112        }
    114113        sout | nl;
    115114
    116         for ( i = 0; i < 9; i += 1 ) {
    117                 delete( dropTail( mary ) );
     115        for ( i; 9 ) {
     116                delete( &dropTail( mary ) );
    118117        }
    119118        for ( over( maryIter, mary ); maryIter >> m; ) {
    120                 sout | m->i | m->j | ' ';
     119                sout | m.i | m.j | ' ';
    121120        }
    122121        sout | nl;
     
    125124
    126125        for ( over( maryIter, baz ); maryIter >> m; ) {
    127                 sout | m->i | m->j | ' ';
     126                sout | m.i | m.j | ' ';
    128127        }
    129128        sout | "empty" | nl;
    130129
    131130        for ( over( maryIter, mary ); maryIter >> m; ) {
    132                 sout | m->i | m->j | ' ';
     131                sout | m.i | m.j | ' ';
    133132        }
    134133        sout | nl;
    135134
    136135        for ( over( maryIter, mary ); maryIter >> m; ) {
    137                 delete( m );
     136                delete( &m );
    138137        }
    139138}
    140139
    141140// Local Variables: //
    142 // compile-command: "cfa sequence_example.cc" //
     141// compile-command: "cfa sequence_example.cfa" //
    143142// End: //
  • libcfa/src/bits/stack.hfa

    r4f0c520 r3d0560d  
    9999                } // post: curr = {e in s}
    100100
    101                 bool ?>>?( StackIter(T) & si, T *& tp ) with( si ) {
     101                bool ?>>?( StackIter(T) & si, T && tp ) with( si ) {
    102102                        if ( curr ) {
    103                                 tp = Curr( si );
     103                                &tp = Curr( si );
    104104                                T * n = Next( Curr( si ) );
    105105                                curr = (n == Curr( si ) ) ? 0p : n;
    106                         } else tp = 0p;
    107                         return tp != 0p;
     106                        } else &tp = 0p;
     107                        return &tp != 0p;
    108108                }
    109109        } // distribution
  • libcfa/src/bits/stack_example.cfa

    r4f0c520 r3d0560d  
    1717        Stack(Fred) fred;
    1818        StackIter(Fred) fredIter = { fred };
    19         Fred * f;
    20         int i;
     19        Fred & f;
    2120
    2221        sout | nlOff;                                                                           // turn off auto newline
    2322
    2423        for ( ; fredIter >> f; ) {                                                      // empty list
    25                 sout | f->i | ' ';
     24                sout | f.i | ' ';
    2625        }
    2726        sout | "empty" | nl;
    2827       
    29         for ( i = 0; i < 10; i += 1 ) {
     28        for ( i; 10 ) {
    3029                push( fred, new( 2 * i ) );
    3130        }
    3231
    33         for ( over( fredIter, fred ); fredIter >> f; ) {
    34                 sout | f->i | ' ';
     32        for ( StackIter(Fred) iter = { fred }; iter >> f; ) {
     33                sout | f.i | ' ';
    3534        }
    3635        sout | nl;
    3736       
    38         for ( i = 0; i < 9; i += 1 ) {
     37        for ( i; 9 ) {
    3938                delete( pop( fred ) );
    4039        }
    4140
    4241        for ( over( fredIter, fred ); fredIter >> f; ) {
    43                 sout | f->i | ' ';
     42                sout | f.i | ' ';
    4443        }
    4544        sout | nl;
    4645       
    47         for ( i = 0; i < 10; i += 1 ) {
     46        for ( i; 10 ) {
    4847                push( fred, new( 2 * i + 1 ) );
    4948        }
    5049        for ( over( fredIter, fred ); fredIter >> f; ) {
    51                 sout | f->i | ' ';
     50                sout | f.i | ' ';
    5251        }
    5352        sout | nl;
    5453
    5554        for ( over( fredIter, fred ); fredIter >> f; ) {
    56                 delete( f );
     55                delete( &f );
    5756        }
    5857
     
    7170        Stack(Mary) mary;
    7271        StackIter(Mary) maryIter = { mary };
    73         Mary * m;
     72        Mary & m;
    7473
    7574        for ( ; maryIter >> m; ) {                                                      // empty list
    76                 sout | m->i | m->j | ' ';
     75                sout | m.i | m.j | ' ';
    7776        }
    7877        sout | "empty" | nl;
    7978       
    80         for ( i = 0; i < 10; i += 1 ) {
     79        for ( i; 10 ) {
    8180                push( mary, new( 2 * i ) );
    8281        }
    8382
    84         for ( over( maryIter, mary ); maryIter >> m; ) {
    85                 sout | m->i | m->j | ' ';
     83        for ( StackIter(Mary) iter = { mary }; iter >> m; ) {
     84                sout | m.i | m.j | ' ';
    8685        }
    8786        sout | nl;
    8887       
    89         for ( i = 0; i < 9; i += 1 ) {
     88        for ( i; 9 ) {
    9089                delete( pop( mary ) );
    9190        }
    9291
    9392        for ( over( maryIter, mary ); maryIter >> m; ) {
    94                 sout | m->i | m->j | ' ';
     93                sout | m.i | m.j | ' ';
    9594        }
    9695        sout | nl;
    9796       
    98         for ( i = 0; i < 10; i += 1 ) {
     97        for ( i; 10 ) {
    9998                push( mary, new( 2 * i + 1 ) );
    10099        }
    101100        for ( over( maryIter, mary ); maryIter >> m; ) {
    102                 sout | m->i | m->j | ' ';
     101                sout | m.i | m.j | ' ';
    103102        }
    104103        sout | nl;
    105104
    106105        for ( over( maryIter, mary ); maryIter >> m; ) {
    107                 delete( m );
     106                delete( &m );
    108107        }
    109108}
Note: See TracChangeset for help on using the changeset viewer.