1 // Copyright (C) 2009 Free Software Foundation, Inc.
2 // Contributed by Jan Sjodin <jan.sjodin@amd.com>.
4 // This file is part of the Polyhedral Compilation Package Library (libpcp).
6 // Libpcp is free software; you can redistribute it and/or modify it
7 // under the terms of the GNU Lesser General Public License as published by
8 // the Free Software Foundation; either version 2.1 of the License, or
9 // (at your option) any later version.
11 // Libpcp is distributed in the hope that it will be useful, but WITHOUT ANY
12 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
16 // You should have received a copy of the GNU Lesser General Public License
17 // along with libpcp; see the file COPYING.LIB. If not, write to the
18 // Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 // MA 02110-1301, USA.
21 // As a special exception, if you link this library with other files, some
22 // of which are compiled with GCC, to produce an executable, this library
23 // does not by itself cause the resulting executable to be covered by the
24 // GNU General Public License. This exception does not however invalidate
25 // any other reasons why the executable file might be covered by the GNU
26 // General Public License.
30 #include "pcp_alloc.h"
32 template <typename Value
> class PcpStack
35 virtual void push(Value v
) = 0;
36 virtual Value
pop() = 0;
37 virtual Value
peek(int index
) = 0;
38 virtual int getSize() = 0;
42 // Simple implementation of a stack using a list.
43 // Assumptions: operators '=' available
45 template <typename Value
> class PcpListStack
46 : public PcpStack
<Value
>
56 void setFirst(Value value
)
66 void setRest(Entry
* left
)
77 Entry(Value value
, Entry
* rest
)
86 void setStack(Entry
* stack
)
98 virtual void push(Value value
)
100 this->setStack(new Entry(value
, this->getStack()));
105 Entry
* oldEntry
= this->getStack();
106 Value result
= oldEntry
->getFirst();
107 setStack(oldEntry
->getRest());
112 virtual Value
peek(int depth
)
114 Entry
* current
= this->getStack();
115 while(current
!= NULL
)
118 return current
->getFirst();
122 current
= current
->getRest();
128 virtual int getSize()
131 Entry
* current
= this->getStack();
132 while(current
!= NULL
)
135 current
= current
->getRest();
146 #endif // _PCP_STACK_