#include <cassert>

inline PilhaInt::PilhaInt() 
    : capacidade(capacidade_inicial), itens(new Item[capacidade]),
      numero_de_itens(0) { 

    assert(cumpreInvariante());
}

inline PilhaInt::~PilhaInt() { 
    assert(cumpreInvariante());

    delete[] itens; 
}

inline int PilhaInt::altura() const { 
    assert(cumpreInvariante());

    return numero_de_itens; 
}

inline bool PilhaInt::estaVazia() const { 
    assert(cumpreInvariante());

    return altura() == 0; 
}

inline bool PilhaInt::estaCheia() const { 
    assert(cumpreInvariante());

    return altura() == capacidade; 
}

inline PilhaInt::Item const& PilhaInt::topo() const { 
    assert(cumpreInvariante());
    assert(not estaVazia());
    
    return itens[numero_de_itens - 1]; 
}

inline PilhaInt::Item& PilhaInt::topo() { 
    assert(cumpreInvariante());
    assert(not estaVazia());
    
    return itens[numero_de_itens - 1]; 
}

inline void PilhaInt::tira() { 
    assert(cumpreInvariante());
    assert(not estaVazia());
    
    --numero_de_itens; 
    assert(cumpreInvariante());
}

inline bool PilhaInt::cumpreInvariante() const {
    return 0 <= numero_de_itens and numero_de_itens <= capacidade and 
	0 < capacidade;
}

inline PilhaInt::MemoriaEsgotada::MemoriaEsgotada(int dimensao_pretentida)
    : dimensao_pretendida(dimensao_pretendida) {
}

int PilhaInt::MemoriaEsgotada::dimensaoPretendida() {
    return dimensao_pretendida;
}