source: libcfa/src/bits/stack.hfa @ a78c3ff

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

more code sharing in containers

  • Property mode set to 100644
File size: 2.2 KB
Line 
1#pragma once
2
3#include "collection.hfa"
4
5forall( dtype 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(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 ) {
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
94
95// Local Variables: //
96// compile-command: "make install" //
97// End: //
Note: See TracBrowser for help on using the repository browser.