Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/papers/general/evaluation/cfa-stack.c

    rac4dad2 r81e8ab0  
    22#include "cfa-stack.h"
    33
    4 forall( otype T ) {
    5         struct node {
    6                 T value;
    7                 node(T) * next;
    8         };
     4forall( otype T ) struct stack_node {
     5        T value;
     6        stack_node(T) * next;
     7};
    98
    10         void ?{}( stack(T) & s ) { (s.head){ 0 }; }
     9forall( otype T ) void ?{}( stack(T) & s ) { (s.head){ 0 }; }
    1110
    12         void ?{}( stack(T) & s, stack(T) t ) {
    13                 node(T) ** cr = &s.head;
    14                 for ( node(T) * nx = t.head; nx; nx = nx->next ) {
    15                         *cr = alloc();
    16                         ((*cr)->value){ nx->value };
    17                         cr = &(*cr)->next;
    18                 }
    19                 *cr = 0;
     11forall( otype T ) void ?{}( stack(T) & s, stack(T) t ) {
     12        stack_node(T) ** crnt = &s.head;
     13        for ( stack_node(T) * next = t.head; next; next = next->next ) {
     14                *crnt = alloc();
     15                ((*crnt)->value){ next->value };
     16                crnt = &(*crnt)->next;
    2017        }
     18        *crnt = 0;
     19}
    2120
    22         void ^?{}( stack(T) & s) { clear( s ); }
     21forall( otype T ) void clear( stack(T) & s ) with( s ) {
     22        for ( stack_node(T) * next = head; next; ) {
     23                stack_node(T) * crnt = next;
     24                next = crnt->next;
     25                ^(*crnt){};
     26                free(crnt);
     27        }
     28        head = 0;
     29}
    2330
    24     void clear( stack(T) & s ) with( s ) {
    25                 for ( node(T) * nx = head; nx; ) {
    26                         node(T) * cr = nx;
    27                         nx = cr->next;
    28                         ^(*cr){};
    29                         free(cr);
    30                 }
    31                 head = 0;
    32         }
     31forall( otype T ) stack(T) ?=?( stack(T) & s, stack(T) t ) {
     32        if ( s.head == t.head ) return s;
     33        clear( s );
     34        s{ t };
     35        return s;
     36}
    3337
    34         stack(T) ?=?( stack(T) & s, stack(T) t ) {
    35                 if ( s.head == t.head ) return s;
    36                 clear( s );
    37                 s{ t };
    38                 return s;
    39         }
     38forall( otype T ) void ^?{}( stack(T) & s) { clear( s ); }
    4039
    41         _Bool empty( const stack(T) & s ) { return s.head == 0; }
     40forall( otype T ) _Bool empty( const stack(T) & s ) { return s.head == 0; }
    4241
    43         void push( stack(T) & s, T value ) with( s ) {
    44                 node(T) * n = alloc();
    45                 (*n){ value, head };
    46                 head = n;
    47         }
     42forall( otype T ) void push( stack(T) & s, T value ) with( s ) {
     43        stack_node(T) * n = alloc();
     44        (*n){ value, head };
     45        head = n;
     46}
    4847
    49         T pop( stack(T) & s ) with( s ) {
    50                 node(T) * n = head;
    51                 head = n->next;
    52                 T v = n->value;
    53                 ^(*n){};
    54                 free( n );
    55                 return v;
    56         }
     48forall( otype T ) T pop( stack(T) & s ) with( s ) {
     49        stack_node(T) * n = head;
     50        head = n->next;
     51        T v = n->value;
     52        ^(*n){};
     53        free( n );
     54        return v;
    5755}
Note: See TracChangeset for help on using the changeset viewer.