- File:
-
- 1 edited
-
doc/papers/general/evaluation/cfa-stack.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
doc/papers/general/evaluation/cfa-stack.c
r81e8ab0 r4c80a75 2 2 #include "cfa-stack.h" 3 3 4 forall( otype T ) struct stack_node { 5 T value; 6 stack_node(T) * next; 7 }; 4 forall( otype T ) { 5 struct node { 6 T value; 7 node(T) * next; 8 }; 8 9 9 forall( otype T ) void ?{}( stack(T) & s ) { (s.head){ 0 }; } 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 } 10 19 11 forall( 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; 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; 17 28 } 18 *crnt = 0; 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 } 19 58 } 20 21 forall( 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 }30 31 forall( 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 }37 38 forall( otype T ) void ^?{}( stack(T) & s) { clear( s ); }39 40 forall( otype T ) _Bool empty( const stack(T) & s ) { return s.head == 0; }41 42 forall( 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 }47 48 forall( 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;55 }
Note:
See TracChangeset
for help on using the changeset viewer.