Mercurial > projects > chipmunkd
comparison trunk/chipmunkd/cpArray.d @ 4:7ebbd4d05553
initial commit
author | Extrawurst |
---|---|
date | Thu, 02 Dec 2010 02:11:26 +0100 |
parents | |
children | df4ebc8add66 |
comparison
equal
deleted
inserted
replaced
3:81145a61c2fe | 4:7ebbd4d05553 |
---|---|
1 | |
2 // written in the D programming language | |
3 | |
4 module chipmunkd.cpArray; | |
5 | |
6 import chipmunkd.chipmunk; | |
7 import chipmunkd.chipmunk_types_h; | |
8 | |
9 import core.stdc.string:memcpy; | |
10 | |
11 struct cpArray{ | |
12 int num, max; | |
13 void **arr; | |
14 } | |
15 | |
16 alias void function(void *ptr, void *data) cpArrayIter; | |
17 | |
18 //#define CP_ARRAY_INCREMENT 10 | |
19 | |
20 // NOTE: cpArray is rarely used and will probably go away. | |
21 | |
22 cpArray* | |
23 cpArrayAlloc() | |
24 { | |
25 return cast(cpArray *)cpcalloc(1, cpArray.sizeof); | |
26 } | |
27 | |
28 cpArray* | |
29 cpArrayInit(cpArray *arr, int size) | |
30 { | |
31 arr.num = 0; | |
32 | |
33 size = (size ? size : 4); | |
34 arr.max = size; | |
35 arr.arr = cast(void **)cpmalloc(size*(void**).sizeof); | |
36 | |
37 return arr; | |
38 } | |
39 | |
40 cpArray* | |
41 cpArrayNew(int size) | |
42 { | |
43 return cpArrayInit(cpArrayAlloc(), size); | |
44 } | |
45 | |
46 void | |
47 cpArrayDestroy(cpArray *arr) | |
48 { | |
49 cpfree(arr.arr); | |
50 arr.arr = null; | |
51 } | |
52 | |
53 void | |
54 cpArrayFree(cpArray *arr) | |
55 { | |
56 if(arr){ | |
57 cpArrayDestroy(arr); | |
58 cpfree(arr); | |
59 } | |
60 } | |
61 | |
62 void | |
63 cpArrayPush(cpArray *arr, void *object) | |
64 { | |
65 if(arr.num == arr.max){ | |
66 arr.max *= 2; | |
67 arr.arr = cast(void **)cprealloc(arr.arr, arr.max*(void**).sizeof); | |
68 } | |
69 | |
70 arr.arr[arr.num] = object; | |
71 arr.num++; | |
72 } | |
73 | |
74 void * | |
75 cpArrayPop(cpArray *arr) | |
76 { | |
77 arr.num--; | |
78 | |
79 void *value = arr.arr[arr.num]; | |
80 arr.arr[arr.num] = null; | |
81 | |
82 return value; | |
83 } | |
84 | |
85 void | |
86 cpArrayDeleteIndex(cpArray *arr, int idx) | |
87 { | |
88 arr.num--; | |
89 | |
90 arr.arr[idx] = arr.arr[arr.num]; | |
91 arr.arr[arr.num] = null; | |
92 } | |
93 | |
94 void | |
95 cpArrayDeleteObj(cpArray *arr, void *obj) | |
96 { | |
97 for(int i=0; i<arr.num; i++){ | |
98 if(arr.arr[i] == obj){ | |
99 cpArrayDeleteIndex(arr, i); | |
100 return; | |
101 } | |
102 } | |
103 } | |
104 | |
105 void | |
106 cpArrayAppend(cpArray *arr, cpArray *other) | |
107 { | |
108 void *tail = &arr.arr[arr.num]; | |
109 | |
110 arr.num += other.num; | |
111 if(arr.num >= arr.max){ | |
112 arr.max = arr.num; | |
113 arr.arr = cast(void **)cprealloc(arr.arr, arr.max*(void**).sizeof); | |
114 } | |
115 | |
116 memcpy(tail, other.arr, other.num*(void**).sizeof); | |
117 } | |
118 | |
119 void | |
120 cpArrayEach(cpArray *arr, cpArrayIter iterFunc, void *data) | |
121 { | |
122 for(int i=0; i<arr.num; i++) | |
123 iterFunc(arr.arr[i], data); | |
124 } | |
125 | |
126 cpBool | |
127 cpArrayContains(cpArray *arr, void *ptr) | |
128 { | |
129 for(int i=0; i<arr.num; i++) | |
130 if(arr.arr[i] == ptr) return cpTrue; | |
131 | |
132 return cpFalse; | |
133 } |