#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// TODO: Handle error warnings?
// TODO: Implement more useful functions?

typedef struct {
	char   * data;
	size_t   element_size;
	size_t   element_count;
} vector_t;

extern void vector_init(vector_t * vector,
                        size_t     element_size,
                        size_t     element_count);

extern void vector_push(vector_t * vector,
                        void     * data);

extern void vector_pop(vector_t * vector);

extern void * vector_get(vector_t * vector,
                         size_t     element);

extern void vector_set(vector_t * vector,
                       void     * data,
                       size_t     element);

extern void vector_free(vector_t * vector);

extern void example_print(example_t * example);

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(vector_t * vector,
                  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);
}