source: libcfa/src/bits/stack.hfa @ 62a7cc0

ADTarm-ehast-experimentalenumforall-pointer-decayjacob/cs343-translationnew-ast-unique-exprpthread-emulationqualifiedEnum
Last change on this file since 62a7cc0 was a3a76ea, checked in by Peter A. Buhr <pabuhr@…>, 3 years ago

modify routines to return added/removed node to allow cascading calls

  • 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                T & 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                        return n;
34                }
35
36                T & add( Stack(T) & s, T & n ) with( s ) {
37                        return addHead( s, n );
38                }
39
40                T & push( Stack(T) & s, T & n ) with( s ) {
41                        return addHead( s, n );
42                }
43
44                T & drop( Stack(T) & s ) with( s ) {
45                        T & t = head( s );
46                        if ( root ) {
47                                root = ( T *)Next( (T *)root );
48                                if ( &head( s ) == &t ) root = 0p;              // only one element ?
49                                Next( &t ) = 0p;
50                        } // if
51                        return t;
52                }
53
54                T & pop( Stack(T) & s ) with( s ) {
55                        return drop( s );
56                }
57        } // distribution
58} // distribution
59
60
61forall( dtype T | { T *& Next ( T * ); } ) {
62        struct StackIter {
63                inline ColIter;                                                                 // Plan 9 inheritance
64        };     
65
66        inline {
67                void ?{}( StackIter(T) & si ) with( si ) {
68                        ((ColIter &)si){};
69                } // post: curr == 0p
70
71                // create an iterator active in Stack s
72                void ?{}( StackIter(T) & si, Stack(T) & s ) with( si ) {
73                        curr = &head( s );
74                } // post: curr = {e in s}
75
76                void ?{}( StackIter(T) & si, T & start ) with( si ) {
77                        curr = &start;
78                } // post: curr = {e in s}
79
80                // make existing iterator active in Stack q
81                void over( StackIter(T) & si, Stack(T) & s ) with( si ) {
82                        curr = &head( s );
83                } // post: curr = {e in s}
84
85                bool ?>>?( StackIter(T) & si, T && tp ) with( si ) {
86                        if ( curr ) {
87                                &tp = Curr( si );
88                                T * n = Next( Curr( si ) );
89                                curr = n == Curr( si ) ? 0p : n;
90                        } else &tp = 0p;
91                        return &tp != 0p;
92                }
93        } // distribution
94} // distribution
Note: See TracBrowser for help on using the repository browser.