ADT
        arm-eh
        ast-experimental
        enum
        forall-pointer-decay
        jacob/cs343-translation
        new-ast-unique-expr
        pthread-emulation
        qualifiedEnum
      
      
        
          | 
            Last change
 on this file since aaa1c4cc was             4c80a75, checked in by Peter A. Buhr <pabuhr@…>, 8 years ago           | 
        
        
          | 
             
update evaluation programs 
 
           | 
        
        
          
            
              - 
Property                 mode
 set to                 
100644
               
             
           | 
        
        
          | 
            File size:
            1013 bytes
           | 
        
      
      
| Line |   | 
|---|
| 1 | #include <stdlib>
 | 
|---|
| 2 | #include "cfa-stack.h"
 | 
|---|
| 3 | 
 | 
|---|
| 4 | forall( otype T ) {
 | 
|---|
| 5 |         struct node {
 | 
|---|
| 6 |                 T value;
 | 
|---|
| 7 |                 node(T) * next;
 | 
|---|
| 8 |         };
 | 
|---|
| 9 | 
 | 
|---|
| 10 |         void ?{}( stack(T) & s, stack(T) t ) {          // copy
 | 
|---|
| 11 |                 node(T) ** cr = &s.head;
 | 
|---|
| 12 |                 for ( node(T) * nx = t.head; nx; nx = nx->next ) {
 | 
|---|
| 13 |                         *cr = alloc();
 | 
|---|
| 14 |                         ((*cr)->value){ nx->value };
 | 
|---|
| 15 |                         cr = &(*cr)->next;
 | 
|---|
| 16 |                 }
 | 
|---|
| 17 |                 *cr = 0;
 | 
|---|
| 18 |         }
 | 
|---|
| 19 | 
 | 
|---|
| 20 |         void clear( stack(T) & s ) with( s ) {
 | 
|---|
| 21 |                 for ( node(T) * nx = head; nx; ) {
 | 
|---|
| 22 |                         node(T) * cr = nx;
 | 
|---|
| 23 |                         nx = cr->next;
 | 
|---|
| 24 |                         ^(*cr){};
 | 
|---|
| 25 |                         free( cr );
 | 
|---|
| 26 |                 }
 | 
|---|
| 27 |                 head = 0;
 | 
|---|
| 28 |         }
 | 
|---|
| 29 | 
 | 
|---|
| 30 |         void ?{}( stack(T) & s ) { (s.head){ 0 }; }
 | 
|---|
| 31 |         void ^?{}( stack(T) & s) { clear( s ); }
 | 
|---|
| 32 | 
 | 
|---|
| 33 |         stack(T) ?=?( stack(T) & s, stack(T) t ) {
 | 
|---|
| 34 |                 if ( s.head == t.head ) return s;
 | 
|---|
| 35 |                 clear( s );
 | 
|---|
| 36 |                 s{ t };
 | 
|---|
| 37 |                 return s;
 | 
|---|
| 38 |         }
 | 
|---|
| 39 | 
 | 
|---|
| 40 |         _Bool empty( const stack(T) & s ) {
 | 
|---|
| 41 |                 return s.head == 0;
 | 
|---|
| 42 |         }
 | 
|---|
| 43 | 
 | 
|---|
| 44 |         void push( stack(T) & s, T value ) with( s ) {
 | 
|---|
| 45 |                 node(T) * n = alloc();
 | 
|---|
| 46 |                 (*n){ value, head };
 | 
|---|
| 47 |                 head = n;
 | 
|---|
| 48 |         }
 | 
|---|
| 49 | 
 | 
|---|
| 50 |         T pop( stack(T) & s ) with( s ) {
 | 
|---|
| 51 |                 node(T) * n = head;
 | 
|---|
| 52 |                 head = n->next;
 | 
|---|
| 53 |                 T v = n->value;
 | 
|---|
| 54 |                 ^(*n){};
 | 
|---|
| 55 |                 free( n );
 | 
|---|
| 56 |                 return v;
 | 
|---|
| 57 |         }
 | 
|---|
| 58 | }
 | 
|---|
       
      
  Note:
 See   
TracBrowser
 for help on using the repository browser.