#ifndef __STACK_H
#define __STACK_H

#ifndef __ARRAY_H
#include "array.h"
#endif

// @doc EXTERNAL

// @class TStack | Classe per la gestione dello stack a basso livello
//
// @base public | TObject
class TStack : public TObject

// @author:(INTERNAL) Alex

// @access:(INTERNAL) Private Member
{                
protected:  
  // @cmember:(INTERNAL) Dati dello stack
  TArray _data;
  
  // @cmember:(INTERNAL) Puntatore alla cima dello stack
  int _sp;

// @access Public Member
public:
  // @cmember Ritorna il puntatore allo stack
  int count() const 
  { return _sp; }
  // @cmember Aggiunge un oggetto sullo stack
  void push(const TObject& o);
  // @cmember Aggiunge un oggetto sullo stack
  void push(TObject* o);
  // @cmember Ritorna il primo oggetto sulla cima dello stack
  TObject& pop();       
  // @cmember Ritorna l'oggetto ad una data profondita' nello stack
  TObject& peek(int depth = 0) const;                         
  // @cmember Distrugge l'intero stack
  void destroy();
  // @cmember Distrugge l'oggetto alla base dello stack
  bool destroy_base();
  // @cmember Costruttore. Chiama il costruttore di <c TArray>
  TStack(int size = 16);
  // @cmember Costruttore. Chiama il costruttore di <c TArray>
  TStack(const TStack& stack);
  // @cmember Distruttore. Chiama il distruttore di <c TArray>
  virtual ~TStack() { }
};

#endif