// Pila de enteros sobre un arreglo de capacidad fija. Pasos 1, 3 y 4 del laboratorio.
#ifndef INT_STACK_H
#define INT_STACK_H

#include <cstddef>

// Invariantes:
//   1. size_ <= capacity_.
//   2. data_ == nullptr si y solo si capacity_ == 0.
//   3. Los elementos están en data_[0], ..., data_[size_ - 1]. El tope es data_[size_ - 1].
class IntStack {
public:
    // Paso 1. Reserva con new[] espacio para capacity enteros. La pila empieza vacía.
    explicit IntStack(std::size_t capacity);
    ~IntStack();

    // Paso 3: declaren aquí el constructor de copia y la asignación de copia.

    // Paso 4: declaren aquí el constructor y la asignación de movimiento, con noexcept.
    // Una pila desde la que se movió queda vacía y con capacidad 0.

    // Paso 1. Las operaciones.
    void push(int value);  // Requiere !full().
    void pop();            // Requiere !empty().
    int top() const;       // Requiere !empty().
    bool empty() const;
    bool full() const;
    std::size_t size() const;
    std::size_t capacity() const;

private:
    int* data_ = nullptr;
    std::size_t capacity_ = 0;
    std::size_t size_ = 0;
};

#endif
