#ifndef BLISS_KSTACK_H
#define BLISS_KSTACK_H
#include <cstdlib>
#include "bliss/defs.hh"
namespace bliss {
template <class Type>
class KStack {
public:
KStack();
KStack(int N);
~KStack();
void init(int N);
bool is_empty() const {return(cursor == entries); }
Type top() const {BLISS_ASSERT(cursor > entries); return *cursor; }
Type pop()
{
return *cursor--;
}
void push(Type e)
{
*(++cursor) = e;
}
void clean() {cursor = entries; }
unsigned int size() const {return(cursor - entries); }
Type element_at(unsigned int i)
{
assert(i < size());
return entries[i+1];
}
int capacity() {return kapacity; }
private:
int kapacity;
Type *entries;
Type *cursor;
};
template <class Type>
KStack<Type>::KStack()
{
kapacity = 0;
entries = 0;
cursor = 0;
}
template <class Type>
KStack<Type>::KStack(int k)
{
assert(k > 0);
kapacity = k;
entries = (Type*)malloc((k+1) * sizeof(Type));
cursor = entries;
}
template <class Type>
void KStack<Type>::init(int k)
{
assert(k > 0);
if(entries)
free(entries);
kapacity = k;
entries = (Type*)malloc((k+1) * sizeof(Type));
cursor = entries;
}
template <class Type>
KStack<Type>::~KStack()
{
free(entries);
}
}
#endif