// Arreglo de enteros de tamaño fijo, owner de su memoria.
#ifndef INT_BUFFER_H
#define INT_BUFFER_H

#include <cstddef>

// Invariantes:
//   1. data_ == nullptr si y solo si size_ == 0.
//   2. Si size_ > 0, data_ apunta a un bloque de size_ enteros, y este objeto es su único owner.
class IntBuffer {
public:
    explicit IntBuffer(std::size_t size);
    ~IntBuffer();
    IntBuffer(const IntBuffer& other);
    IntBuffer& operator=(const IntBuffer& other);
    IntBuffer(IntBuffer&& other) noexcept;
    IntBuffer& operator=(IntBuffer&& other) noexcept;

    std::size_t size() const;
    int& at(std::size_t index);
    int at(std::size_t index) const;
    void swap(IntBuffer& other) noexcept;
    void check_invariants() const;

private:
    int* data_;
    std::size_t size_;
};

#endif
