#include <stdlib.h>
#include "array.h"

void initArray(Array *a, int initialSize)
{
	a->array = malloc(initialSize * sizeof(void *));
	a->used = 0;
	a->size = initialSize;
}

void insertArray(void *self, void *element)
{
  Array *a = self;
	if (a->used == a->size) {
		a->size *= 2;
		a->array = (void *)realloc(a->array, a->size * sizeof(void *));
	}
	a->array[a->used] = element;
  a->used++;
}

void appendArray(void *self, void *element)
{
  Array *a = self;
	if (a->used == a->size) {
		a->size *= 2;
		a->array = (void *)realloc(a->array, a->size * sizeof(void *));
	}
  for (size_t i = 0; i < a->used; ++i)
  {
    a->array[a->used - i] = a->array[a->used - (i + 1)];
  }
	a->array[0] = element;
  a->used++;
}

void* elementAtIndexOfArray(void *self, int index)
{
  Array *a = self;
  if (index > a->used - 1)
  {
    return NULL;
  }
  return a->array[index];
}

void* lastOfArray(void *self)
{
  Array *a = self;
  int index = a->used - 1;
  return a->array[index];
}

void* firstOfArray(void *self)
{
  Array *a = self;
  return a->array[0];
}

void freeArray(void *self)
{
  Array *a = self;
	a->used = 0;
}

void freeArrayAll(void *self)
{
  Array *a = self;
  for(size_t i = 0; i < a->used; ++i)
  {
    free(a->array[i]);
  }
	free(a->array);
	a->array = NULL;
	a->used = a->size = 0;
}

Array* newArray(int initialSize)
{
  Array *array = malloc(sizeof(Array));
  array->array = malloc(initialSize * sizeof(void *));
  array->used = 0;
  array->size = initialSize;
  array->last = lastOfArray;
  array->first = firstOfArray;
  array->append = appendArray;
  array->insert = insertArray;
  array->elementAtIndex = elementAtIndexOfArray;
  array->releaseOnlyArray = freeArray;
  array->releaseAll = freeArrayAll;
  
  return array;
}