#include "Array.h"

@implementation Array

- (id) init
{
	count = size = 0;
	incr = 16;
	array = NIL;
	return self;
}

- (id) initWithIncrement: (integer) inc
{
	count = 0;
	size = incr = inc;
	array = (void[][]) obj_malloc (inc * @sizeof (void []));
	return self;
}

- (void) free
{
	local integer i;
	for (i = 0; i < count; i++)
		obj_free (array[i]);
	obj_free (array);
}

- (void []) getItemAt: (integer) index
{
	if (index == -1)
		index = count - 1;
	if (index < 0 || index >= count)
		return NIL;
	return array[index];
}

- (void) setItemAt: (integer) index item: (void []) item
{
	if (index == -1)
		index = count - 1;
	if (index < 0 || index >= count)
		return;
	array[index] = item;
}

- (void) addItem: (void []) item
{
	if (count == size) {
		size += incr;
		array = (void[][])obj_realloc (array, size * @sizeof (void []));
	}
	array[count++] = item;
}

- (void []) removeItemAt: (integer) index
{
	local integer i;
	local void [] item;

	if (index == -1)
		index = count -1;
	if (index < 0 || index >= count)
		return NIL;
	item = array[index];
	count--;
	for (i = index; i < count; i++)
		array[i] = array[i + 1];
	return item;
}

- (void []) insertItemAt: (integer) index item:(void []) item
{
	local integer i;
	if (index == -1)
		index = count -1;
	if (index < 0 || index >= count)
		return NIL;
	if (count == size) {
		size += incr;
		array = (void[][])obj_realloc (array, size * @sizeof (void []));
	}
	for (i = count; i > index; i--)
		array[i] = array[i - 1];
	array[index] = item;
	count++;
	return item;
}

@end