view trunk/chipmunkd/cpArray.d @ 4:7ebbd4d05553

initial commit
author Extrawurst
date Thu, 02 Dec 2010 02:11:26 +0100
parents
children df4ebc8add66
line wrap: on
line source


// written in the D programming language

module chipmunkd.cpArray;

import chipmunkd.chipmunk;
import chipmunkd.chipmunk_types_h;

import core.stdc.string:memcpy;

struct cpArray{
	int num, max;
	void **arr;
}

alias void function(void *ptr, void *data) cpArrayIter;

//#define CP_ARRAY_INCREMENT 10

// NOTE: cpArray is rarely used and will probably go away.

cpArray*
cpArrayAlloc()
{
	return cast(cpArray *)cpcalloc(1, cpArray.sizeof);
}

cpArray*
cpArrayInit(cpArray *arr, int size)
{
	arr.num = 0;
	
	size = (size ? size : 4);
	arr.max = size;
	arr.arr = cast(void **)cpmalloc(size*(void**).sizeof);
	
	return arr;
}

cpArray*
cpArrayNew(int size)
{
	return cpArrayInit(cpArrayAlloc(), size);
}

void
cpArrayDestroy(cpArray *arr)
{
	cpfree(arr.arr);
	arr.arr = null;
}

void
cpArrayFree(cpArray *arr)
{
	if(arr){
		cpArrayDestroy(arr);
		cpfree(arr);
	}
}

void
cpArrayPush(cpArray *arr, void *object)
{
	if(arr.num == arr.max){
		arr.max *= 2;
		arr.arr = cast(void **)cprealloc(arr.arr, arr.max*(void**).sizeof);
	}
	
	arr.arr[arr.num] = object;
	arr.num++;
}

void *
cpArrayPop(cpArray *arr)
{
	arr.num--;
	
	void *value = arr.arr[arr.num];
	arr.arr[arr.num] = null;
	
	return value;
}

void
cpArrayDeleteIndex(cpArray *arr, int idx)
{
	arr.num--;
	
	arr.arr[idx] = arr.arr[arr.num];
	arr.arr[arr.num] = null;
}

void
cpArrayDeleteObj(cpArray *arr, void *obj)
{
	for(int i=0; i<arr.num; i++){
		if(arr.arr[i] == obj){
			cpArrayDeleteIndex(arr, i);
			return;
		}
	}
}

void
cpArrayAppend(cpArray *arr, cpArray *other)
{
	void *tail = &arr.arr[arr.num];
	
	arr.num += other.num;
	if(arr.num >= arr.max){
		arr.max = arr.num;
		arr.arr = cast(void **)cprealloc(arr.arr, arr.max*(void**).sizeof);
	}
	
	memcpy(tail, other.arr, other.num*(void**).sizeof);
}

void
cpArrayEach(cpArray *arr, cpArrayIter iterFunc, void *data)
{
	for(int i=0; i<arr.num; i++)
		iterFunc(arr.arr[i], data);
}

cpBool
cpArrayContains(cpArray *arr, void *ptr)
{
	for(int i=0; i<arr.num; i++)
		if(arr.arr[i] == ptr) return cpTrue;
	
	return cpFalse;
}