source: libcfa/src/bits/stack.hfa@ 1e6f632f

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since 1e6f632f was a3a76ea, checked in by Peter A. Buhr <pabuhr@…>, 5 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.