// Un arreglo de enteros que crece con realloc.
#ifndef INT_ARRAY_H
#define INT_ARRAY_H

#include <stddef.h>

// items apunta a capacity enteros, de los que solo count tienen datos.
// Si capacity es 0, items puede ser NULL.
struct int_array {
    int *items;
    size_t count;
    size_t capacity;
};

// Devuelve un arreglo nuevo y vacío, o NULL si no hay memoria.
// Quien llama es su owner, y debe liberarlo con int_array_free.
struct int_array *int_array_new(void);

// Agrega value al final, y devuelve 1 si pudo. Cuando no hay lugar, la capacidad se duplica,
// salvo si era 0: entonces pasa a 4.
// Si no hay memoria, devuelve 0 y el arreglo queda como estaba, con todos sus datos.
int int_array_push(struct int_array *array, int value);

// Libera el arreglo y sus elementos. Con NULL no hace nada.
void int_array_free(struct int_array *array);

// Lee un archivo de texto con un entero por línea, de cualquier largo. Un archivo vacío da
// un arreglo vacío. Devuelve NULL si no se puede abrir, si una línea no tiene exactamente un
// entero o si no hay memoria. Quien llama es owner del resultado.
struct int_array *int_array_read_file(const char *name);

#endif
