//  $Id: Stack.hh,v 1.1.1.1 2000/03/10 16:32:16 engin Exp $
//
//  Copyright (c) 1994 by the University of Southern California
//  All rights reserved.
//
//  Permission to use, copy, modify, and distribute this software and its
//  documentation in source and binary forms for lawful non-commercial
//  purposes and without fee is hereby granted, provided that the above
//  copyright notice appear in all copies and that both the copyright
//  notice and this permission notice appear in supporting documentation,
//  and that any documentation, advertising materials, and other materials
//  related to such distribution and use acknowledge that the software was
//  developed by the University of Southern California, Information
//  Sciences Institute. The name of the USC may not be used to endorse or
//  promote products derived from this software without specific prior
//  written permission.
//
//  THE UNIVERSITY OF SOUTHERN CALIFORNIA DOES NOT MAKE ANY
//  REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR ANY
//  PURPOSE.  THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
//  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
//  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
//  TITLE, AND NON-INFRINGEMENT.
//
//  IN NO EVENT SHALL USC, OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY
//  SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES, WHETHER IN CONTRACT, TORT,
//  OR OTHER FORM OF ACTION, ARISING OUT OF OR IN CONNECTION WITH, THE USE
//  OR PERFORMANCE OF THIS SOFTWARE.
//
//  Questions concerning this software should be directed to 
//  ratoolset@isi.edu.
//
//  Author(s): Cengiz Alaettinoglu <cengiz@ISI.EDU>

#ifndef STACK_H
#define STACK_H

#include "config.h"

// the following queue and stack implementations assume that they never overflow
// use with caution!

#include <cassert>

template <class TYPE>
class BoundedQueue {
private:
   BoundedQueue(BoundedQueue& a);

public:
   BoundedQueue(int size) {
      q = new TYPE[size]; 
      first = 0;
      last = 0;
      BoundedQueue::size = size;
   }
   ~BoundedQueue() {
      delete [] q; 
   }

   void enq(TYPE elt) { 
      assert(last < size);
      q[last++] = elt; 
   }
   TYPE deq() { return (q[first++]); }
   int empty() { return (first == last); }
   void clear() {
      first = 0;
      last = 0;
   }

protected:
   TYPE *q; 
   int first;
   int last;
   int size;
};

template <class TYPE>
class BoundedStack : BoundedQueue<TYPE> {
public:
   BoundedStack(int size) : BoundedQueue<TYPE>(size) {}
   void push(TYPE elt) { enq(elt); }
   TYPE pop() { return q[--last]; }
   int getPosition() { return last; }
   void setPosition(int pos) { last = pos; }
   void clear() {
      BoundedQueue<TYPE>::clear();
   }
};

#endif   // STACK_H
