//
//  CDynamicArray.m
//  iDevelop
//
//  Created by Ben Reeves on 02/12/2009.
//  Copyright 2009 __MyCompanyName__. All rights reserved.
//

#include "CArray.h"

#define CArrayElementSize sizeof(void*)


inline CArray * CArrayInit(unsigned int capacity)
{
	CArray * array = (CArray*)malloc(sizeof(CArray));
	array->count = 0;
	array->data = NULL;
	CArraySetCapacity(array, capacity);
	
	return array;
}

inline CArray * CArrayCopy(CArray* array)
{
	CArray * newArray = CArrayInit(CArrayCount(array));
	memcpy(newArray->data, array->data, CArrayCount(array)*CArrayElementSize);
	newArray->count = array->count;
	
	return newArray;
}

inline void CArrayCompact(CArray* array)
{
	array->capacity = array->count;

	CArraySetCapacity(array, CArrayCount(array));
}

inline void CArraySetCapacity(CArray * array, unsigned int capacity)
{
	array->capacity = capacity;
	array->data = realloc(array->data, capacity*CArrayElementSize);
	array->count = array->count > capacity ? capacity : array->count;

}

inline unsigned int CArrayCount(CArray * array)
{
	return array->count;
}

inline void CArrayAdd(CArray* array, void * element)
{
	++array->count;
	
	if (array->count > array->capacity)
	{
		array->data = realloc(array->data, array->count*CArrayElementSize);
	}
	
	array->data[array->count-1] = element;
}

inline void CArrayRemoveObjectAtIndex(CArray* array, unsigned int index)
{
	
	//Out of bounds
	if (index >= array->count)
	{
		#ifdef DEBUG
				printf("CArrayRemoveObjectAtIndex out of bounds\n");
		#endif
		
		return;
	}
	
	//Decrease the size by one
	--array->count;

	//Shift block to the left
	memmove(array->data+index, array->data+(index+1), (array->count-index)*CArrayElementSize);
}

inline void CArrayRemove(CArray* array, void * element)
{
	for (int ii = 0; ii < array->count; ++ii)
	{
		if (array->data[ii] == element)
		{
			CArrayRemoveObjectAtIndex(array, ii);
			break;
		}
	}
}

inline void CArrayEmpty(CArray* array)
{
	array->count = 0;
}

inline void CArrayDestroy(CArray * array)
{
	if (array)
	{
		free(array->data);
		free(array);
	}
}
