Changeset b37515b


Ignore:
Timestamp:
Dec 2, 2020, 3:30:53 PM (4 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:
cd6a6ff
Parents:
ddcedfe
Message:

start converting from pointer to reference parameters/returns across the containers

Location:
libcfa/src/bits
Files:
2 edited

Legend:

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

    rddcedfe rb37515b  
    6262
    6363                // Return a pointer to the last sequence element, without removing it. 
    64                 T * tail( Sequence(T) & s ) with( s ) {
    65                         return root ? (T *)Back( Root( s ) ) : 0p;      // needs cast?
     64                T & tail( Sequence(T) & s ) with( s ) {
     65                        return root ? (T &)Back( Root( s ) ) : *0p;     // needs cast?
    6666                }       // post: empty() & tail() == 0 | !empty() & tail() in *s
    6767
     
    8484
    8585                // Insert *n into the sequence before *bef, or at the end if bef == 0.
    86                 void insertBef( Sequence(T) & s, T * n, T * bef ) with( s ) { // pre: !n->listed() & *bef in *s
    87 #ifdef __CFA_DEBUG__
    88                         if ( listed( n ) ) abort( "(Sequence &)%p.insertBef( %p, %p ) : Node is already on another list.", &s, n, bef );
    89 #endif // __CFA_DEBUG__
    90                         if ( bef == Root( s ) ) {                                       // must change root
     86                void insertBef( Sequence(T) & s, T & n, T & bef ) with( s ) { // pre: !n->listed() & *bef in *s
     87#ifdef __CFA_DEBUG__
     88                        if ( listed( &n ) ) abort( "(Sequence &)%p.insertBef( %p, %p ) : Node is already on another list.", &s, n, &bef );
     89#endif // __CFA_DEBUG__
     90                        if ( &bef == Root( s ) ) {                                      // must change root
    9191                                if ( root ) {
    92                                         Next( n ) = Root( s );
    93                                         Back( n ) = Back( Root( s ) );
     92                                        Next( &n ) = Root( s );
     93                                        Back( &n ) = Back( Root( s ) );
    9494                                        // inserted node must be consistent before it is seen
    9595                                        asm( "" : : : "memory" );                       // prevent code movement across barrier
    96                                         Back( Root( s ) ) = n;
    97                                         Next( Back( n ) ) = n;
     96                                        Back( Root( s ) ) = &n;
     97                                        Next( Back( &n ) ) = &n;
    9898                                } else {
    99                                         Next( n ) = n;
    100                                         Back( n ) = n;
     99                                        Next( &n ) = &n;
     100                                        Back( &n ) = &n;
    101101                                } // if
    102102                                // inserted node must be consistent before it is seen
    103103                                asm( "" : : : "memory" );                               // prevent code movement across barrier
    104                                 root = n;
     104                                root = &n;
    105105                        } else {
    106                                 if ( ! bef ) bef = Root( s );
    107                                 Next( n ) = bef;
    108                                 Back( n ) = Back( bef );
     106                                if ( ! &bef ) &bef = Root( s );
     107                                Next( &n ) = &bef;
     108                                Back( &n ) = Back( &bef );
    109109                                // inserted node must be consistent before it is seen
    110110                                asm( "" : : : "memory" );                               // prevent code movement across barrier
    111                                 Back( bef ) = n;
    112                                 Next( Back( n ) ) = n;
     111                                Back( &bef ) = &n;
     112                                Next( Back( &n ) ) = &n;
    113113                        } // if
    114114                }       // post: n->listed() & *n in *s & succ(n) == bef
     
    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
    119 #ifdef __CFA_DEBUG__
    120                         if ( listed( n ) ) abort( "(Sequence &)%p.insertAft( %p, %p ) : Node is already on another list.", &s, aft, n );
    121 #endif // __CFA_DEBUG__
    122                         if ( ! aft ) {                                                          // must change root
     118                void insertAft( Sequence(T) & s, T & aft, T & n ) with( s ) {   // pre: !n->listed() & *aft in *s
     119#ifdef __CFA_DEBUG__
     120                        if ( listed( &n ) ) abort( "(Sequence &)%p.insertAft( %p, %p ) : Node is already on another list.", &s, &aft, &n );
     121#endif // __CFA_DEBUG__
     122                        if ( ! &aft ) {                                                         // must change root
    123123                                if ( root ) {
    124                                         Next( n ) = Root( s );
    125                                         Back( n ) = Back( Root( s ) );
     124                                        Next( &n ) = Root( s );
     125                                        Back( &n ) = Back( Root( s ) );
    126126                                        // inserted node must be consistent before it is seen
    127127                                        asm( "" : : : "memory" );                       // prevent code movement across barrier
    128                                         Back( Root( s ) ) = n;
    129                                         Next( Back( n ) ) = n;
     128                                        Back( Root( s ) ) = &n;
     129                                        Next( Back( &n ) ) = &n;
    130130                                } else {
    131                                         Next( n ) = n;
    132                                         Back( n ) = n;
     131                                        Next( &n ) = &n;
     132                                        Back( &n ) = &n;
    133133                                } // if
    134134                                asm( "" : : : "memory" );                               // prevent code movement across barrier
    135                                 root = n;
     135                                root = &n;
    136136                        } else {
    137                                 Next( n ) = Next( aft );
    138                                 Back( n ) = aft;
     137                                Next( &n ) = Next( &aft );
     138                                Back( &n ) = &aft;
    139139                                // inserted node must be consistent before it is seen
    140140                                asm( "" : : : "memory" );                               // prevent code movement across barrier
    141                                 Back( Next( n ) ) = n;
    142                                 Next( aft ) = n;
     141                                Back( Next( &n ) ) = &n;
     142                                Next( &aft ) = &n;
    143143                        } // if
    144144                }         // post: n->listed() & *n in *s & succ(n) == bef
    145145               
    146146                // pre: n->listed() & *n in *s
    147                 void remove( Sequence(T) & s, T * n ) with( s ) { // O(1)
    148 #ifdef __CFA_DEBUG__
    149                         if ( ! listed( n ) ) abort( "(Sequence &)%p.remove( %p ) : Node is not on a list.", &s, n );
    150 #endif // __CFA_DEBUG__
    151                         if ( n == Root( s ) ) {
     147                void remove( Sequence(T) & s, T & n ) with( s ) { // O(1)
     148#ifdef __CFA_DEBUG__
     149                        if ( ! listed( &n ) ) abort( "(Sequence &)%p.remove( %p ) : Node is not on a list.", &s, &n );
     150#endif // __CFA_DEBUG__
     151                        if ( &n == Root( s ) ) {
    152152                                if ( Next( Root( s ) ) == Root( s ) ) root = 0p;
    153153                                else root = Next( Root(s ) );
    154154                        } // if
    155                         Back( Next( n ) ) = Back( n );
    156                         Next( Back( n ) ) = Next( n );
    157                         Next( n ) = Back( n ) = 0p;
     155                        Back( Next( &n ) ) = Back( &n );
     156                        Next( Back( &n ) ) = Next( &n );
     157                        Next( &n ) = Back( &n ) = 0p;
    158158                }                                                       // post: !n->listed().
    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
    162                         insertAft( s, 0, n );
     161                void addHead( Sequence(T) & s, T & n ) {                // pre: !n->listed(); post: n->listed() & head() == n
     162                        insertAft( s, *0p, 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
    166                         insertBef( s, n, 0 );
     165                void addTail( Sequence(T) & s, T & n ) {                // pre: !n->listed(); post: n->listed() & head() == n
     166                        insertBef( s, n, *0p );
    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                }
    172172                // Remove and return the head element in the sequence.
    173                 T * dropHead( Sequence(T) & s ) {
     173                T & dropHead( Sequence(T) & s ) {
    174174                        T * n = head( s );
    175                         return n ? remove( s, n ), n : 0p;
     175                        return n ? remove( s, *n ), *n : *0p;
    176176                }
    177177                // Remove and return the head element in the sequence.
    178                 T * drop( Sequence(T) & s ) {
     178                T & drop( Sequence(T) & s ) {
    179179                        return dropHead( s );
    180180                }
    181181                // Remove and return the tail element in the sequence.
    182                 T * dropTail( Sequence(T) & s ) {
    183                         T * n = tail( s );
    184                         return n ? remove( s, n ), n : 0p;
     182                T & dropTail( Sequence(T) & s ) {
     183                        T & n = tail( s );
     184                        return &n ? remove( s, n ), n : *0p;
    185185                }
    186186
     
    283283                        ((ColIter &) si){};
    284284                        seq = &s;
    285                         curr = tail( s );
     285                        curr = &tail( s );
    286286                } // post: elts = null.
    287287               
    288288                void over( SeqIterRev(T) & si, Sequence(T) & s ) with( si ) {
    289289                        seq = &s;
    290                         curr = tail( s );
     290                        curr = &tail( s );
    291291                } // post: elts = {e in s}.
    292292
     
    295295                                &tp = Curr( si );
    296296                                T * n = pred( *seq, Curr( si ) );
    297                                 curr = n == tail( *seq ) ? 0p : n;
     297                                curr = n == &tail( *seq ) ? 0p : n;
    298298                        } else &tp = 0p;
    299299                        return &tp != 0p;
  • libcfa/src/bits/sequence_example.cfa

    rddcedfe rb37515b  
    2727       
    2828        for ( i; 10 ) {
    29                 add( fred, new( 2 * i ) );
     29                add( fred, *new( 2 * i ) );
    3030        }
    3131
     
    3636
    3737        for ( i; 9 ) {
    38                 delete( dropHead( fred ) );
     38                delete( &dropHead( fred ) );
    3939        }
    4040
     
    4545       
    4646        for ( i; 10 ) {
    47                 addTail( fred, new( 2 * i + 1 ) );
     47                addTail( fred, *new( 2 * i + 1 ) );
    4848        }
    4949        for ( over( fredIter, fred ); fredIter >> f; ) {
     
    8787       
    8888        for ( i; 10 ) {
    89                 add( mary, new( 2 * i ) );
    90                 add( baz, new( 2 * i ) );
     89                add( mary, *new( 2 * i ) );
     90                add( baz, *new( 2 * i ) );
    9191        }
    9292
     
    9797       
    9898        for ( i; 9 ) {
    99                 delete( dropHead( mary ) );
     99                delete( &dropHead( mary ) );
    100100        }
    101101
     
    106106       
    107107        for ( i; 10 ) {
    108                 addTail( mary, new( 2 * i + 1 ) );
     108                addTail( mary, *new( 2 * i + 1 ) );
    109109        }
    110110        for ( over( maryIter, mary ); maryIter >> m; ) {
Note: See TracChangeset for help on using the changeset viewer.