2 * Dynamically Resized Array
4 * Authors: Alfredo K. Kojima <kojima@windowmaker.org>
5 * Dan Pascu <dan@windowmaker.org>
7 * This code is released to the Public Domain, but
8 * proper credit is always appreciated :)
18 #define INITIAL_SIZE 8
19 #define RESIZE_INCREMENT 8
23 void **items
; /* the array data */
24 unsigned int length
; /* # of items in array */
25 unsigned int allocSize
; /* allocated size of array */
26 void (*destructor
)(void *item
); /* the destructor to free elements */
31 WMCreateArray(unsigned initialSize
)
33 WMCreateArrayWithDestructor(initialSize
, NULL
);
38 WMCreateArrayWithDestructor(unsigned initialSize
, void (*destructor
)(void*))
42 array
= wmalloc(sizeof(WMArray
));
44 if (initialSize
== 0) {
45 initialSize
= INITIAL_SIZE
;
48 array
->items
= wmalloc(sizeof(void*) * initialSize
);
51 array
->allocSize
= initialSize
;
52 array
->destructor
= destructor
;
59 WMEmptyArray(WMArray
*array
)
61 if (array
->destructor
) {
62 while (array
->length
-- > 0) {
63 array
->destructor(array
->items
[array
->length
]);
66 /*memset(array->items, 0, array->length * sizeof(void*));*/
72 WMFreeArray(WMArray
*array
)
81 WMReplaceInArray(WMArray
*array
, unsigned int index
, void *data
)
85 wassertrv(index
> array
->length
, 0);
87 if (index
== array
->length
) {
88 WMArrayAppend(array
, data
);
92 old
= array
->items
[index
];
93 array
->items
[index
] = data
;
100 WMGetArrayElement(WMArray
*array
, unsigned int index
)
102 if (index
>= array
->length
)
105 return array
->items
[index
];
111 WMAppendToArray(WMArray
*array
, void *data
)
113 if (array
->length
>= array
->allocSize
) {
114 array
->allocSize
+= RESIZE_INCREMENT
;
115 array
->items
= wrealloc(array
->items
, sizeof(void*)*array
->allocSize
);
117 array
->items
[array
->length
++] = data
;
125 WMInsertInArray(WMArray
*array
, unsigned index
, void *data
)
127 wassertrv(index
<= array
->length
, 0);
129 if (array
->length
>= array
->allocSize
) {
130 array
->allocSize
+= RESIZE_INCREMENT
;
131 array
->items
= wrealloc(array
->items
, sizeof(void*)*array
->allocSize
);
133 if (index
< array
->length
)
134 memmove(array
->items
+index
+1, array
->items
+index
,
135 sizeof(void*)*(array
->length
-index
));
136 array
->items
[index
] = data
;
145 WMAppendToArray(WMArray
*array
, void *data
)
147 return WMInsertInArray(array
, array
->length
, data
);
152 removeFromArray(WMArray
*array
, unsigned index
)
154 /*wassertr(index < array->length);*/
156 memmove(array
->items
+index
, array
->items
+index
+1,
157 sizeof(void*)*(array
->length
-index
-1));
164 WMDeleteFromArray(WMArray
*array
, unsigned index
)
166 wassertr(index
< array
->length
);
168 if (array
->destructor
) {
169 array
->destructor(array
->items
[index
]);
172 removeFromArray(array
, index
);
177 WMArrayPop(WMArray
*array
)
179 void *last
= array
->items
[length
-1];
181 removeFromArray(array
, array
->length
-1);
188 WMIndexForArrayElement(WMArray
*array
, void *data
)
192 for (i
= 0; i
< array
->length
; i
++)
193 if (array
->items
[i
] == data
)