diff 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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/trunk/chipmunkd/cpArray.d	Thu Dec 02 02:11:26 2010 +0100
@@ -0,0 +1,133 @@
+
+// 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;
+}