source: libcfa/src/bits/stack.hfa @ 19de7864

arm-ehjacob/cs343-translationnew-ast-unique-expr
Last change on this file since 19de7864 was 19de7864, checked in by Colby Alexander Parsons <caparsons@…>, 10 months ago

removed listed requirement for collections since it was redundant

  • Property mode set to 100644
File size: 2.2 KB
Line 
1#pragma once
2
3#include "bits/collection.hfa"
4
5forall( dtype T | { T *& Next ( T * ); } ) {
6        struct Stack {
7                inline Collection;                                                              // Plan 9 inheritance
8        };
9
10        inline {
11                // wrappers to make Collection have T
12                T & head( Stack(T) & s ) with( s ) {
13                        return *(T *)head( (Collection &)s );
14                } // post: empty() & head() == 0 | !empty() & head() in *this
15
16                void ?{}( Stack(T) &, const Stack(T) & ) = void; // no copy
17                Stack(T) & ?=?( const Stack(T) & ) = void;              // no assignment
18
19                void ?{}( Stack(T) & s ) with( s ) {
20                        ((Collection &)s){};
21                } // post: empty()
22
23                T & top( Stack(T) & s ) with( s ) {
24                        return head( s );
25                }
26
27                void addHead( Stack(T) & s, T & n ) with( s ) {
28                        #ifdef __CFA_DEBUG__
29                        if ( listed( (Colable &)(n) ) ) abort( "(Stack &)%p.addHead( %p ) : Node is already on another list.", &s, n );
30                        #endif // __CFA_DEBUG__
31                        Next( &n ) = &head( s ) ? &head( s ) : &n;
32                        root = &n;
33                }
34
35                void add( Stack(T) & s, T & n ) with( s ) {
36                        addHead( s, n );
37                }
38
39                void push( Stack(T) & s, T & n ) with( s ) {
40                        addHead( s, n );
41                }
42
43                T & drop( Stack(T) & s ) with( s ) {
44                        T & t = head( s );
45                        if ( root ) {
46                                root = ( T *)Next( (T *)root );
47                                if ( &head( s ) == &t ) root = 0p;              // only one element ?
48                                Next( &t ) = 0p;
49                        } // if
50                        return t;
51                }
52
53                T & pop( Stack(T) & s ) with( s ) {
54                        return drop( s );
55                }
56        } // distribution
57} // distribution
58
59
60forall( dtype T | { T *& Next ( T * ); } ) {
61        struct StackIter {
62                inline ColIter;                                                                 // Plan 9 inheritance
63        };     
64
65        inline {
66                void ?{}( StackIter(T) & si ) with( si ) {
67                        ((ColIter &)si){};
68                } // post: curr == 0p
69
70                // create an iterator active in Stack s
71                void ?{}( StackIter(T) & si, Stack(T) & s ) with( si ) {
72                        curr = &head( s );
73                } // post: curr = {e in s}
74
75                void ?{}( StackIter(T) & si, T & start ) with( si ) {
76                        curr = &start;
77                } // post: curr = {e in s}
78
79                // make existing iterator active in Stack q
80                void over( StackIter(T) & si, Stack(T) & s ) with( si ) {
81                        curr = &head( s );
82                } // post: curr = {e in s}
83
84                bool ?>>?( StackIter(T) & si, T && tp ) with( si ) {
85                        if ( curr ) {
86                                &tp = Curr( si );
87                                T * n = Next( Curr( si ) );
88                                curr = n == Curr( si ) ? 0p : n;
89                        } else &tp = 0p;
90                        return &tp != 0p;
91                }
92        } // distribution
93} // distribution
Note: See TracBrowser for help on using the repository browser.