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