source: doc/papers/general/evaluation/cfa-stack.c @ 1803d4d

ast-experimental
Last change on this file since 1803d4d was 4c80a75, checked in by Peter A. Buhr <pabuhr@…>, 7 years ago

update evaluation programs

  • Property mode set to 100644
File size: 1013 bytes
Line 
1#include <stdlib>
2#include "cfa-stack.h"
3
4forall( 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.