Mercurial > projects > chipmunkd
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; +}