/* vector.c
 * Copyright 2023 Anon Anonson, Ognjen 'xolatile' Milan Robovic, Emil Williams
 * SPDX Identifier: GPL-3.0-only / NO WARRANTY / NO GUARANTEE */

#include "vector.h"

void vector_init(vector_t * vector,
                 size_t     element_size,
                 size_t     element_count) {
	vector->data          = NULL;
	vector->element_size  = element_size;
	vector->element_count = element_count;

	vector->data = malloc(vector->element_size * vector->element_count);

	if ((! vector->data) && (vector->element_count)) {
		puts("vector_init");
		exit(EXIT_FAILURE);
	}

	memset(vector->data,
	       0,
	       vector->element_size * vector->element_count);
}

void vector_push(vector_t * vector,
                 void     * data) {
	++vector->element_count;

	vector->data = realloc(vector->data,
	                       vector->element_size * vector->element_count);

	if (! vector->data) {
		puts("vector_push");
		exit(EXIT_FAILURE);
	}

	memcpy(&vector->data[(vector->element_count - 1) * vector->element_size],
	       data,
	       vector->element_size);
}

void vector_pop(vector_t * vector) {
	(void) vector;
}

void * vector_get(const vector_t * const vector,
                  const size_t           element) {
	if (element >= vector->element_count) {
		puts("vector_get");
		exit(EXIT_FAILURE);
	}

	return &vector->data[vector->element_size * element];
}

void vector_set(vector_t * vector,
                void     * data,
                size_t     element) {
	if (element >= vector->element_count) {
		puts("vector_set");
		exit(EXIT_FAILURE);
	}

	memcpy(&vector->data[vector->element_size * element],
	       data,
	       vector->element_size);
}

void vector_free(vector_t * vector) {
	free(vector->data);
}